Zadanie jest trywialne. Potrzebuję uzyskać listę produktów dla konkretnego widoku sklepu z włączonym płaskim katalogiem. Najbardziej oczywistym rozwiązaniem jest:
$collection = Mage::getResourceModel('catalog/product_collection')
->setStore($storeId);
W rzeczywistości setStore()metoda nie robi tu żadnej różnicy, ponieważ jest wywoływana po _initSelect()metodzie, Mage_Catalog_Model_Resource_Product_Collectionktóra otrzymuje nazwę płaskiego stołu na podstawie identyfikatora sklepu. Ponieważ identyfikator sklepu nie jest jeszcze ustawiony, pobiera bieżący identyfikator sklepu.
Oczywistym obejściem byłoby ustawienie bieżącego identyfikatora sklepu przed uzyskaniem modelu.
Mage::app()->setCurrentStore($storeId);
$collection = Mage::getResourceModel('catalog/product_collection');
To będzie działać. Ale tylko wtedy, gdy musisz raz zdobyć kolekcję. Jeśli potrzebujesz uzyskać kolekcję w pętli lub potrzebujesz tylko dwóch kolekcji z powrotem do tyłu, nie będziesz w stanie ustawić dla nich konkretnego sklepu.
Powodem jest to, że Mage_Catalog_Model_Resource_Product_Flatklasa ma swoją _storeIdwłasność, aw konstruktorze jest ustawiona na bieżący identyfikator sklepu. Dlatego zostanie ustawiony po raz pierwszy. Następnie z jakiegoś powodu (niebo wie, mam nadzieję, że istnieje) w Mage_Eav_Model_Entity_Collection_Abstract::_initkażdym module zasobów jest pobierany jako singleton. Więc nie ma konstruktora dla drugiego połączenia.
To wszystko wygląda tak źle, że jestem prawie pewien, że się mylę i nie jest to kolejny błąd Magento (lub dwa). Mam nadzieję, że ktoś może rzucić na to światło.


