Magento - получить родительскую категорию и все подкатегории - PullRequest
4 голосов
/ 06 апреля 2011

У меня есть одна категория, которая имеет 2 подкатегории.В каждой из этих категорий есть 5 подкатегорий.

Есть ли способ получить список всех этих 10 подкатегорий?

Спасибо

РЕДАКТИРОВАТЬ:

Примерно так:

  Main Category
       Sub_Cat_1
            Cat_1
            Cat_2
            Cat_3
       Sub_Cat_2
            Cat_4
            Cat_5
            Cat_6

  Wanting output like:

  Cat_1
  Cat_2
  Cat_3
  Cat_4
  Cat_5
  Cat_6

Спасибо

Ответы [ 5 ]

15 голосов
/ 02 февраля 2015

Все ответы до сих пор загружают дочерние категории в цикле, что, как правило, является плохой практикой и вызывает выполнение многих SQL-запросов, для которых достаточно одного.

Совершенное решение для одного запроса:

Пусть$parentCategory будет вашей главной категорией , тогда эта коллекция загрузит все подкатегории, двумя уровнями ниже:

$subcategoryCollection = Mage::getModel('catalog/category')
    ->getCollection()
    ->addFieldToFilter('level', $parentCategory->getLevel() + 2)
    ->addFieldToFilter('path', ['like' => $parentCategory->getData('path') . '/%']);

Поле path содержит идентификатор категории с префиксом всех идентификаторов предков вформа 1/2/3.Для базы данных это столбец в catalog_category_entity, который имеет индекс, поэтому при таком сравнении проблем с производительностью нет.

5 голосов
/ 06 апреля 2011

Разобрался:

$cat = Mage::getModel('catalog/category')->load(24);
$subcats = $cat->getChildren();

foreach(explode(',',$subcats) as $subCatid)
{
  $_category = Mage::getModel('catalog/category')->load($subCatid);
  if($_category->getIsActive()) {
    $sub_cat = Mage::getModel('catalog/category')->load($_category->getId());
    $sub_subcats = $sub_cat->getChildren();
    foreach(explode(',',$sub_subcats) as $sub_subCatid)
    {
          $_sub_category = Mage::getModel('catalog/category')->load($sub_subCatid);
          if($_sub_category->getIsActive()) {
              echo '<li class="sub_cat"><a href="'.$_sub_category->getURL().'" title="View the products for the "'.$_sub_category->getName().'" category">'.$_sub_category->getName().'</a></li>';
          }
     }
  }
}

Спасибо за внимание!

3 голосов
/ 30 января 2015

Я разработал рекурсивную функцию, чтобы получить всех детей категории

$categoryObject = Mage::getModel('catalog/category')->load(CATID);
$children = MODEL_OBJECT->getChildCategories($categoryObject);

// IN MODLE FILE
public $_catIds = array();

public function getChildCategories($categoryObject){
    $categories = $categoryObject->getChildrenCategories();
    foreach ($categories as $catgory){
        if($catgory->hasChildren()){
            $this->getChildCategories($catgory);
        }
            $this->_catIds[] = $catgory->getId();
    }
    return $this->_catIds;
}

Надеюсь, это поможет вам.

0 голосов
/ 28 мая 2013

Я рекурсивно нахожу идентификатор категории предков. Найдя его, я могу распечатать текущие подкатегории категорий. Если в текущей категории нет детей, то я просто напечатаю подкатегорию отца. Таким образом, вы можете иметь бесконечные подкатегории и по-прежнему иметь возможность отображать список подкатегорий.

             $_helper = Mage::helper("catalog/category"); 
             $rootCat = Mage::app()->getStore()->getRootCategoryId();
             $current = Mage::registry('current_category');

            show_cat($current,$_helper,$rootCat);

            function show_cat($child,$_helper,$rootCat){

                 if ($child){
                    //look for anchestor 
                    $parentid = $child->getParentId();
                    $parent = Mage::getModel("catalog/category")->load($parentid); 
                    if($parentid != $rootCat)
                    {   
                        //find the anchestor
                        show_cat($parent,$_helper,$rootCat);
                    }else{
                        //is root 
                        $_subcategories = $parent->getChildrenCategories();
                        if(count($_subcategories)>0){
                            echo '<ul>';
                                    foreach($_subcategories as $_category){
                                        echo '<li>';
                                        echo '<a href="'.$_helper->getCategoryUrl($_category).'">'.$_category->getName().'</a>';

                                            if($child->getId() == $_category->getId()){
                                                $current = Mage::registry('current_category');
                                                if ($current){
                                                    //handle current
                                                    $_current_subcategories = $current->getChildrenCategories();
                                                        if(count($_current_subcategories)>0){
                                                            //the current cat has childrens
                                                            echo '<ul>';
                                                            foreach($_current_subcategories as $_sub_category){
                                                                echo '<li>';
                                                                echo '<a href="'.$_helper->getCategoryUrl($_sub_category).'">'.$_sub_category->getName().'</a>';
                                                                echo '</li>';
                                                            }
                                                            echo '</ul>';
                                                        }else{
                                                            //the current cat has no childrens
                                                            $current_parent = $current->getParentId();
                                                            $current_parent  = Mage::getModel("catalog/category")->load($current_parent ); 
                                                            $_current_subcategories = $current_parent ->getChildrenCategories();
                                                            echo '<ul>';
                                                                foreach($_current_subcategories as $_sub_category){
                                                                    echo '<li>';
                                                                    echo '<a href="'.$_helper->getCategoryUrl($_sub_category).'">'.$_sub_category->getName().'</a>';
                                                                    echo '</li>';
                                                                }
                                                            echo '</ul>';
                                                            }
                                                    }
                                                }
                                        echo '</li>';
                                        }
                                echo '</ul>';
                            }
                        }
                }
            }
0 голосов
/ 27 июня 2012
$this->getCurrentCategory()->getParentCategory()->getData();

попробуйте это

...