【问题标题】:Multi select filter in layered navigation分层导航中的多选过滤器
【发布时间】:2011-11-27 16:29:53
【问题描述】:

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

谢谢

【问题讨论】:

  • 明白了Mage_Catalog_Model_Layer_Filter_Attribute方法getCount不会返回属于多选属性的产品
  • 更多细节,该方法不返回 optionId => productCount 对多选属性。以下是生成的相关 SQL:pastebin.com/JJnnXHKG
  • 我的自定义属性可能没有将数据正确保存到catalog_product_index_eav 表中,因为没有与属性 ID 关联的条目
  • 可能是因为我对属性使用了平面集合
  • 您是否曾经为您的自定义源模型正确索引以进行分层导航?我检查了你的 GH,但我认为我没有看到该模块。

标签: php magento multi-select layered-navigation


【解决方案1】:

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

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

希望有一天这对某人有所帮助

【讨论】:

  • 哇。我花了很长时间才找到这篇文章,现在我觉得这并不一定是我的模块有问题,而是实际上是一个 Magento 错误,这让我感到有点欣慰。
  • 您是否有为完成这项工作而添加到核心文件的示例?
  • @pspahn 是的,看到这个要点:gist.github.com/52856ac5ebe016a9caa9 我还不确定是我缺乏索引器知识还是错误。您还可以在我的 GH 找到该模块的其余部分。小心使用!
【解决方案2】:

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

【讨论】:

  • 谢谢,发现很多错误。事实上,我的属性使用text 类型作为其后端。如果我直接在eav_attribute 表中将其更改为varchar,它应该可以工作,无需通过设置脚本重新创建,对吧?设置了is_filtrable,现在也设置了is_filterable_in_search。现在的主要问题是,我是扩展Mage_Eav_Model_Entity_Attribute_Source_Table 还是Mage_Eav_Model_Entity_Attribute_Source_Abstract?非常感谢您的洞察力
  • 顺便说一下isIndexable 方法还检查is_visible_in_advanced_search 标志是否为真
  • 仍然无法正常工作。我的问题在于Mage_Catalog_Model_Resource_Layer_Filter_Attribute getCount 方法。除非我遗漏了什么,否则它似乎不适用于多选。也许我需要覆盖它
  • 如果你不使用属性选项表,我建议扩展 Mage_Eav_Model_Entity_Attribute_Source_Abstract。 is_visible_in_advanced_search 仅与 is_filterable 和 is_filterable_in_search 一起检查(如果不需要其他的,只需设置一个就足够了)。
  • Mage_Catalog_Model_Resource_Layer_Filter_Attribute::getCount() 如果索引器正确拾取属性应该可以工作。您可以直接更改 eav_attribute 中的 backend_type,但请务必从 catalog_product_entity_text 中删除过时的条目(并修复设置脚本)。
【解决方案3】:

注意:我将此添加到使用代码格式的新答案中。

怎么说呢,问题在于使用自定义源模型的 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;
    }

我找不到干扰性较小的方法来解决此问题。

【讨论】:

  • 请注意,我认为它不适用于使用value 的后端模型,它不是整数,例如。 Mage_Catalog_Model_Product_Attribute_Source_Countryofmanufacture
  • @WojtekNaruniec 为什么?字符串也可以用作数组键。
  • @fschmengler 是的,他们可以,这部分代码可能有效。由于catalog_product_index_eav_idx 索引表中的“value”列是整数,因此几行之后可能会出现问题。
  • 啊,没注意到那部分,谢谢澄清!
  • 你能从 config.xml 发布成功覆盖 Mage_Catalog_Model_Resource_Product_Indexer_Eav_Source 类的 sn-p 吗?
猜你喜欢
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多