Наиболее эффективный способ получения продукта высшей категории самого высокого уровня
Если у меня есть экземпляр модели продукта, каков наиболее эффективный способ получить категорию самого высокого уровня, т.е. наиболее близкую к корневой для этого продукта?
Если товар относится к следующим категориям, мне нужен идентификатор категории
CategoryA
CategoryC
CategoryD
CategoryB
CategoryE
CategoryF
CategoryG
3 answers
Как насчет
$topCategory = Mage::getResourceModel('catalog/category_collection')
->addIdFilter($product->getCategoryIds())
->setOrder('level', 'ASC')
->setPage(1,1)
->getFirstItem();
Это даст вам простой запрос к таблице сущностей каталога с сортировкой по индексированному столбцу.
Если вам нужно больше атрибутов, загруженных в категорию, используйте addAttributeToSelect()
в коллекции перед вызовом getFirstItem()
.
Не забывайте, что ->setPage(1,1)
без этого ограничения загружаются все категории.
$categoryIds = $product->getCategoryIds();
$categories = Mage::getResourceModel('catalog/category_collection');
$mainCategory = null;
foreach ($categoryIds as $id) {
$category = $categories->getItemById($id);
$parents = explode('/', $category->getPath());
$mainCategory = (count($parents) > 2) ? $parents[2] : $parents[1];
}
//$mainCategory - category after store root category.
Все, что вам нужно, чтобы добавить идентификатор родителя фильтр в коллекцию, для категорий верхнего уровня это 2. Один и тот же продукт может быть в нескольких категориях верхнего уровня, поэтому одного результата недостаточно:
$topCategory = Mage::getResourceModel('catalog/category_collection')
->addIdFilter($product->getCategoryIds())
->addFieldToFilter('parent_id', array('eq' => '2'));