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_Ab Abstract-> load ($ object, $ entitId, $ attributes). Якщо атрибути $ порожні, він викличе loadAllAttribute ($ об'єкт). Тож $ 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