Question

La tâche est triviale. J'ai besoin d'obtenir une liste de 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 réalité setStore() la méthode ne fait aucune différence ici car elle est appelée après le _initSelect() méthode de Mage_Catalog_Model_Resource_Product_Collection qui obtient le nom de la table plate en fonction de l'ID de magasin. Comme l'ID de magasin n'est pas encore réglé, il prend l'ID de magasin actuel.

Ainsi, la solution de contournement évidente serait 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 avez besoin d'obtenir une collection une fois. Si vous avez besoin d'obtenir une collection dans la boucle ou si vous avez juste besoin de deux collections dos à dos, vous ne pourrez pas leur définir un magasin spécifique.

La raison en est que Mage_Catalog_Model_Resource_Product_Flat La classe a son propre _storeId propriété et dans le constructeur, il est défini sur l'ID de magasin actuel. C'est pourquoi il sera défini pour la première fois. Alors pour une raison quelconque (le ciel 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 singleton. Donc pas de constructeur pour le 2ème appel.

Tout cela semble si mal que je suis sûr que je me trompe et ce n'est pas un autre bug magento (ou deux). J'espère que quelqu'un pourra faire la lumière dessus.

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top