Pregunta

La tarea es trivial. Necesito obtener una lista de productos para una vista de tienda particular con un catálogo plano habilitado. La solución más obvia es la siguiente:

$collection = Mage::getResourceModel('catalog/product_collection')
    ->setStore($storeId);

En realidad setStore() El método no está haciendo ninguna diferencia aquí porque se llama después del _initSelect() método de Mage_Catalog_Model_Resource_Product_Collection que obtiene el nombre de la tabla plana basada en la identificación de la tienda. Como la ID de la tienda aún no está configurada, toma la ID actual de la tienda.

Entonces, la solución obvia sería establecer una ID de tienda actual antes de obtener un modelo.

Mage::app()->setCurrentStore($storeId);

$collection = Mage::getResourceModel('catalog/product_collection');

Funcionará. Pero solo si necesita obtener una colección una vez. Si necesita obtener una colección en el bucle o simplemente necesita dos colecciones consecutivas, no podrá configurar un almacén específico para ellas.

La razón es que Mage_Catalog_Model_Resource_Product_Flat la clase tiene su propia _storeId propiedad y en el constructor está configurado en la ID de tienda actual. Por eso se establecerá por primera vez. Entonces, por alguna razón (el cielo sabe que espero que haya uno) en Mage_Eav_Model_Entity_Collection_Abstract::_init Cada módulo de recursos se obtiene como un singleton. Así que no hay constructor para la segunda llamada.

Todo esto se ve tan mal que estoy bastante seguro de que estoy equivocado y no es otro error de magento (o dos). Espero que alguien pueda arrojar una luz sobre ello.

No hay solución correcta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top