バンドル製品のバンドルアイテムの属性もバンドル製品自体に保存されるのはなぜですか?(データベースごと)


8

最近、カテゴリページのレイヤードナビゲーションフィルターのオプションがどのように決定および取得されるかを調査していました。私はモデルとデータベースを少し掘り下げましたが、次のメカニズムがわかりません。

状況:たとえばcolor、(attribute_id = 133) という名前の属性、単純な製品A(entity_id = 26)、およびバンドルされた製品B(entity_id = 27)があり、そのバンドルアイテムとしてにA追加さBMagento ver. 1.9.0.1ます。

ステップ1: color両方のために設定されていませんAし、B

ここに画像の説明を入力してください

ステップ2: colorBlack(value_id = 19)として設定されますB

ここに画像の説明を入力してください

ステップ3:次のよう colorに設定されますWhite(value_id = 18)A

ここに画像の説明を入力してください

手順3から、バンドルアイテム(Aこの場合)の属性が、バンドル製品(Bこの場合)自体の属性であるかのように保存されていることがわかります。これが、バンドル製品のバンドルアイテムの属性がレイヤードナビゲーションフィルターにも表示される理由です。

なぜこのように設計されているのですか?なぜシステムは子製品の属性も親製品に保存するのですか?システムの特定のプロセスでどのように役立ちますか?

前もって感謝します。

回答:


2

構成可能な製品でも同じです。

白い靴を探していて、構成可能な製品がこの問題を解決する場合、製品が提供されます。こんなに簡単だと思います。したがって、検索した製品がバンドル製品の一部である場合、この製品も提供されます。


お返事をありがとうございます。私はあなたの要点を理解していますが、なぜこの方法でそれを達成しなければならないのか知りたいのですが?なぜなら、誰かが子商品の属性を親商品と結び付けたくない場合(または単に子商品の属性をフィルターに表示したくない場合)は、柔軟性が低下するように思われるからです。 。そして、フィルターのデータを準備する以外に、この「メカニズム」がどのような目的に役立つのかわかりません。したがって、システムの他の部分を改ざんせずにこのステップを安全に削除できるかどうかはわかりません。
d.yuk

あなたはしません。それを削除してからテストします。問題ないと思います。以前は情報を追加するだけで、一部を削除することはありませんでした。それでも:試してテストしてください:-)頑張ってください!
Fabian Blechschmidt

1
ええ、私はあなたが正しいと思います。最後に、これらの「リンク」は、製品属性の再インデックス付け中に実際に作成されることがわかりました。したがって、これらのリレーションは、検索とフィルタリングの目的で作成されたものであり、それらを削除しても問題ありません。再度、感謝します。
d.yuk

@ d.yuk同じことを達成しようとしています。インデクサーでこれをどのように達成したかを投稿できますか?
アーロンポロック

1
@AaronPollock質問を編集し、そこにメソッドを配置しました。お役に立てれば幸いです。幸運を!
d.yuk

7

更新:インデクサーが子製品を含めないようにする方法

  1. 拡張および変更 Mage_Catalog_Model_Resource_Product_Indexer_Eav_Abstract
  2. 関数を探します_prepareRelationIndex()
  3. SQLクエリビルダーステートメントを次のように変更します。

コード:

$select = $write->select()
    ->from(array('l' => $this->getTable('catalog/product_relation')), 'parent_id')
    ->join(
        array('cs' => $this->getTable('core/store')),
        '',
        array())
    ->join(
        array('i' => $idxTable),
        'l.child_id = i.entity_id AND cs.store_id = i.store_id',
        array('attribute_id', 'store_id', 'value'))
    ->join(
        array('e' => 'catalog_product_entity'),
        'l.parent_id = e.entity_id',
        array())
    ->group(array(
        'l.parent_id', 'i.attribute_id', 'i.store_id', 'i.value'
    ))
    ->where('e.type_id != ?', 'bundle');

インデクサーが子製品を含めないようにする方法 参照:赤で強調表示されたコードの追加

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.