TL; DRの要件は、Magentoのフレームワークに準拠したパフォーマンスを念頭に置いて、追加のクエリ/メモリを最小限に抑えて、在庫の在庫レベルをカテゴリ製品リストページに表示することです。
スケーラビリティのためのプリロードに関するVinai Koppの記事を読んだ後。
パフォーマンスのために追加のクエリ/ロードをできるだけ少なくして、カテゴリ製品リストページ(list.phtml)に在庫在庫レベルを含める最良の方法は何ですか?
私はいくつかのアプローチを知っています:
afterLoad()は、media_gallery
追加のクエリなしでインクルードしてもうまく機能するように見えますが、インベントリで同じアプローチを実装することに成功していません。
$attributes = $_product->getTypeInstance(true)->getSetAttributes($_product);
$media_gallery = $attributes['media_gallery'];
$backend = $media_gallery->getBackend();
$backend->afterLoad($_product);
product_id
たとえば、キーを使用してコレクションと並行して必要なデータを収集するようにSQLに指示します。しかし、フレームワークを通じてより多くの手段を探しています。
現在、私は単に次のstock_item
方法でオブジェクトをロードしています:
$_product->load('stock_item')->getTotalQty();
これは機能しますが、コレクション内のすべての製品の在庫在庫合計を取得するためのクエリが追加されていることに気付きました。
...
__EAV_LOAD_MODEL__ (Mage_Catalog_Model_Product, id: stock_item, attributes: NULL)
__EAV_LOAD_MODEL__ (Mage_Catalog_Model_Product, id: stock_item, attributes: NULL)
__EAV_LOAD_MODEL__ (Mage_Catalog_Model_Product, id: stock_item, attributes: NULL)
...
奇妙なことに、これは動作します。魔法はMage_Eav_Model_Entity_Abstract-> load($ object、$ entityId、$ attributes)で発生します。$ attributesが空の場合、loadAllAttribute($ object)を呼び出します。したがって、$ product-> load( 'blah')は、 'media_gallery'を含むすべての欠落している属性をロードします– William Tran Nov 19 '14 at 14:45
既にロードされているコレクションに必要な値を追加します。
必要なデータをレイヤー/フィルターのトップレベルの本番コレクションに追加する明白な簡単なアプローチは、最良のアプローチと思われます。
私は予告にオブザーバーでしaddInventoryDataToCollection()内Mage_CatalogInventory_Model_Observerそれのような音が、そのような達成が、互換性があるようには見えないカスタムモジュールオブザーバにメソッドを追加することであろうが。
<events>
<catalog_product_collection_load_after>
<observers>
<inventory>
<class>cataloginventory/observer</class>
<method>addInventoryDataToCollection</method>
</inventory>
</observers>
</catalog_product_collection_load_after>
</events>
結果:
警告:71行目の/app/code/core/Mage/CatalogInventory/Model/Resource/Stock/Item/Collection.phpのforeach()に無効な引数が指定されました