TL; DR , L'exigence est d'avoir un niveau de stock d'inventaire affiché sur la page de liste des produits de la catégorie avec aussi peu de requêtes / mémoire supplémentaires avec des performances à l'esprit qui adhèrent au cadre de Magento.
Après avoir lu l'article de Vinai Kopp sur le préchargement pour l'évolutivité .
Quelle est la meilleure façon d'inclure les niveaux de stock dans les pages de liste des produits de la catégorie ( list.phtml ) avec aussi peu de requêtes / chargements supplémentaires pour des raisons de performances?
Je connais quelques approches:
afterLoad () semble bien fonctionner avec l'media_gallery
inclusion sans requêtes supplémentaires, mais je n'ai pas réussi à implémenter la même approche avec l'inventaire.
$attributes = $_product->getTypeInstance(true)->getSetAttributes($_product);
$media_gallery = $attributes['media_gallery'];
$backend = $media_gallery->getBackend();
$backend->afterLoad($_product);
Demandez à SQL de collecter les données requises en parallèle à la collecte avec une product_id
clé par exemple. Mais à la recherche de plus de moyens dans le cadre.
Actuellement, je charge simplement l' stock_item
objet via:
$_product->load('stock_item')->getTotalQty();
Ce qui fonctionne, mais je remarque l'ajout de plus de requêtes pour obtenir le total des stocks de tous les produits de la collection.
...
__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)
...
étrangement, cela fonctionne. La magie opère dans Mage_Eav_Model_Entity_Abstract-> load ($ object, $ entityId, $ attributes). Si $ attributes est vide, il appellera loadAllAttribute ($ object). Donc $ product-> load ('blah') chargera tous les attributs manquants, y compris 'media_gallery' - William Tran 19 novembre 14 à 4:45
Ajoutez les valeurs nécessaires à la collection déjà chargée.
L'approche simple évidente consistant à ajouter les données nécessaires à la collection de production de niveau supérieur dans la couche / le filtre semble être la meilleure approche.
J'ai remarqué un observateur addInventoryDataToCollection () dans Mage_CatalogInventory_Model_Observer qui semble pouvoir y arriver, mais l'ajout de la méthode à un observateur de modules personnalisés ne semble pas compatible.
<events>
<catalog_product_collection_load_after>
<observers>
<inventory>
<class>cataloginventory/observer</class>
<method>addInventoryDataToCollection</method>
</inventory>
</observers>
</catalog_product_collection_load_after>
</events>
Ce qui se traduit par:
Avertissement: argument non valide fourni pour foreach () dans /app/code/core/Mage/CatalogInventory/Model/Resource/Stock/Item/Collection.php sur la ligne 71