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