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_Collectionqui 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_Flatclasse a sa propre _storeIdproprié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::_initchaque 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.


