TL; DR : el requisito es que se muestre un nivel de inventario en la página de listado de productos de categoría con tan pocas consultas / memoria adicionales con un rendimiento en mente que se adhiere al marco de Magento.
Después de leer el artículo de Vinai Kopp sobre precarga para la escalabilidad .
¿Cuál es la mejor manera de incluir los niveles de inventario en las páginas de listado de productos de categoría ( list.phtml ) con tan pocas consultas / cargas adicionales por motivos de rendimiento?
Soy consciente de algunos enfoques:
afterLoad () parece funcionar bien con lamedia_gallery
inclusión sin consultas adicionales, sin embargo, no he tenido éxito al implementar el mismo enfoque con el inventario.
$attributes = $_product->getTypeInstance(true)->getSetAttributes($_product);
$media_gallery = $attributes['media_gallery'];
$backend = $media_gallery->getBackend();
$backend->afterLoad($_product);
SQL directo para recopilar los datos necesarios en paralelo a la recopilación con una product_id
clave, por ejemplo. Pero buscando más medios a través del marco.
Actualmente simplemente estoy cargando el stock_item
objeto a través de:
$_product->load('stock_item')->getTotalQty();
Lo que funciona, pero noto la adición de más consultas para obtener el inventario total de todos los productos de la colección.
...
__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)
...
Curiosamente, esto funciona. La magia ocurre en Mage_Eav_Model_Entity_Abstract-> load ($ object, $ entityId, $ atributos). Si $ atributos está vacío, llamará a loadAllAttribute ($ objeto). Entonces $ product-> load ('blah') cargará todos los atributos faltantes, incluyendo 'media_gallery' - William Tran 19 de noviembre de 14 a las 4:45
Agregue los valores necesarios a la colección ya cargada.
El enfoque simple obvio de agregar los datos necesarios a la colección de producción de nivel superior en la capa / filtro, parece ser el mejor enfoque.
Me di cuenta de un observador addInventoryDataToCollection () en Mage_CatalogInventory_Model_Observer que parece que lo lograría, pero agregar el método a un observador de módulos personalizados no parece ser compatible.
<events>
<catalog_product_collection_load_after>
<observers>
<inventory>
<class>cataloginventory/observer</class>
<method>addInventoryDataToCollection</method>
</inventory>
</observers>
</catalog_product_collection_load_after>
</events>
Lo que resulta en:
Advertencia: argumento no válido proporcionado para foreach () en /app/code/core/Mage/CatalogInventory/Model/Resource/Stock/Item/Collection.php en la línea 71