2011-02-15 3 views
32

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

// 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'); 
} 

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

+0

Этот вопрос более подходит для переполнения стека. – Christopher

ответ

40

Это совершенно не тестировалось ..

//load the product 

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

//load the categories of this product 

$categoryCollection = $product->getCategoryCollection(); 

Вы можете затем цикл через $categoryCollection как через массив.

source

+1

Это должно быть правильное решение - с помощью коллекции вы используете запрос, а не (по крайней мере) 1 запрос для каждой категории. (см. «Mage_Catalog_Model_Resource_Product :: getCategoryCollection') –

+0

' getCategoryCollection() 'не содержит названия категории как части его выбора. – dchayka

+1

Это может сделать, однако, коллекции расширяемы. Попробуйте 'getCategoryCollection() -> addAttributeToSelect ('name')' (note: untested) –

55

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

$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(); 
} 
+0

Это своего рода правильный ответ, но он никогда не был отмечен как правильный. – ShaunOReilly

+0

Я нахожусь в том же .., но там, где я должен поставить этот код .. Я, какая папка .. может у дать мне путь? Мне нужен список категорий в формате json. как я могу это получить? –

+14

не делайте этого, используйте решение Rao, это экономит много SQL-запросов! –

5

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

<?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'); 
    } 
?> 
5

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

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

$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); 
} 
0

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

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

Это не загрузит продукта и предоставит информацию о всех категориях.

Смежные вопросы