多层选择过滤器在分层导航


Multi select filter in layered navigation

我有一个自定义的多选择属性,我想参与产品的过滤。该属性被设置为在分层导航中使用,但不会出现在可用过滤器列表中。可能是由于自定义模型实现吗?谁有什么建议来检查为什么它没有出现?属性为多个产品设置使用的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()中的检查,所以如果不重写属性模型,文本将无法工作。

is_filterable和/或is_filterable_in_search属性属性是否设置?
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;
    }