Il compito è banale. Devo ottenere un elenco di prodotti per una particolare visualizzazione del negozio con un catalogo flat abilitato. La soluzione più ovvia è la seguente:
$collection = Mage::getResourceModel('catalog/product_collection')
->setStore($storeId);
In effetti il setStore()
metodo non fa alcuna differenza qui perché viene chiamato dopo il _initSelect()
metodo di Mage_Catalog_Model_Resource_Product_Collection
cui ottiene il nome della tabella piatta in base all'ID negozio. Poiché l'ID negozio non è ancora impostato, accetta l'ID negozio corrente.
Quindi la soluzione ovvia sarebbe quella di impostare un ID negozio corrente prima di ottenere un modello.
Mage::app()->setCurrentStore($storeId);
$collection = Mage::getResourceModel('catalog/product_collection');
Funzionerà. Ma solo se hai bisogno di ottenere una collezione una volta. Se hai bisogno di ottenere una collezione nel loop o hai solo bisogno di due collezioni back to back, non sarai in grado di impostare un negozio specifico per loro.
Il motivo è che la Mage_Catalog_Model_Resource_Product_Flat
classe ha una propria _storeId
proprietà e nel costruttore è impostata sull'ID negozio corrente. Ecco perché sarà impostato per la prima volta. Quindi per qualche motivo (il cielo sa che spero che ce ne sia uno) in Mage_Eav_Model_Entity_Collection_Abstract::_init
ogni modulo di risorsa viene recuperato come singleton. Quindi nessun costruttore per la seconda chiamata.
Tutto sembra così sbagliato che sono abbastanza sicuro di sbagliarmi e non è un altro bug di Magento (o due). Spero che qualcuno possa far luce su di esso.