web-dev-qa-db-fra.com

Comment obtenir des catégories pour un produit dans Magento

J'essaie d'ajouter product_type à la sortie de Magento Google Base en fonction des catégories du produit, mais il semble que je ne puisse pas. J'ai le code suivant:

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

Le problème est qu'il renvoie toutes des catégories, pas seulement celles dans lesquelles se trouve le produit. Quelqu'un a-t-il une solution?

33
Joost de Valk

En utilisant le lien source supprimé par Rao ci-dessus, j'ai trouvé une meilleure réponse:

$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();
} 
60
Joost de Valk

Ceci n'est absolument pas testé ..

//load the product 

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

//load the categories of this product 

$categoryCollection = $product->getCategoryCollection();

Vous pouvez ensuite parcourir $categoryCollection comme dans un tableau.

la source

45
Rao

Obtenir toutes les catégories du produit

<?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
ravi patel

Voulez-vous souligner que la solution de @Rao est la meilleure si vous avez un objet de produit à partir duquel obtenir les ID de catégorie car il ne fait qu'un seul appel SQL.

Si vous ne possédez que des identifiants de catégorie, vous pouvez procéder comme suit:

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

Où tableau (1,2,3) sont vos catégories. Notez que le tableau a des entiers, pas des valeurs de chaîne, j'ai trouvé que SQL peut être difficile à ce sujet.

Voulait également souligner que les solutions tirant une catégorie à la fois sont très inefficaces car elles effectuent un appel SQL à chaque itération de la boucle, par exemple:

foreach(..){
    Mage::getModel('catalog/category')->load($categoryId);
}
5
augsteyer

La solution de Rao tente de charger tous les attributs, ce qui signifie beaucoup de requêtes et de jointures, mais vous n'avez besoin que d'un product_id pour charger ses catégories. Donc, vous pouvez faire ceci: 

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

Cela ne chargera pas le produit et vous donnera les catégories. 

1
shampoo

Ce code fonctionne dans un fichier phtml dans 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*/  
0
swapnil Nandanwar