FLATカテゴリが有効な場合、親カテゴリのサブカテゴリを取得します


7

現在のカテゴリのサブカテゴリのみを表示するカスタムメニューを作成するために、ブロッククラスMage_Catalog_Block_Navigation署名へのリンク)をオーバーライドします。

内部メソッドrenderCategoriesMenuHtml署名へのリンク)選択した親カテゴリの子カテゴリを取得しようとしています。だから私はデフォルトのコードを置き換えました:

foreach ($this->getStoreCategories() as $child) {
    //...
}

次のように:

/**
 * @param $parent ID of category from which we start
 * @param $recursionLevel How many levels of subcategories retrieve
 * getCategories(...) is a method from model Mage_Catalog_Model_Category
 */
$category = Mage::getModel('catalog/category');
$storeCategories = $category->getCategories($parent, $recursionLevel);
foreach ($storeCategories as $child) {
    //...
}

このコードは問題なく機能し、選択した親のサブカテゴリを返しますが、「フラットカタログカテゴリ」を有効にするとすぐに、$parent変数は完全に無視されたように見え、そのコードは、IDのカテゴリのサブカテゴリではなく、すべての最上位のカテゴリを返します$parent

何が悪いのでしょうか?getCategoriesフラットカテゴリが有効になっている場合でも、メソッドは同じように機能しませんか?

編集:

私の本当の質問は

  1. getCategoriesモデルからのメソッドはなぜMage_Catalog_Model_Category パラメータ$parentを無視し$recursionLevel、フラットカテゴリが有効になっているのですか?(以下のメソッドのソースを参照してください)
  2. フラットカタログで異なる動作をするメソッドは他にありますか?今後の問題を回避するためにそれらをどのように認識できますか?

私はそれをこの内部メソッドのように呼び出しますrenderCategoriesMenuHtml

$parent = 13;
$recursionLevel = 2;
$category = Mage::getModel('catalog/category');
$storeCategories = $category->getCategories($parent, $recursionLevel);

フラットでないカテゴリでは、このコードは$recursionLevelID 13のカテゴリのサブカテゴリ(で指定されている2レベル)を返します。ただし、フラットカテゴリを有効にすると、すべてのサブカテゴリ(すべて'catalog/navigation/max_depth'ではなく、管理設定の値で制限されます)を持つすべてのトップレベルカテゴリが取得されます$recursionLevel

モデル内のメソッドMage_Catalog_Model_Category

public function getCategories($parent, $recursionLevel = 0, $sorted=false, $asCollection=false, $toLoad=true)
{
    $categories = $this->getResource()
        ->getCategories($parent, $recursionLevel, $sorted, $asCollection, $toLoad);
    return $categories;
}

リソースモデルのメソッドを呼び出しますMage_Catalog_Model_Resource_Category

public function getCategories($parent, $recursionLevel = 0, $sorted = false, $asCollection = false, $toLoad = true)
{
    $tree = Mage::getResourceModel('catalog/category_tree');
    /* @var $tree Mage_Catalog_Model_Resource_Category_Tree */
    $nodes = $tree->loadNode($parent)
        ->loadChildren($recursionLevel)
        ->getChildren();

    $tree->addCollectionData(null, $sorted, $parent, $toLoad, true);

    if ($asCollection) {
        return $tree->getCollection();
    }
    return $nodes;
}

回答:


8
$_category = Mage::getModel('catalog/category')->load(CATEGORY-ID);    
    $_categories = $_category
                    ->getCollection()
                    ->addAttributeToSelect(array('name', 'image', 'description'))
                    ->addIdFilter($_category->getChildren());

    foreach ($_categories as $_category):
       echo $_category->getName();
    endforeach;

質問を編集しました。
zitix 2013

男、私のお尻を助けてくれてありがとう これはすばらしいトリックです。$ _ category-> getChildren()は、コンマで区切られたカテゴリIDの文字列を返します。これを使用して、addIdFilter()でフィルタリングできます。スマート:)
シリコンロックスター2014

2
<?php 
$parentCategoryId = 107;
$cat = Mage::getModel('catalog/category')->load($parentCategoryId);
$subcats = $cat->getChildren();

?>

// Get 1 Level sub category of Parent category.

<?php 

foreach(explode(',',$subcats) as $subCatid)
              {
                $_category = Mage::getModel('catalog/category')->load($subCatid);
  if($_category->getIsActive()) {
    echo '<ul><a href="'.$_category->getURL().'" title="View the products for the "'.$_category->getName().'" category">'.$_category->getName().'</a>';
   echo '</ul>';
  }
}

?>

親カテゴリの2レベル、3レベル、4レベル、またはnレベルのサブカテゴリが必要な場合は、 ここをクリックしてください


問題は解決する可能性がありますが、すべての負荷がパフォーマンスに悪影響を与えるため、注意してください
Fabian Blechschmidt 2014年

すべてのカテゴリをロードする理由は、カテゴリIDを使用し、特定のカテゴリのみコンテンツをロードするだけです
user3146094
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.