Фильтр множественного выбора в многоуровневой навигации - PullRequest
9 голосов
/ 29 сентября 2011

У меня есть собственный атрибут множественного выбора, который я хотел бы принять участие в фильтрации продуктов.Атрибут установлен так, как он используется в многоуровневой навигации, но не отображается в списке доступных фильтров.Может быть из-за реализации пользовательской модели?У кого-нибудь есть несколько советов, где проверить, почему он не появляется?Атрибут установлен для нескольких продуктов. Используется версия Magento EE 1.11

Спасибо

Ответы [ 3 ]

14 голосов
/ 04 октября 2011

Для тех, кто будет бороться с этим в будущем: проблема в файле Mage_Catalog_Model_Resource_Product_Indexer_Eav_Source в строке 191. По умолчанию значения атрибутов множественного выбора извлекаются из eav_attribute_option, и если ваш пользовательский атрибут использует пользовательскую модель источника, атрибутне будет проиндексирован.

Пока не знаю, предназначено ли оно, но я не смог найти лучшего решения, чем переопределение этой модели в local pull и добавление необходимых значений в массив $options.

Надеюсь, это кому-нибудь поможет, когда-нибудь

12 голосов
/ 03 октября 2011

Что такое 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 как ссылку на то, что эти методы должны возвращать.

9 голосов
/ 17 июля 2014

ПРИМЕЧАНИЕ. Я добавляю это в новом ответе, чтобы использовать формат кода.

Как было сказано, проблема в 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;
    }

Я не мог найти менее навязчивый способ исправить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...