TL; DR , Die Anforderung besteht darin, dass der Lagerbestand auf der Seite mit den Produktlisten der Kategorie mit möglichst wenig zusätzlichen Abfragen / Speicher angezeigt wird, um die Leistung zu gewährleisten, die dem Magento-Framework entspricht.
Nach dem Lesen von Vinai Kopps Artikel über das Vorladen für Skalierbarkeit .
Was ist der beste Weg, um die Lagerbestände auf den Seiten mit den Produktlisten der Kategorie ( list.phtml ) mit möglichst wenigen zusätzlichen Abfragen / Ladevorgängen aus Gründen der Leistung einzuschließen?
Mir sind einige Ansätze bekannt:
afterLoad () scheint gut mitmedia_gallery
Inklusion ohne zusätzliche Abfragenzu funktionieren, es ist mir jedoch nicht gelungen, denselben Ansatz mit Inventory zu implementieren.
$attributes = $_product->getTypeInstance(true)->getSetAttributes($_product);
$media_gallery = $attributes['media_gallery'];
$backend = $media_gallery->getBackend();
$backend->afterLoad($_product);
Direktes SQL zum Sammeln der erforderlichen Daten parallel zur Sammlung, beispielsweise mit einem product_id
Schlüssel. Suche aber eher nach einem Mittel durch das Framework.
Momentan lade ich das stock_item
Objekt einfach über:
$_product->load('stock_item')->getTotalQty();
Was funktioniert, aber ich stelle fest, dass weitere Abfragen hinzugefügt wurden, um den Lagerbestand aller Produkte in der Sammlung zu ermitteln.
...
__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)
...
seltsamerweise funktioniert dies. Die Magie geschieht in Mage_Eav_Model_Entity_Abstract-> load ($ object, $ entityId, $ attributes). Wenn $ attributes leer ist, wird loadAllAttribute ($ object) aufgerufen. $ Product-> load ('blah') lädt also alle fehlenden Attribute, einschließlich 'media_gallery' - William Tran 19. November 14 um 4:45
Fügen Sie der bereits geladenen Sammlung die erforderlichen Werte hinzu.
Der naheliegende einfache Ansatz, die erforderlichen Daten der Produktionssammlung der obersten Ebene im Layer / Filter hinzuzufügen, scheint der beste Ansatz zu sein.
Ich habe in Mage_CatalogInventory_Model_Observer einen Beobachter namens addInventoryDataToCollection () festgestellt , der sich so anhört, als würde er dies erreichen. Das Hinzufügen der Methode zu einem benutzerdefinierten Modulbeobachter scheint jedoch nicht kompatibel zu sein.
<events>
<catalog_product_collection_load_after>
<observers>
<inventory>
<class>cataloginventory/observer</class>
<method>addInventoryDataToCollection</method>
</inventory>
</observers>
</catalog_product_collection_load_after>
</events>
Was in ... endet:
Warnung: Ungültiges Argument für foreach () in /app/code/core/Mage/CatalogInventory/Model/Resource/Stock/Item/Collection.php in Zeile 71