Die Aufgabe ist trivial. Ich muss eine Liste der Produkte für eine bestimmte Store-Ansicht mit aktiviertem Flat-Katalog abrufen. Die naheliegendste Lösung ist die folgende:
$collection = Mage::getResourceModel('catalog/product_collection')
->setStore($storeId);
Tatsächlich macht die setStore()
Methode hier keinen Unterschied, da sie aufgerufen wird, nachdem die _initSelect()
Methode Mage_Catalog_Model_Resource_Product_Collection
anhand der Geschäfts-ID den Namen der flachen Tabelle abgerufen hat. Da die Filial-ID noch nicht festgelegt ist, wird die aktuelle Filial-ID verwendet.
Die naheliegende Problemumgehung besteht darin, eine aktuelle Geschäfts-ID festzulegen, bevor Sie ein Modell abrufen.
Mage::app()->setCurrentStore($storeId);
$collection = Mage::getResourceModel('catalog/product_collection');
Es wird klappen. Aber nur, wenn Sie einmal eine Sammlung benötigen. Wenn Sie eine Sammlung auf den neuesten Stand bringen möchten oder nur zwei aufeinanderfolgende Sammlungen benötigen, können Sie keinen bestimmten Speicher für diese festlegen.
Der Grund dafür ist, dass die Mage_Catalog_Model_Resource_Product_Flat
Klasse eine eigene _storeId
Eigenschaft hat und im Konstruktor auf die aktuelle Geschäfts-ID festgelegt ist. Deshalb wird es beim ersten Mal eingestellt. Dann wird aus irgendeinem Grund (der Himmel weiß, ich hoffe, es gibt einen) in Mage_Eav_Model_Entity_Collection_Abstract::_init
jedem Ressourcenmodul als Singleton abgerufen. Also kein Konstruktor für den 2. Aufruf.
Das alles sieht so falsch aus, dass ich ziemlich sicher bin, dass ich falsch liege und es kein weiterer Magento-Bug (oder zwei) ist. Ich hoffe, jemand kann Licht ins Dunkel bringen.