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);
指示SQL以product_id
例如键的方式与集合并行收集所需的数据。但是在框架中寻找更多的手段。
目前,我只是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 2014年11月19日,4:45
将所需的值添加到已加载的集合中。
将所需数据添加到图层/过滤器的顶级生产集合中的简单方法显然是最好的方法。
我确实注意到在Mage_CatalogInventory_Model_Observer中有一个观察者addInventoryDataToCollection(),听起来好像可以实现,但是将方法添加到自定义模块观察者中似乎并不兼容。
<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()提供的参数无效