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_Collection
któ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_Flat
klasa ma swoją _storeId
wł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::_init
każ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.