Загрузите коллекцию категорий с данными, относящимися к конкретному хранилищу


Я нашел множество вопросов и ответов о том, как загружать категории из определенного магазина, но это другая проблема.

Моя проблема в том, что после загрузки нужных мне категорий их атрибутивные данные всегда являются значением по умолчанию/глобальным значением.

Mage::getModel('catalog/category')->getCollection()
    ->addAttributeToSelect(array('name', 'description')
    ->addAttributeToFilter('is_active', 1)
    ->addIdFilter('31,32,33,34') // has to be a string, array doesn't work!
    ->setStoreId(2);

В приведенном выше примере имена и описания, которые я получаю, являются значениями по умолчанию, а не теми, которые установлены для идентификатора магазина 2. Похоже, что setStoreId ничего не делает.

Я знаю, что сами категории не связаны с конкретным представлением магазина, но атрибуты таковы: в панели администратора вы можете задать значения для каждого представления магазина, для каждого веб-сайта и глобально. Я установил их для каждого вида магазина.

Я пробовал ->addStoreFilter(2), но Mage_Catalog_Model_Category_Collection не поддерживает это, я получаю фатальную ошибку PHP. Похоже, это фильтр для конкретного продукта.

Кто-нибудь знает, чего мне не хватает?

Author: Doug McLean, 2015-03-19

2 answers

Я верю, что нашел ответ.

На самом деле коллекция при нормальных обстоятельствах работает нормально. Оказалось, что в моем случае некоторые необходимые атрибуты не были установлены, что и вызывало этот побочный эффект.

Интересный факт: обязательные атрибуты не применяются при добавлении категорий через API.

Каким-то образом, если "Сортировка списка доступных продуктов по" не определена на уровне "По умолчанию" (и я подозреваю, что любой требуемый атрибут будет таким же), то значения для конкретного магазина не загружены.

Забавно, как на данные, относящиеся к конкретному хранилищу, влияют пропуски в данных уровня по умолчанию. Я попытался установить этот атрибут на уровне магазина, чтобы на уровне магазина данные категории были полными, но это все равно не помогло. Только исправление этого на уровне по умолчанию решило мою проблему.

 1
Author: Doug McLean, 2015-03-19 17:23:18

Я получил правильные значения просмотра хранилища, эмулируя конкретный просмотр хранилища вручную с помощью класса Mage_Core_Model_App_Emulation

/** @var \Mage_Core_Model_App_Emulation $appEmulation */
                                $appEmulation = \Mage::getSingleton('core/app_emulation');

                                //Start environment emulation of the specified store
                                $initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($storeId);

                                /** @var \Mage_Catalog_Model_Category $_category */
                                $_category = \Mage::getModel("catalog/category")->load($catId);
                                $_category->load($catId); //Load again because some attributes wont be visible/available
                                $categoryName               = $_category->getName(); //Get the storeview specific categoryname


// ....

                                //Stop environment emulation and restore original store
                                $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
 0
Author: paskl, 2015-10-28 16:04:41