A tarefa é trivial. Preciso obter uma lista de produtos para uma visualização específica da loja com um catálogo plano ativado. A solução mais óbvia é a seguinte:
$collection = Mage::getResourceModel('catalog/product_collection')
->setStore($storeId);
De fato, o setStore()
método não faz nenhuma diferença aqui porque é chamado após o _initSelect()
método Mage_Catalog_Model_Resource_Product_Collection
que obtém o nome da tabela simples com base no ID da loja. Como o ID da loja ainda não está definido, ele aceita o ID da loja atual.
Portanto, a solução óbvia seria definir um ID de loja atual antes de obter um modelo.
Mage::app()->setCurrentStore($storeId);
$collection = Mage::getResourceModel('catalog/product_collection');
Vai funcionar. Mas apenas se você precisar obter uma coleção uma vez. Se você precisar obter uma coleção no loop ou precisar apenas de duas coleções consecutivas, não poderá definir um armazenamento específico para elas.
O motivo é que a Mage_Catalog_Model_Resource_Product_Flat
classe tem sua própria _storeId
propriedade e, no construtor, é definida como o ID da loja atual. É por isso que será definido pela primeira vez. Então, por alguma razão (Deus sabe que espero que exista), em Mage_Eav_Model_Entity_Collection_Abstract::_init
cada módulo de recurso é buscado como um singleton. Portanto, nenhum construtor para a segunda chamada.
Tudo isso parece tão errado que eu tenho certeza que estou errado e não é outro bug do Magento (ou dois). Espero que alguém possa esclarecer isso.