Get an array of all categories with details in Magento

I want to be able to call through the API to get an array of all categories with details such as a URL key. This target at the end will be an array like this

$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") ); 

So, I would like to call something like

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

I know that this is completely composed and does not comply with the API, but this is basically the goal. I need a conclusion, as I showed it. Ideas for code to meet your needs?

+6
source share
4 answers

This will lead to your values. You can build your array as you like.

 $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 adapted this from a MagentoCommerce.com post . You can use this instead:

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

HERE I INCLUDE THE FUNCTION AT THREE LEVELS RETURNED TO THE SMALL FORMAT

$ = array hpCat (2,3); // categoryID, Sublevel up to three levels

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(); ?> 
+1
source

For people who are looking for a MySQL query to retrieve all Magento categories.

 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
source

Recursive function:

  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; } 

AND

 $categoriesTree= $this->categoriesTree() 

I prefer to use objects other than arrays to model the node, but you can easily replace it.

0
source

Source: https://habr.com/ru/post/909366/


All Articles