2013-02-20 3 views
2

Я пытаюсь загрузить все категории, которые помечены для включения в навигацию в Magento, в том же порядке, что и на панели администратора, чтобы создать пользовательское многоуровневое меню (мы объединить вывод с другим меню, хранящимся в БД, на другие страницы).Категории загрузки Magento в порядке администратора

Это то, что я использую в функции для создания меню до сих пор:

private function generateCategories() { 

    $_root_category_id = Mage::app()->getWebsite(true)->getDefaultStore()->getRootCategoryId(); 

    $_current_children = Mage::getModel('catalog/category') 
     ->getCollection() 
     ->addAttributeToSelect('*') 
     ->addIsActiveFilter() 
     ->addLevelFilter(2) 
     ->addOrderField('position', 'asc'); 

    $i = 0; 

    $html = ''; 

    foreach($_current_children as $l0) { 
     if ($l0->getID() != $_root_category_id && $l0->getName() != '' && $l0->getIncludeInMenu()) { 

      $i++; 

      if (Mage::helper('core/url')->getCurrentUrl() == $l0->getURL()) 
       $active = ' active'; 
      else 
       $active = ''; 

      if ($l0->hasChildren()) 
       $parent = ' parent'; 
      else 
       $parent = ''; 

      $html .= '<li class=" level0' . $active . $parent . '"><a href="' . $l0->getURL() . '" class="top">' . $l0->getName() . '</a>'; 

      if ($l0->hasChildren()) { 
       $multiplier = 1; 
       $iteration = 0; 

       $level1 = ''; 
       $level1[] = ''; 

       foreach (explode(',', $l0->getChildren()) as $l1) { 

        $l1 = Mage::getModel('catalog/category')->load($l1); 

        if ($l1->getIncludeInMenu()) { 

         if (Mage::helper('core/url')->getCurrentUrl() == $l1->getURL()) 
          $active = ' active'; 
         else 
          $active = ''; 

         if ($iteration == $this->perColumn) { 
          $iteration = 0; 
          $multiplier++; 
         } 

         $iteration++; 

         $level1[] = '<span class="level1' . $active . '"><a href="' . $l1->getURL() . '" title="' . $l1->getName() . '">' . $l1->getName() . '</a></span>'; 
        } 
       } 

       unset($level1[0]); 

       $numLinks = count($level1); 
       $columns = $numLinks/$this->perColumn; 

       $html .= '<div class="border-cover"></div><div class="dropdown" style="width: ' . $this->colWidth * $multiplier . 'em;">'; 

       $used = 0; 
       $iteration = 0; 

       foreach($level1 as $link) { 
        $used++; 
        $iteration++; 

        if ($used == 1) 
         $html .= '<div class="col" style="float: left; width: ' . $this->colWidth . 'em;">'; 

        $html .= $link; 

        if ($used == 4 || $iteration == $numLinks) { 
         $html .= '</div>'; 
         $used = 0; 
        } 
       } 

       $html .= '</div>'; 
      } 

      $html .= '</li>'; 
     } 
    } 

    return $html; 

} 

Я был под впечатлением, что ->addOrderField('position', 'asc') следует фильтровать категории в том же порядке, как и в панели администратора, но это работает только на первом уровне ($l0), а не подкатегории.

Может ли кто-нибудь предложить, как это можно было бы изменить для этого?

ответ

3

Попробуйте использовать функцию getChildrenCategories() вместо getChildren, это вернет объект, а не идентификатор категории, поэтому вам не нужно будет загружать эту информацию.

Более подробную информацию можно найти на сайте Change sort order of Magento subcategories

+0

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

0
$ подкатегорий = Mage :: getModel ('каталог/категория') -> getCollection()
-> addAttributeToSelect ('имя')
-> addFieldToFilter ('parent_id', $ categoryId)
-> addAttributeToSort ('name', ASC);
?>
+0

это не про имя! –

Смежные вопросы