現在のカテゴリのサブカテゴリのみを表示するカスタムメニューを作成するために、ブロッククラス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
フラットカテゴリが有効になっている場合でも、メソッドは同じように機能しませんか?
編集:
私の本当の質問は
getCategories
モデルからのメソッドはなぜMage_Catalog_Model_Category
パラメータ$parent
を無視し$recursionLevel
、フラットカテゴリが有効になっているのですか?(以下のメソッドのソースを参照してください)- フラットカタログで異なる動作をするメソッドは他にありますか?今後の問題を回避するためにそれらをどのように認識できますか?
私はそれをこの内部メソッドのように呼び出しますrenderCategoriesMenuHtml
:
$parent = 13;
$recursionLevel = 2;
$category = Mage::getModel('catalog/category');
$storeCategories = $category->getCategories($parent, $recursionLevel);
フラットでないカテゴリでは、このコードは$recursionLevel
ID 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;
}