get an array of all categories with details in Magento
Asked Answered
A

4

6

I want to be able to call through the API to get an array of all the categories with the details like the URL key. That goal in 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 want to call out something like

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

I know that is totally made up and not real to the API but that is basically the goal. I do need the output as I showed it. Ideas on the code to achieve the need?

Anastassia answered 25/2, 2012 at 21:18 Comment(0)
D
20

This will get your values. You can build your array however you like from here.

$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 post on MagentoCommerce.com. 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();
    }
}
Dogtrot answered 25/2, 2012 at 22:55 Comment(4)
So darn close.. $url_path = $category->getUrl(); is not the url ie: where I should have had essential-accessories/massage-oils-and-tools.html I had domain.com/importScript.php/essential-accessories/… and or even domain.com/importScript.php/catalog/category/view/s/…Anastassia
Ah, try $url_path = $category->getUrlPath();Dogtrot
Was one of the first things I tried but I got "/massage-oils-and-tools" where I should have gotten "essential-accessories/massage-oils-and-tools" for the cat "Massage Oils and Tools" with the parent "Essential Accessories" ..Anastassia
Using either of normal collection or tree collection, it always fetches repeated categories, for eg. if a parent category "coffee" then it fetches, many times instead of once.Amieva
T
2

HERE I WROTE FUNCTION UPTO THREE LEVELS RETURN IN ARRAY FORMAT

$array=hpCat(2,3); //categoryID,Sublevel upto three level

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


?>
Tennant answered 16/3, 2016 at 3:44 Comment(0)
L
1

For the people looking for MySQL query to fetch 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'
)
Longitude answered 29/7, 2016 at 19:10 Comment(1)
Awesome! that did the trick for me to get selected attribute values faster.Gadroon
F
0

A recursive function to make it :

 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 than arrays to model a node but you can easily replace.

Foehn answered 4/8, 2017 at 10:55 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.