TL; DR , il requisito è che un livello di inventario sia visualizzato nella pagina di elenco dei prodotti della categoria con un numero di query / memoria aggiuntivo con in mente le prestazioni che aderiscono al framework Magento.
Dopo aver letto l'articolo di Vinai Kopp sul precaricamento per la scalabilità .
Qual è il modo migliore per includere i livelli delle scorte nelle pagine di elenco dei prodotti della categoria ( list.phtml ) con un numero di query / carichi aggiuntivi per prestazioni elevate?
Sono a conoscenza di alcuni approcci:
afterLoad () sembra funzionare bene con l'media_gallery
inclusione senza ulteriori query, tuttavia non sono riuscito a implementare lo stesso approccio con l'inventario.
$attributes = $_product->getTypeInstance(true)->getSetAttributes($_product);
$media_gallery = $attributes['media_gallery'];
$backend = $media_gallery->getBackend();
$backend->afterLoad($_product);
Dirigere SQL per raccogliere i dati richiesti parallelamente alla raccolta con una product_id
chiave, ad esempio. Ma alla ricerca di più di un mezzo attraverso il framework.
Attualmente sto semplicemente caricando l' stock_item
oggetto tramite:
$_product->load('stock_item')->getTotalQty();
Il che funziona, ma noto l'aggiunta di più query per ottenere i totali dello stock di inventario di tutti i prodotti della collezione.
...
__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)
...
stranamente, funziona. La magia si verifica in Mage_Eav_Model_Entity_Abstract-> load ($ oggetto, $ entityId, $ attributi). Se $ attributi è vuoto, chiamerà loadAllAttribute ($ object). Quindi $ product-> load ('blah') caricherà tutti gli attributi mancanti, incluso 'media_gallery' - William Tran, 19 novembre 14 alle 16:45
Aggiungi i valori necessari alla raccolta già caricata.
L'approccio semplice ovvio di aggiungere i dati necessari alla raccolta di produzione di livello superiore nel layer / filtro sembrerebbe l'approccio migliore.
Ho notato un osservatore addInventoryDataToCollection () in Mage_CatalogInventory_Model_Observer che suona come se potesse raggiungere tale obiettivo, ma l'aggiunta del metodo a un osservatore di moduli personalizzati non sembra compatibile.
<events>
<catalog_product_collection_load_after>
<observers>
<inventory>
<class>cataloginventory/observer</class>
<method>addInventoryDataToCollection</method>
</inventory>
</observers>
</catalog_product_collection_load_after>
</events>
Che si traduce in:
Avvertenza: argomento non valido fornito per foreach () in /app/code/core/Mage/CatalogInventory/Model/Resource/Stock/Item/Collection.php sulla riga 71