我有一个自定义的多选择属性,我想参与产品的过滤。该属性被设置为在分层导航中使用,但不会出现在可用过滤器列表中。可能是由于自定义模型实现吗?谁有什么建议来检查为什么它没有出现?属性为多个产品设置使用的Magento版本是EE 1.11
谢谢
对于那些将来会为此而挣扎的人:问题在Mage_Catalog_Model_Resource_Product_Indexer_Eav_Source
文件的第191行。默认情况下,多选择属性值是从eav_attribute_option
中提取的,如果您的自定义属性使用自定义源模型,则该属性将不会被索引。
我不知道如果它是有意的,但我找不到一个更好的解决方案,而不是在local
拉覆盖该模型并在$options
数组中添加所需的值。
希望这对某个人有帮助
什么是backend_type。即值存储在catalog_product_entity_varchar或catalog_product_entity_text表?
backend_type必须匹配Mage_Catalog_Model_Resource_Eav_Attribute::isIndexable()中的检查,所以如果不重写属性模型,文本将无法工作。
Mage_Catalog_Model_Product_Indexer_Eav::_registerCatalogAttributeSaveEvent()在更新分层导航的索引时检查这些。
方法 getflatcolumns (), getFlatIndexes()和getFlatUpdateSelect()在自定义源模型中实现吗?
这实际上只需要构建和更新平面目录产品表(因此需要设置used_in_product_listing或is_filterable属性,以便Magento拾取该属性)。
查看类Mage_Eav_Model_Entity_Attribute_Source_Table作为参考,了解这些方法应该返回什么。
注意:我在使用代码格式的新答案中添加了这个。
问题在于使用自定义源模型选择属性。
解决方案:重写类
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;
}