2012-02-25 8 views
6

Quiero ser capaz de llamar a través de la API para obtener una matriz de todas las categorías con los detalles como la clave de URL. Esa meta al final va a ser un array como estoobtener una matriz de todas las categorías con detalles en Magento

$massage_cats=array(
    array("entity_id"=>78, 
      "name"=>"Massage Oils and Tools", 
      "url_key"=>"massage-oils-and-tools", 
      "url_path"=>"essential-accessories/massage-oils-and-tools.html"), 
    array("entity_id"=>79, 
      "name"=>"Massage Oils", 
      "url_key"=>"massage-oils", 
      "url_path"=>"essential-accessories/massage-oils-and-tools/massage-oils.html") 
); 

Así que querría llamar algo así como

$massage_cats= array(); 
$allcats = Mage::getModel('catalog/cats?')->loadAll(); 
    foreach($allcats $k=>$item){ 
     array_push($massage_cats,$item->loadDetails()); 
    } 

Sé que es totalmente hecha y no es real a la API pero que es básicamente el objetivo. Necesito la salida como lo mostré. Ideas sobre el código para lograr la necesidad?

Respuesta

20

Esto obtendrá sus valores. Puedes construir tu matriz como quieras desde aquí.

$categories = Mage::getModel('catalog/category')->getCollection() 
->addAttributeToSelect('id') 
->addAttributeToSelect('name') 
->addAttributeToSelect('url_key') 
->addAttributeToSelect('url') 
->addAttributeToSelect('is_active'); 

foreach ($categories as $category) 
{ 
    if ($category->getIsActive()) { // Only pull Active categories 
     $entity_id = $category->getId(); 
     $name = $category->getName(); 
     $url_key = $category->getUrlKey(); 
     $url_path = $category->getUrl(); 
    } 
} 

EDIT

I adaptado esto desde un poste en MagentoCommerce.com. Se puede utilizar en su lugar:

$category = Mage::getModel('catalog/category'); 
$tree = $category->getTreeModel(); 
$tree->load(); 
$ids = $tree->getCollection()->getAllIds(); 
if ($ids){ 
    foreach ($ids as $id){ 
     $cat = Mage::getModel('catalog/category'); 
     $cat->load($id); 

     $entity_id = $cat->getId(); 
     $name = $cat->getName(); 
     $url_key = $cat->getUrlKey(); 
     $url_path = $cat->getUrlPath(); 
    } 
} 
+0

Tan maldito cerrar ... $ url_path = $ category-> getUrl(); no es la url ie: donde debería haber tenido essential-accessories/massage-oils-and-tools.html Tenía http://domain.com/importScript.php/essential-accessories/massage-oils-and-tools. html y/o incluso http://domain.com/importScript.php/catalog/category/view/s/in-the-shower/id/91/ –

+0

Ah, intente '$ url_path = $ category-> getUrlPath(); ' – seanbreeden

+0

Fue una de las primeras cosas que probé pero obtuve"/massage-oils-and-tools "donde debería haber obtenido" essential-accessories/massage-oils-and-tools "para el gato" Massage Oils and Tools " con el padre "Essential Accessories" ... –

1

AQUÍ escribí FUNCIÓN DE HASTA TRES NIVELES de retorno en formato de matriz

$ array = hpCat (2,3); // categoryID, subnivel hasta tres niveles

print_r ($ array);

<?php  

function hpCat($id,$level=0){ 
    if(!empty($id)){ 
     $level=empty($level)?0:$level; 
     $category = Mage::getModel('catalog/category')->load($id); 
     $levelOneItems = $category->getChildrenCategories(); 
     if (count($levelOneItems) > 0){ 
      $array=hpCatDetails($category); 
      if($level>=1): 
       $i=0; 
       foreach($levelOneItems as $levelOneItem){ 
        $array['sub'][$i]=hpCatDetails($levelOneItem);  
        $leveltwoItems=$levelOneItem->getChildrenCategories(); 
        if (count($leveltwoItems) > 0){ 
         if($level>=2): 
          $j=0; 
          foreach($leveltwoItems as $leveltwoItem){  
           $array['sub'][$i]['sub'][$j]=hpCatDetails($leveltwoItem); 
           $levelthreeItems=$leveltwoItem->getChildrenCategories(); 
           if (count($levelthreeItems) > 0){ 
            if($level>=3): 
            $k=0; 
            foreach($levelthreeItems as $levelthreeItem){  
             $array['sub'][$i]['sub'][$j]['sub'][$k]=hpCatDetails($levelthreeItem); 
             $k++; 
            } 
            endif; 
           } 
           $j++; 
          } 
         endif; 
        } 
        $i++; 
       } 
      endif; 
     } 
     return $array; 
    } 
    return array(); 
} 
function hpCatDetails($cat){ 
    return array('name'=>$cat->getName()); 
} 

$array=hpCat(2,3);//categoryID,Sublevel upto three level 
echo '<pre>';print_r($array);die(); 


?> 
+0

Muy útil :) –

0

Para las personas que buscan consulta MySQL a buscar a todas las categorías de Magento.

SELECT 
    e.entity_id AS id, 
    e.parent_id, 
    e.path, 
    e.`level`, 

IF (
    at_name.value_id > 0, 
    at_name. 
VALUE 
    , 
    at_name_default. 
VALUE 

) AS `name` 
FROM 
    `catalog_category_entity` AS `e` 
INNER JOIN `catalog_category_entity_varchar` AS `at_name_default` ON (
    `at_name_default`.`entity_id` = `e`.`entity_id` 
) 
AND (
    `at_name_default`.`attribute_id` = '41' 
) 
LEFT JOIN `catalog_category_entity_varchar` AS `at_name` ON (
    `at_name`.`entity_id` = `e`.`entity_id` 
) 
AND (
    `at_name`.`attribute_id` = '41' 
) 
0

Una función recursiva para que sea:

private function __categoriesTree($id = 2) { 
    $category = Mage::getModel('catalog/category'); 

    $_category = $category->load($id); 
    $details = new stdClass(); 
    list($details->id, $details->name, $details->urlKey, $details->level, $details->children) = [ 
     $_category->getId(), 
     $_category->getName(), 
     $_category->getUrlKey(), 
     $_category->getLevel(), 
     [] 
    ]; 

    foreach (array_filter(explode(',', $_category->getChildren())) as $childId) { 
     $details->children[] = $this->__categoriesTree($childId); 
    } 
    if (count($details->children) === 0) { 
     unset($details->children); 
    } 
    return $details; 
} 

Y

$categoriesTree= $this->categoriesTree() 

Yo prefiero usar los objetos que los arreglos para modelar un nodo, pero se puede reemplazar fácilmente.

Cuestiones relacionadas