Magento的自定义属性非常方便,我们可以根据不同的产品类别建立不同的产品属性,并应用到不同的Attribute Set中去。Magento开发者一般都知道addAttributeToFilter()方法是Product Collection的专用方法,类似与普通EAV模型中的addFieldToFilter()方法。该方法用于根据不同的字段条件筛选相应的产品。
一般情况下,对于Magento中的部分内置产品属性,通过addAttributeToFilter()进行过滤没有任何问题,都能正确返回符合条件的产品。但是对于用户新建的某些产品自定义属性,通过addAttributeToFilter()方法,有时却无法获取到需要的产品数据。collection中的count()方法用作调试也非常不错。如下代码所示,最近的一个项目,l_house_number为自定义的产品属性,通过该条件筛选并通过count()方法获取返回的产品数量,可是无论如何调试,返回的数据全部是0条。这个让我十分郁闷。
$uBuildCollection = Mage::getResourceModel('catalog/product_collection')
->addAttributeToFilter('l_house_number', $_product->getData('l_house_number'));
$uBuildCount = $uBuildCollection->count();
调试过程中,讲sql语句打印出来之后,发现该方法在获取数据时,调用的是flat表,进入数据库一看,flat表中并没有包含该字段。无法获取数据也就在正常不过了。那么现在问题很清晰了,如果将自定义的属性l_house_number添加到flat表中呢?
在创建属性的时候,除了属性的code,类型,值之外,还包含一些可见性的设置。之前在读源代码的时候实际上就已经碰到了这些相关的片段,只不过当时不知道是个什么情况。现在结合真实情况一看,确实值得好好研究一下。在后台创建属性的选项中,包含Used in Product Listing这个选项。我们将其选择为Yes。然后重置product flat表。即可解决如上问题。本文作为一个开头,等大概研究透这片之后,会做更深入的讲解。
(责任编辑:最模板) |