Как получить категории для продукта в Magento? - PullRequest
33 голосов
/ 15 февраля 2011

Я пытаюсь добавить product_type к своему выводу в Magento Google Base на основе категорий продукта, но, похоже, не могу.У меня есть следующий код:

// Get categories from  product to include as product_type
$categoryIds = $object->getCategoryIds();
foreach($categoryIds as $categoryId) {
    $category = Mage::getModel('catalog/category')->load($categoryId);
    $this->_setAttribute('product_type', $category->getName(), 'text' );
}

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

Ответы [ 6 ]

60 голосов
/ 16 февраля 2011

Используя ссылку на источник, упавшую Рао выше, я действительно нашел лучший ответ:

$product = Mage::getModel('catalog/product')->load($productId);

$cats = $product->getCategoryIds();
foreach ($cats as $category_id) {
    $_cat = Mage::getModel('catalog/category')->load($category_id) ;
    echo $_cat->getName();
} 
46 голосов
/ 15 февраля 2011

Это совершенно не проверено ..

//load the product 

$product = Mage::getModel('catalog/product')->load($productId);

//load the categories of this product 

$categoryCollection = $product->getCategoryCollection();

Затем вы можете просмотреть $categoryCollection как через массив.*

6 голосов
/ 26 ноября 2014

Хочу отметить, что решение @Rao является лучшим, если у вас есть объект продукта для получения идентификаторов категорий, поскольку он делает только один вызов SQL.

Если у вас просто есть ID категории, вы можете сделать следующее:

$categories = Mage::getModel('catalog/category')
    ->getCollection()
    ->addAttributeToSelect('name') //you can add more attributes using this
    ->addAttributeToFilter('entity_id', array('in'=>array(1,2,3)));

foreach($categories as $_cat){
    $holder[]= $_cat->getName();
}

Где массив (1,2,3) - ваши категории. Обратите внимание, что в массиве есть целые числа, а не строковые значения, я обнаружил, что SQL может быть требователен к этому.

Также хотелось бы отметить, что решения, извлекающие по одной категории за раз, очень неэффективны, поскольку это делает вызов SQL для каждой итерации цикла, например ::10000

foreach(..){
    Mage::getModel('catalog/category')->load($categoryId);
}
5 голосов
/ 14 ноября 2013

Получить все категории товаров

<?php
    $_Product = Mage::getModel("catalog/product")->load( PRODUCT_ID );
    $categoryIds = $_Product->getCategoryIds();//array of product categories

    foreach($categoryIds as $categoryId) {
      $category = Mage::getModel('catalog/category')->load($categoryId);
      $this->_setAttribute('product_type', $category->getName(), 'text' );
   } 
?>
1 голос
/ 11 декабря 2017

Решение Рао пытается загрузить все атрибуты, что означает множество запросов и объединений, но вам нужно только product_id для загрузки его категорий. Так что вы можете сделать это:

  $product = Mage::getModel("catalog/product")->setId($productId);
  $categories = $product->getCategoryCollection();

Это не будет загружать продукт и даст вам категории.

0 голосов
/ 08 января 2019

Этот код работает в phtml файле в Magento 2

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$product = $objectManager->get('Magento\Framework\Registry')->registry('current_product');//get current product
$categories = $product->getCategoryIds(); /*will return category ids array*/  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...