TL; DR , Wymagane jest, aby stan zapasów wyświetlać się na stronie z listą produktów kategorii przy jak najmniejszej liczbie dodatkowych zapytań / pamięci, mając na uwadze wydajność zgodną ze środowiskiem Magento.
Po przeczytaniu artykułu Vinai Kopp na temat wstępnego ładowania w celu zwiększenia skalowalności .
Jaki jest najlepszy sposób na uwzględnienie stanów magazynowych na stronach z listą produktów kategorii ( list.phtml ) przy jak najmniejszej liczbie dodatkowych zapytań / obciążeń ze względu na wydajność?
Mam świadomość kilku podejść:
Wydaje się, że afterLoad () działa dobrze zmedia_gallery
włączeniem bez dodatkowych zapytań, jednak nie udało mi się wdrożyć tego samego podejścia z zapasami.
$attributes = $_product->getTypeInstance(true)->getSetAttributes($_product);
$media_gallery = $attributes['media_gallery'];
$backend = $media_gallery->getBackend();
$backend->afterLoad($_product);
Bezpośredni SQL, aby zebrać wymagane dane równolegle do kolekcji, product_id
na przykład za pomocą klucza. Ale szukam więcej środków poprzez ramy.
Obecnie po prostu ładuję stock_item
obiekt poprzez:
$_product->load('stock_item')->getTotalQty();
Co działa, ale zauważam dodanie więcej zapytań, aby uzyskać podsumowanie zapasów magazynowych wszystkich produktów w kolekcji.
...
__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)
...
co dziwne, to działa. Magia dzieje się w Mage_Eav_Model_Entity_Abstract-> load ($ object, $ entityId, $ attribute). Jeśli $ atrybuty są puste, wywoła loadAllAttribute (obiekt $). Więc $ product-> load („bla”) załaduje wszystkie brakujące atrybuty, w tym „media_gallery” - William Tran 19 listopada 14 o 4:45
Dodaj potrzebne wartości do już załadowanej kolekcji.
Wydaje się, że najlepszym rozwiązaniem jest oczywiste proste podejście polegające na dodaniu potrzebnych danych do kolekcji produkcyjnej najwyższego poziomu w warstwie / filtrze.
Zauważyłem, że obserwator addInventoryDataToCollection () w Mage_CatalogInventory_Model_Observer brzmi, jakby to się udało, ale dodanie metody do niestandardowego modułu obserwatora nie wydaje się być kompatybilne.
<events>
<catalog_product_collection_load_after>
<observers>
<inventory>
<class>cataloginventory/observer</class>
<method>addInventoryDataToCollection</method>
</inventory>
</observers>
</catalog_product_collection_load_after>
</events>
Co skutkuje w:
Ostrzeżenie: Podano niepoprawny argument dla foreach () w /app/code/core/Mage/CatalogInventory/Model/Resource/Stock/Item/Collection.php w linii 71