Tôi ghi đè một lớp khối Mage_Catalog_Block_Navigation
( liên kết đến chữ ký ) để tạo một menu tùy chỉnh chỉ hiển thị các danh mục con của danh mục hiện tại.
Phương pháp bên trong renderCategoriesMenuHtml
( liên kết đến chữ ký ) Tôi đang cố gắng lấy các danh mục con của danh mục cha mẹ được chọn. Vì vậy, tôi đã thay thế mã mặc định:
foreach ($this->getStoreCategories() as $child) {
//...
}
với những điều sau đây:
/**
* @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) {
//...
}
Mã này hoạt động hoàn toàn tốt và trả về các danh mục con của cha mẹ được chọn, nhưng ngay khi tôi bật "Danh mục danh mục phẳng" , $parent
biến dường như bị bỏ qua hoàn toàn và mã đó trả về tất cả các danh mục cấp cao nhất, thay vì các danh mục phụ của danh mục có ID $parent
.
Tôi làm gì sai? getCategories
Phương pháp không nên hoạt động như nhau ngay cả khi các danh mục phẳng được bật?
BIÊN TẬP:
Câu hỏi thực sự của tôi là
- Tại sao phương pháp
getCategories
từ mô hình bỏ quaMage_Catalog_Model_Category
các tham số$parent
và$recursionLevel
khi danh mục phẳng được bật? (xem nguồn của phương pháp bên dưới) - Có nhiều phương pháp làm việc khác nhau với danh mục phẳng? Làm thế nào tôi có thể nhận ra chúng để tránh các vấn đề trong tương lai?
Tôi gọi nó như thế này bên trong phương thức renderCategoriesMenuHtml
:
$parent = 13;
$recursionLevel = 2;
$category = Mage::getModel('catalog/category');
$storeCategories = $category->getCategories($parent, $recursionLevel);
Với các danh mục không phẳng, mã này trả về các danh mục con (2 cấp độ như được chỉ định trong $recursionLevel
) của danh mục có ID 13. Nhưng với các danh mục phẳng được bật, tôi nhận được tất cả các danh mục cấp cao nhất với tất cả các danh mục phụ (không giới hạn ở giá trị cài đặt quản trị viên 'catalog/navigation/max_depth'
, không phải bởi $recursionLevel
).
Phương pháp trong mô hình 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;
}
gọi phương thức trong mô hình tài nguyên 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;
}