10

製品のフィルタリングに参加したいカスタムの複数選択属性があります。属性はレイヤード ナビゲーションで使用されるように設定されていますが、使用可能なフィルターのリストには表示されません。カスタムモデルの実装が原因でしょうか? 表示されない理由を確認するヒントはありますか? 複数の製品に属性が設定されています 使用される Magento のバージョンは EE 1.11 です

ありがとう

4

3 に答える 3

14

将来これに苦戦する人のために: 問題はMage_Catalog_Model_Resource_Product_Indexer_Eav_Sourceファイルの 191 行目にあります。デフォルトでは、複数選択属性値がプルされeav_attribute_option、カスタム属性がカスタム ソース モデルを使用する場合、属性はインデックス化されません。

意図したものかどうかはまだわかりませんが、localプルでそのモデルをオーバーライドし、必要な値を$options配列に追加するよりも良い解決策を見つけることができませんでした。

これがいつか誰かの役に立てば幸いです

于 2011-10-04T17:39:36.567 に答える
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()はカスタム ソース モデルに実装されていますか?
これは実際には、フラット カタログ製品テーブルを構築および更新する場合にのみ必要です (したがって、Magento が属性を取得するには、used_in_product_listing または is_filterable プロパティを設定する必要があります)。
クラス Mage_Eav_Model_Entity_Attribute_Source_Table を参照して、これらのメソッドが何を返すかを確認してください。

于 2011-10-03T10:00:53.603 に答える
9

注:コード形式を使用するために、これを新しい回答に追加しています。

どのように言われたかというと、問題はカスタム ソース モデルを使用した複数選択属性にあります

解決策: クラスを書き直します

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;
    }

これを修正するための邪魔にならない方法が見つかりませんでした。

于 2014-07-17T18:12:40.830 に答える