Задача тривиальная. Мне нужно получить список товаров для конкретного магазина с включенным плоским каталогом. Наиболее очевидным решением является следующее:
$collection = Mage::getResourceModel('catalog/product_collection')
->setStore($storeId);
На самом деле setStore()
метод здесь не имеет никакого значения, потому что он вызывается после того, как _initSelect()
метод Mage_Catalog_Model_Resource_Product_Collection
получает имя плоской таблицы на основе идентификатора магазина. Поскольку идентификатор магазина еще не установлен, он принимает текущий идентификатор магазина.
Таким образом, очевидным обходным путем будет установка текущего идентификатора магазина перед получением модели.
Mage::app()->setCurrentStore($storeId);
$collection = Mage::getResourceModel('catalog/product_collection');
Это сработает. Но только если вам нужно получить коллекцию один раз. Если вам нужно получить коллекцию в цикле или вам просто нужны две коллекции подряд, вы не сможете установить для них конкретное хранилище.
Причина в том, что Mage_Catalog_Model_Resource_Product_Flat
класс имеет свое собственное _storeId
свойство и в конструкторе ему присваивается идентификатор текущего хранилища. Вот почему он будет установлен в первый раз. Затем по какой-то причине (небеса знают, я надеюсь, что таковой имеется) в Mage_Eav_Model_Entity_Collection_Abstract::_init
каждом ресурсном модуле извлекается как одиночка. Так что нет конструктора для 2-го вызова.
Все это выглядит так неправильно, что я почти уверен, что ошибаюсь, и это не очередной баг Magento (или два). Надеюсь, что кто-то может пролить свет на это.