TL; DR , 요구 사항은 Magento의 프레임 워크를 준수하는 성능을 염두에두고 추가 쿼리 / 메모리를 거의 사용하지 않고 카테고리 제품 목록 페이지에 재고 레벨의 재고를 표시해야합니다.
확장 성을위한 사전로드에 관한 Vinai Kopp의 기사를 읽은 후 .
성능 향상을 위해 추가 쿼리 /로드가 적은 카테고리 제품 목록 페이지 ( list.phtml ) 에 재고 수준을 포함시키는 가장 좋은 방법은 무엇입니까 ?
몇 가지 접근 방식을 알고 있습니다.
afterLoad () 는media_gallery
추가 쿼리없이 포함과 함께 잘 작동하는 것처럼 보이지만인벤토리와 동일한 접근 방식을 구현하지 못했습니다.
$attributes = $_product->getTypeInstance(true)->getSetAttributes($_product);
$media_gallery = $attributes['media_gallery'];
$backend = $media_gallery->getBackend();
$backend->afterLoad($_product);
product_id
키를 사용 하여 필요한 데이터를 수집과 병렬로 수집하도록 SQL 에 지시하십시오 . 그러나 프레임 워크를 통해 더 많은 수단을 찾고 있습니다.
현재 나는 단순히 다음을 stock_item
통해 객체를 로드하고 있습니다 :
$_product->load('stock_item')->getTotalQty();
어느 것이 효과적이지만 컬렉션에있는 모든 제품의 재고 총계를 얻기 위해 더 많은 쿼리가 추가 된 것을 알았습니다.
...
__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)
...
이상하게도 이것은 작동합니다. 마술은 Mage_Eav_Model_Entity_Abstract-> load ($ object, $ entityId, $ attributes)에서 발생합니다. $ attributes가 비어 있으면 loadAllAttribute ($ object)를 호출합니다. 따라서 $ product-> load ( 'blah')는 'media_gallery'를 포함한 모든 누락 된 속성을로드합니다 – William Tran Nov 19 '14 at 4:45
이미로드 된 컬렉션에 필요한 값을 추가하십시오.
필요한 데이터를 레이어 / 필터의 최상위 프로덕션 컬렉션에 추가하는 명백한 간단한 방법이 최선의 방법 인 것 같습니다.
나는 통지를 관찰자의 한 addInventoryDataToCollection () 에서 Mage_CatalogInventory_Model_Observer 그것과 같은 소리는 달성하지만, 호환 될 것 같지 않습니다 사용자 정의 모듈 관찰자에게 방법을 추가하는 것입니다.
<events>
<catalog_product_collection_load_after>
<observers>
<inventory>
<class>cataloginventory/observer</class>
<method>addInventoryDataToCollection</method>
</inventory>
</observers>
</catalog_product_collection_load_after>
</events>
결과 :
경고 : 71 행의 /app/code/core/Mage/CatalogInventory/Model/Resource/Stock/Item/Collection.php에서 foreach ()에 잘못된 인수가 제공되었습니다.