La tâche est triviale. Je dois obtenir la liste des produits pour une vue de magasin particulière avec un catalogue à plat activé. La solution la plus évidente est la suivante:
$collection = Mage::getResourceModel('catalog/product_collection')
->setStore($storeId);
En fait, setStore()
méthode ne fait aucune différence ici car elle est appelée après la _initSelect()
méthode Mage_Catalog_Model_Resource_Product_Collection
qui obtient le nom de la table à plat en fonction de l'ID de magasin. L'ID de magasin n'étant pas encore défini, il prend l'identifiant de magasin actuel.
La solution évidente serait donc de définir un ID de magasin actuel avant d’obtenir un modèle.
Mage::app()->setCurrentStore($storeId);
$collection = Mage::getResourceModel('catalog/product_collection');
Ça va marcher. Mais seulement si vous devez obtenir une collection une fois. Si vous avez besoin d'une collection dans la boucle ou si vous avez juste besoin de deux collections consécutives, vous ne pourrez pas définir de magasin spécifique pour elles.
La raison en est que cette Mage_Catalog_Model_Resource_Product_Flat
classe a sa propre _storeId
propriété et que, dans le constructeur, elle est définie sur l'ID de magasin actuel. C'est pourquoi il sera réglé pour la première fois. Ensuite, pour une raison quelconque (Dieu sait que j'espère qu'il y en a un), Mage_Eav_Model_Entity_Collection_Abstract::_init
chaque module de ressource est récupéré en tant que singleton. Donc, pas de constructeur pour le 2e appel.
Tout cela a l'air tellement faux que je suis presque sûr que je me trompe et que ce n'est pas un autre bogue de Magento (ou deux). J'espère que quelqu'un pourra nous éclairer.