Задача тривиальная. Мне нужно получить список товаров для конкретного магазина с включенным плоским каталогом. Наиболее очевидным решением является следующее:
$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 (или два). Надеюсь, что кто-то может пролить свет на это.


