получить массив всех категорий с подробностями в Magento

Я хочу иметь возможность вызывать через API, чтобы получить массив всех категорий с такими деталями, как ключ URL. Эта цель в конце будет таким массивом

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

Поэтому я хотел бы вызвать что-то вроде

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

Я знаю, что это полностью выдумано и не соответствует API, но в основном это и есть цель. Мне нужен вывод, как я его показал. Идеи по коду для достижения нужды?


person Quantum    schedule 25.02.2012    source источник


Ответы (4)


Это получит ваши значения. Вы можете построить свой массив, как вам нравится отсюда.

$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

Я адаптировал это из сообщения на MagentoCommerce.com. Вместо этого вы можете использовать это:

$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();
    }
}
person seanbreeden    schedule 25.02.2012
comment
Так чертовски близко... $url_path = $category-›getUrl(); не является URL-адресом, то есть: где у меня должны были быть основные-аксессуары/массажные-масла-и-инструменты.html у меня был domain.com/importScript.php/essential-accessories/ и даже domain.com/importScript.php/catalog/category/view/s/ - person Quantum; 26.02.2012
comment
А, попробуй $url_path = $category->getUrlPath(); - person seanbreeden; 26.02.2012
comment
Это была одна из первых вещей, которые я попробовал, но я получил /massage-oils-and-tools вместо основных аксессуаров/massage-oils-and-tools для кошки. Массажные масла и инструменты вместе с родителем Essential Accessories.. - person Quantum; 26.02.2012
comment
Используя либо обычную коллекцию, либо древовидную коллекцию, он всегда выбирает повторяющиеся категории, например. если кофе родительской категории, то он извлекается много раз, а не один раз. - person Vicky Dev; 05.08.2016

ЗДЕСЬ Я НАПИСАЛ ФУНКЦИЮ ДО ТРЕХ УРОВНЕЙ ВОЗВРАТА В ФОРМАТЕ МАССИВА

$array=hpCat(2,3); //categoryID, подуровень до трех уровней

print_r($массив);

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


?>
person Harikaran K    schedule 16.03.2016

Для людей, которые ищут запрос MySQL для получения всех категорий 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'
)
person Umair Ayub    schedule 29.07.2016
comment
Потрясающий! это помогло мне быстрее получить выбранные значения атрибутов. - person Damodar Bashyal; 05.06.2018

Рекурсивная функция, чтобы сделать это:

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

А также

$categoriesTree=  $this->categoriesTree()

Я предпочитаю использовать объекты, а не массивы для моделирования узла, но вы можете легко заменить их.

person Pascal KOCH    schedule 04.08.2017