在Magento中,如何按照您在管理区域中看到的顺序获取类别列表?

时间:2011-09-09 19:29:55

标签: magento

我可以使用以下代码获取特定类别的子类别列表:

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 个答案:

答案 0 :(得分:7)

我喜欢@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());
}

希望有所帮助。

答案 1 :(得分:2)

请改为使用 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)

`

答案 2 :(得分:2)

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

答案 3 :(得分:2)

我刚刚写了这样的东西来获取类别列表(通过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);