分层导航中的多选滤镜

Zif*_*ius 9 php magento multi-select layered-navigation

我有一个自定义多选属性,我想参与过滤产品.该属性设置为在分层导航中使用,但不会出现在可用过滤器列表中.可能是由于自定义模型实现?任何人都有一些提示,在哪里检查它为什么不出现?为几个产品设置属性Magento版本使用的是EE 1.11

谢谢

Zif*_*ius 14

对于那些将来会遇到这种情况的人:问题出现Mage_Catalog_Model_Resource_Product_Indexer_Eav_Source在第191行的文件中.默认情况下,将从中拉出多选属性值eav_attribute_option,如果您的自定义属性使用自定义源模型,则不会对该属性建立索引.

我还不知道它是否有意,但我找不到更好的解决方案,而不是在local拉动中覆盖该模型并在$options数组中添加所需的值.

希望有一天能帮助某人

  • @pspahn是的,请看这个要点:https://gist.github.com/52856ac5ebe016a9caa9我还不确定这是否缺乏索引器知识或错误.你也可以在我的GH上找到模块的其余部分.小心使用! (2认同)

Vin*_*nai 13

什么是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,作为这些方法应该返回的参考.


Enr*_*que 9

注意:我在新答案中添加此内容以使用代码格式.

如何说,问题在于使用自定义源模型的多选属性.

解决方案:重写课程

Mage_Catalog_Model_Resource_Product_Indexer_Eav_Source
Run Code Online (Sandbox Code Playgroud)

覆盖方法:

_prepareMultiselectIndex
Run Code Online (Sandbox Code Playgroud)

在$ options数组填充默认代码后添加此代码(检查原始文件中的第200行)

foreach($attrIds as $attId){
            if( ! isset($options[$attId])){
                $options[$attId] = $this->_getOptionsFromSourceModel($attId);
            }
        }
Run Code Online (Sandbox Code Playgroud)

也添加此方法:

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;
    }
Run Code Online (Sandbox Code Playgroud)

我无法找到一种不那么具有侵入性的方法来解决这个问题.