12

试图获取处于活动状态的特定类别的孩子。请帮忙。我很难做到这一点。我目前能够全部展示它们,但不是特别展示。将不胜感激任何帮助。

$category = Mage::getModel('catalog/category')->load(2);
$category->getChildCategories();
$tree = $category->getTreeModel();
$tree->load();
$ids = $tree->getCollection()->getAllIds();
4

6 回答 6

36

这是加载活动类别的代码

/* Load category by id*/
$cat = Mage::getModel('catalog/category')->load($id);


/*Returns comma separated ids*/
$subcats = $cat->getChildren();

//Print out categories string
#print_r($subcats);

foreach(explode(',',$subcats) as $subCatid)
{
  $_category = Mage::getModel('catalog/category')->load($subCatid);
  if($_category->getIsActive())
  {
    $caturl     = $_category->getURL();
    $catname     = $_category->getName();
    if($_category->getImageUrl())
    {
      $catimg     = $_category->getImageUrl();
    }
    echo '<h2><a href="'.$caturl.'" title="View the products for this category"><img src="'.$catimg.'" alt="" />'.$catname.'</a></h2>';
  }
}
?>

希望这对你有帮助。

于 2013-08-30T05:30:38.007 回答
13

正如 mhaupt 所提到的,加载集合比加载循环中的每个类别更快。但是,就我而言,没有必要手动加载子类别。基本上这是$category->getChildrenCategories()已经做的。

还有一个过滤器仅用于获取活动类别。只需调用addIsActiveFilter()集合。

a.) 通过加载活动子类别getChildren()

// 1. Get a list of all child category ids (e.g "12,23,11,42")
$subcategoryIds = $category->getChildren();

// 2. Create collection
$categoryCollection = Mage::getModel('catalog/category')->getCollection();

// 3. Add all attributes to select, otherwise you can not 
//    access things like $cat->getName() etc.
$categoryCollection->addAttributeToSelect('*');

// 4. Filter by ids
$categoryCollection->addIdFilter($subcategoryIds);

// 5. Add filter to collection to get active categories only
$categoryCollection->addIsActiveFilter();

b.) 加载活动子类别getChildrenCategories()

// 1. Load collection
$categoryCollection= $category->getChildrenCategories();

// 2. Add filter to collection to get active categories only
$categoryCollection->addIsActiveFilter();

一旦访问该集合,它将立即从数据库中加载。如果集合未加载并且$subcategories->count()被调用,则只会对数据库触发“SELECT count(*)”(与之相反count($subcategories),它将强制集合自行加载)。

迭代集合

foreach($categoryCollection as $category) {
    echo $category->getName();
}

如果您在访问集合后向集合添加更多过滤器,则集合不会再次自动加载。要对集合应用更改,只需调用$categoryCollection->load()从数据库重新加载集合。

于 2014-04-17T08:17:54.013 回答
5

那些说使用 getAllChildren() 而不是 getChildren() 的人是完全错误的。两种方法都返回完全相同的内容,但有一个区别,getAllChildren(true) 将返回一个数组而不是逗号分隔的字符串。getAllChildren($bool asArray) 默认为 false。我的观点是,无论哪种方式,您都必须使用

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

除非您使用下面的函数,否则在循环内部。

private function fetchCatsById($onlyThese)
{
    $cats = Mage::getModel('catalog/category')
                ->getCollection(true)
                ->addAttributeToSelect('*')
                ->addIdFilter($onlyThese)
                ->addAttributeToFilter('level','2')
                ->addIsActiveFilter();

    return $cats;
}

$cats = $this->fetchCatsById($onlyThese);
于 2014-09-19T13:40:19.853 回答
2

liyakat 写的一个答案,不应该在专业商店中使用,因为它会引发性能问题,因为类别对象的多次 n 时间加载,而是为此使用类别集合,获取所有子项

$cat->getAllChildren()

,然后通过所需的类别 id 来限制类别集合,例如

$coll->addIdFilter($idFilter);

那么您不必对数据库加载 n 次。

请记住,循环内的加载是任何 Magento 项目中最常用的错误代码示例之一,请避免它们!

于 2014-03-23T18:46:51.430 回答
1

你好你会看到下面的代码

$category_model = Mage::getModel('catalog/category'); 
  $_category = $category_model->load(13); 
  $all_child_categories = $category_model->getResource()->getAllChildren($_category);
  print_r($all_child_categories);
于 2013-08-30T05:50:18.977 回答
1

如果您想要任何数量的父类别的子类别,请单击此处http://magento.blogspot.com/2014/01/get-all-subcategories-of-parent-category-magento.html

于 2014-02-03T10:02:35.573 回答