Я пытаюсь добавить 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' ); }
Проблема в том, что он возвращает все категории, а не только те, в которых находится продукт. У любого есть решение?
Используя исходную ссылку, вышедшую из-за Рао, я нашел лучший ответ:
$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(); }
Это совершенно не проверено.
//load the product $product = Mage::getModel('catalog/product')->load($productId); //load the categories of this product $categoryCollection = $product->getCategoryCollection();
Затем вы можете выполнить цикл $categoryCollection
как через массив.
источник
Получить все категории продукта
<?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' ); } ?>
Хотите указать, что решение @Rao является лучшим, если у вас есть объект продукта, чтобы получить идентификаторы категории, поскольку он делает только один вызов SQL.
Если у вас просто есть идентификаторы категории, вы можете сделать следующее:
$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 для каждой итерации цикла, например:
foreach(..){ Mage::getModel('catalog/category')->load($categoryId); }
Решение Rao пытается загрузить все атрибуты, что означает множество запросов и объединений, но вам нужно только product_id
для загрузки его категорий. Таким образом, вы можете сделать это:
$product = Mage::getModel("catalog/product")->setId($productId); $categories = $product->getCategoryCollection();
Это не загрузит продукт и предоставит вам категории.