Как узнать товарные разделы для данного товара?

Получение всех категорий товара

[10 ноября 2016 г.]    Российская сборка Magento 2.49.12
Magento 2: модули и услуги
#1 Danila_Master
  • Группа: Пользователь
  • Сообщений: 29
  • Регистрация: 04.04.2011

17.04.2011 14:14

Нужно получить все категории, к которым привязан товар.
Использую следующий код:
if ($_categoryCollection = $_product->getCategoryCollection()):
  foreach ($_categoryCollection as $_category):
    echo $_category->getName(); 
  endforeach;
endif;

Но значение имени null. Я попробовал сохранить в лог Mage::log($_category->getData()); дествительно там нет имени.
Пожскажите, как получить имя?

#2 Danila_Master
  • Группа: Пользователь
  • Сообщений: 29
  • Регистрация: 04.04.2011

17.04.2011 14:25

Мне удалось решить проблему так:
foreach ($_categoryCollection as $_category):
  $_category->load($_category->getId());

Но мне кажется, что это как-то неправильно.

#3 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

17.04.2011 17:21

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

Правильно будет получить идентификаторы связанных с товаром товарных разделов посредством вызова метода:
Mage_Catalog_Model_Product::getCategoryIds()


Далее вы можете загрузить коллекцию товарных разделов, установив для них фильтр по указанным выше идентификаторам.

#4 Danila_Master
  • Группа: Пользователь
  • Сообщений: 29
  • Регистрация: 04.04.2011

18.04.2011 09:37

Такс, вообще
$_product->getCategoryCollection()
хороший метод и сделан специально для получения категорий товара. Только его беда в том, что он не подгружает все аттрибуты категории и передать в метод список нужных аттрибутов невозможно. Поэтому я просто скопировал метод и добавил все аттрибуты для выборки.
В итоге:
$collection = Mage::getResourceModel('catalog/category_collection')
                        ->addAttributeToSelect('*')
                        ->joinField('product_id',
                            'catalog/category_product',
                            'product_id',
                            'category_id=entity_id',
                            null)
                        ->addFieldToFilter('product_id', (int) $_product->getId());

                    foreach ($collection as $category) {
                        Mage::log ($category->getData ());
                    }


#5 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

18.04.2011 10:35

Вы ошибаетесь.
Метод Mage_Catalog_Model_Product::getCategoryCollection () подготавливает коллекцию, но не загружает её, поэтому вы можете перед загрузкой этой коллекции добавить в неё дополнительные атрибуты посредством метода Mage_Eav_Model_Entity_Collection_Abstract::addAttributeToSelect () (Mage_Eav_Model_Entity_Collection_Abstract - базовый класс для коллекции, возвращаемой методом Mage_Catalog_Model_Product::getCategoryCollection ()).

#6 Danila_Master
  • Группа: Пользователь
  • Сообщений: 29
  • Регистрация: 04.04.2011

18.04.2011 11:50

Суппер, спасибо, вот я нуб. Но знал, что должно быть все элегантно как-то.
В итоге:
$_categoryCollection = $_product->getCategoryCollection()->addAttributeToSelect('*');
foreach ($categoryCollection as $category) {
  Mage::log ($category->getData ());
}


Поделиться темой: