В Magento, как я могу получить список категорий в порядке, который вы видите в админке? - PullRequest
1 голос
/ 09 сентября 2011

Я могу получить список дочерних категорий для определенной категории с помощью следующего кода:

public function displaycats($data, $begin,$end, $catid){
    $currentCat = Mage::getModel('catalog/category')->load($data[0]);
    $children = explode(",",$currentCat->getChildren());

    foreach ($children as $child) {
    $cot++;
    $subCat = Mage::getModel('catalog/category')->load($child);

        if ($cot >= $begin && $cot <= $end){
            echo '<a href="'.$subCat->getUrl().'?stockable=786">'.$subCat->getName()."</a><br>";
        }
    }
    return;
}

Проблема в том, что список упорядочен не так, как в Magento категории, упорядоченные в админкеплощадь.Кто-нибудь может мне помочь?

Ответы [ 4 ]

7 голосов
/ 13 сентября 2011

Мне нравится ответ @Joe Constant, но когда я попробовал его, у меня были проблемы только с получением первого уровня дочерних категорий, даже с $recursionLevel, установленным на 0.В качестве обходного пути я написал эту функцию (поместите ее в (локальную версию) в любом блоке, в котором вам нужна отсортированная дочерняя коллекция):

public function getChildrenCollection($parentId=false, $sort='ASC', $attribute='position') 
{
  if (empty($parentId) || !is_numeric($parentId)) return false;
  $childrenArray = explode(',',Mage::getModel('catalog/category')->load($parentId)->getChildren());
  // remove parent id from array in case it gets returned
  if ($key = array_search($parentId, $childrenArray)) {
    unset($childrenArray[$key]);
  } 
  $collection = Mage::getModel('catalog/category')->getCollection()
    ->addAttributeToFilter('entity_id', array('in' => $childrenArray))
    ->addAttributeToSelect('*');

  if (!empty($sort)) {
    return $collection->setOrder($attribute, $sort);
  }
  return $collection;           
}

Затем вы можете выполнять итерацию по коллекции и делать все, что вам нужно, как это:

foreach (getChildrenCollection($parentCategoryId) as $child) {
  Zend_Debug::dump($child->getData());
}

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

2 голосов
/ 18 февраля 2013

Я только что написал что-то вроде этого, чтобы получить список категорий (по parentId), отсортированный как в admin:

$subCats = array();
$children = Mage::getModel('catalog/category')->getCategories($parentId, 1, true, true);
foreach ($children as $category)
{
    $subCats[$category->getPosition()] = $category->getId();
}
ksort($subCats);
2 голосов
/ 28 сентября 2012
    $helper     = Mage::helper('catalog/category');
    $_categories     = $helper->getStoreCategories('path', true, FALSE);

Если вы хотите отобразить категорию в следующем формате

категория 1

--- подкатегория 1a

------ подкатегория 1aa

--- подкатегория 1b

категория 2

--- подкатегория 2a

--- подкатегория 2b

    foreach($_categories as $category){
        $level = $category['level'] - 2;
        $pad = str_repeat("---", ($level > 0) ? $level : 0);

        echo $pad . ' ' . $cat['name']);
        echo '<br/>';
    }

    return $categories;
2 голосов
/ 10 сентября 2011

Взгляните на getCategories .У него есть отсортированный параметр, а также опция для возврата в качестве объекта коллекции, что устраняет необходимость повторной загрузки каждой категории из базы данных.

/**
 * Retrieve categories
 *
 * @param integer $parent
 * @param integer $recursionLevel
 * @param boolean|string $sorted
 * @param boolean $asCollection
 * @param boolean $toLoad
 * @return Varien_Data_Tree_Node_Collection|Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Collection
 */
public function getCategories($parent, $recursionLevel = 0, $sorted=false, $asCollection=false, $toLoad=true)

`

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...