TL; DR. Требуется , чтобы уровень запасов был отображен на странице с перечнем продуктов категории с минимальными дополнительными запросами / памятью, учитывая производительность, соответствующую структуре Magento.
После прочтения статьи Винай Копп о предварительной загрузке для масштабируемости .
Каков наилучший способ включить уровни запасов на страницах со списком продуктов категории ( 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-> ($ object, $ entityId, $ attribute). Если $ attribute пуст, он вызовет loadAllAttribute ($ object). Таким образом, $ product-> load ('blah') загрузит все недостающие атрибуты, включая 'media_gallery' - Уильям Тран 19 ноября '14 в 4: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>
Что приводит к:
Предупреждение: неверный аргумент указан для foreach () в /app/code/core/Mage/CatalogInventory/Model/Resource/Stock/Item/Collection.php в строке 71