2011-02-15 11 views
32

Estoy tratando de agregar product_type a mi salida de Magento Google Base en función de las categorías del producto, pero parece que no puedo. Tengo el siguiente código:Cómo obtengo categorías para un producto en 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'); 
} 

La cuestión es que se vuelve todo de las categorías, no sólo las que el producto está en Alguien tiene una solución.?

+0

Esta pregunta se hace más apropiadamente en Desbordamiento de pila. – Christopher

Respuesta

40

Esta completamente no se ha probado ..

//load the product 

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

//load the categories of this product 

$categoryCollection = $product->getCategoryCollection(); 

A continuación, puede bucle a través de $categoryCollection como a través de una matriz.

source

+1

Esta debería ser la solución correcta: al usar la colección, utiliza una combinación en lugar de (al menos) 1 consulta por categoría. (ver: 'Mage_Catalog_Model_Resource_Product :: getCategoryCollection') –

+0

' getCategoryCollection() 'no contiene el nombre de la categoría como parte de su selección. – dchayka

+1

Puede hacer, sin embargo, las colecciones son extensibles. Pruebe 'getCategoryCollection() -> addAttributeToSelect ('name')' (note: no probado) –

55

Utilizando el enlace de la fuente caído por Rao por encima de hecho, encontré una respuesta mejor:

$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

Esta es una especie de respuesta correcta, pero nunca se marcó como correcta. – ShaunOReilly

+0

Estoy en busca de lo mismo ... pero donde tengo que colocar este código ... ¿En qué carpeta ... puedes darme el camino? Quiero la lista de categorías en formato json. ¿Cómo puedo conseguir esto? –

+14

no hagas esto, utiliza la solución de Rao, ¡esto ahorra muchas consultas SQL! –

5

Consigue todas las categorías del producto

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

queremos señalar que la solución de @Rao es la mejor si tiene un objeto de producto para obtener ID de categoría, ya que solo hace una cal SQL l.

Si sólo tiene la categoría ID, puede hacer lo siguiente:

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

Dónde array (1,2,3) son sus categorías. Tenga en cuenta que la matriz tiene enteros, no valores de cadena, encontré que SQL puede ser quisquilloso con eso.

también ha querido señalar que las soluciones que tiran de una categoría a la vez son muy ineficientes, ya que hace una llamada de SQL para cada iteración del bucle, por ejemplo:

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

solución de Rao intenta cargar todos los atributos que significa muchas consultas y combinaciones, pero solo necesita un product_id para cargar sus categorías. Así que usted puede hacer esto:

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

Esto no va a cargar el producto y le dará las categorías.

Cuestiones relacionadas