Nhận các danh mục con của danh mục chính khi danh mục FLAT được bật


7

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" , $parentbiế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? getCategoriesPhươ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à

  1. Tại sao phương pháp getCategoriestừ mô hình bỏ qua Mage_Catalog_Model_Category các tham số $parent$recursionLevelkhi danh mục phẳng được bật? (xem nguồn của phương pháp bên dưới)
  2. 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;
}

Câu trả lời:


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;

Tôi đã chỉnh sửa câu hỏi của tôi.
zitix

Man, bạn đã lưu ass của tôi, cảm ơn bạn. Đó là một mẹo gọn gàng - $ _c Category-> getChildren () trả về một chuỗi id danh mục được phân tách bằng dấu phẩy mà sau đó bạn có thể sử dụng để lọc qua addIdFilter (). Thông minh :)
siliconrockstar

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>';
  }
}

?>

Nếu bạn muốn các danh mục con 2 cấp, 3 cấp, 4 cấp hoặc n Cấp của danh mục phụ hơn Nhấp vào đây


Có thể giải quyết vấn đề, nhưng tất cả các tải đều không tốt cho hiệu suất, vì vậy hãy cẩn thận
Fabian Blechschmidt

tại sao bạn tải tất cả danh mục chỉ sử dụng id danh mục và chỉ tải nội dung chỉ danh mục cụ thể
user3146094 6/214
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.