La tarea es trivial. Necesito obtener una lista de productos para ver una tienda en particular con un catálogo plano habilitado. La solución más obvia es la siguiente:
$collection = Mage::getResourceModel('catalog/product_collection')
->setStore($storeId);
De hecho, el setStore()
método no hace ninguna diferencia aquí porque se llama después de que el _initSelect()
método Mage_Catalog_Model_Resource_Product_Collection
obtiene el nombre de la tabla plana según la ID de la tienda. Como la ID de la tienda aún no está configurada, toma la ID de la tienda actual.
Por lo tanto, 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 ciclo o simplemente necesita dos colecciones consecutivas, no podrá establecer una tienda específica para ellas.
La razón es que la Mage_Catalog_Model_Resource_Product_Flat
clase tiene su propia _storeId
propiedad y en el constructor se establece en el ID de la tienda actual. Es por eso que se establecerá la primera vez. Entonces, por alguna razón (Dios sabe que espero que haya uno) en Mage_Eav_Model_Entity_Collection_Abstract::_init
cada módulo de recursos se obtiene como un singleton. Entonces no hay constructor para la 2da 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.