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

getChildren() の代わりに getAllChildren() を使用すると言っている人は、単に間違っています。どちらのメソッドもまったく同じものを返しますが、1 つの違いがあります。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 が書いた 1 つの回答は、パフォーマンスの問題が発生するため、プロのショップでは使用しないでください。カテゴリ オブジェクトの n 回の読み込みが複数回行われるため、代わりにカテゴリのコレクションを使用して、すべての子を取得します。

$cat->getAllChildren()

のように、必要なカテゴリ ID によってカテゴリ コレクションを制限します。

$coll->addIdFilter($idFilter);

そうすれば、データベースに対して n 回ロードする必要はありません。

ループ内のロードは、Magento プロジェクトで最も頻繁に使用される不適切なコード例の 1 つであり、回避する必要があることに注意してください。

于 2014-03-23T18:46:51.430 に答える
1

親カテゴリのサブカテゴリがいくつでも必要な場合は、ここをクリックしてください http://magentoo.blogspot.com/2014/01/get-all-subcategories-of-parent-category-magento.html

于 2014-02-03T10:02:35.573 に答える