TL; DR , o requisito é que um nível de estoque do inventário seja exibido na página de listagem de produtos da categoria com menos consultas / memória adicionais, tendo em mente o desempenho que segue a estrutura do Magento.
Depois de ler o artigo de Vinai Kopp sobre pré - carregamento para escalabilidade .
Qual é a melhor maneira de incluir os níveis de estoque do inventário nas páginas de listagem de produtos da categoria ( list.phtml ) com o mínimo de consultas / cargas adicionais por questões de desempenho?
Estou ciente de algumas abordagens:
O afterLoad () parece funcionar bem com amedia_gallery
inclusão sem consultas adicionais, no entanto, não consegui implementar a mesma abordagem com o inventário.
$attributes = $_product->getTypeInstance(true)->getSetAttributes($_product);
$media_gallery = $attributes['media_gallery'];
$backend = $media_gallery->getBackend();
$backend->afterLoad($_product);
Direct SQL para reunir os dados necessários em paralelo à coleção com uma product_id
chave, por exemplo. Mas procurando mais meios através da estrutura.
Atualmente, estou simplesmente carregando o stock_item
objeto via:
$_product->load('stock_item')->getTotalQty();
O que funciona, mas noto a adição de mais consultas para obter o total do estoque de todos os produtos da coleção.
...
__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)
...
estranhamente, isso funciona. A mágica acontece em Mage_Eav_Model_Entity_Abstract-> load ($ object, $ entityId, $ attribute). Se $ attribute estiver vazio, ele chamará loadAllAttribute ($ object). Portanto, $ product-> load ('blah') carregará todos os atributos ausentes, incluindo 'media_gallery' #: 1967 William Tran
Adicione os valores necessários à coleção já carregada.
A abordagem simples e óbvia de adicionar os dados necessários à coleção de produção de nível superior na camada / filtro, parece ser a melhor abordagem.
Eu notei um observador addInventoryDataToCollection () em Mage_CatalogInventory_Model_Observer que parece que conseguiria isso, mas adicionar o método a um observador de módulos personalizados não parece ser compatível.
<events>
<catalog_product_collection_load_after>
<observers>
<inventory>
<class>cataloginventory/observer</class>
<method>addInventoryDataToCollection</method>
</inventory>
</observers>
</catalog_product_collection_load_after>
</events>
O que resulta em:
Aviso: argumento inválido fornecido para foreach () em /app/code/core/Mage/CatalogInventory/Model/Resource/Stock/Item/Collection.php na linha 71