我有一个自定义多选属性,我想参与过滤产品。该属性设置为在分层导航中使用,但不会出现在可用过滤器列表中。可能是由于自定义模型实现? 任何人都有一些提示,在哪里检查它为什么不出现?为多个产品设置了属性 使用的Magento版本是EE 1.11
由于
答案 0 :(得分:14)
对于那些将来会遇到这种情况的人:问题出在第191行的Mage_Catalog_Model_Resource_Product_Indexer_Eav_Source
文件中。默认情况下,从eav_attribute_option
提取多选属性值,如果您的自定义属性使用自定义源模型该属性不会被索引。
我还不知道它是否有意,但我找不到更好的解决方案,而不是在local
拉动并在$options
数组中添加所需的值来覆盖该模型。
希望有一天能帮到某人
答案 1 :(得分:12)
什么是 backend_type 。即存储在catalog_product_entity_varchar或catalog_product_entity_text表中的值是什么?
backend_type必须匹配Mage_Catalog_Model_Resource_Eav_Attribute :: isIndexable()中的检查,因此如果不重写属性模型,文本将无法工作。
是否设置了 is_filterable 和/或 is_filterable_in_search 属性属性?
Mage_Catalog_Model_Product_Indexer_Eav :: _ registerCatalogAttributeSaveEvent()在更新分层导航的索引时检查它们。
自定义源模型中实现的方法 getFlatColums(), getFlatIndexes()和 getFlatUpdateSelect() >?
实际上,这只是构建和更新平面目录产品表所必需的(因此需要设置used_in_product_listing或is_filterable属性,以便Magento获取属性)。
检查类Mage_Eav_Model_Entity_Attribute_Source_Table,作为这些方法应该返回的参考。
答案 2 :(得分:9)
注意:我在新答案中添加此内容以使用代码格式。
如何说,问题在于使用自定义源模型的 multiselect 属性。
解决方案: 重写班级
Mage_Catalog_Model_Resource_Product_Indexer_Eav_Source
覆盖方法:
_prepareMultiselectIndex
在$ options数组填充默认代码(在原始文件中检查第200行)之后添加此代码
foreach($attrIds as $attId){
if( ! isset($options[$attId])){
$options[$attId] = $this->_getOptionsFromSourceModel($attId);
}
}
也添加此方法:
protected function _getOptionsFromSourceModel($attId)
{
$options = array();
/** @var Mage_Eav_Model_Entity_Attribute_Abstract $attribute */
$attribute = Mage::getResourceSingleton('catalog/product')->getAttribute($attId);
/** @var Mage_Eav_Model_Entity_Attribute_Source_Abstract $source */
$source = $attribute->getSource();
$sourceOptions = $source->getAllOptions();
if($sourceOptions){
foreach($sourceOptions as $sourceOption){
if(isset($sourceOption['value'])){
$options[$sourceOption['value']] = true;
}
}
}
return $options;
}
我无法找到一种不那么具有侵入性的方法来解决这个问题。