2013-08-30 29 views
9

Cố gắng đưa con của một danh mục cụ thể đang hoạt động. Hãy giúp tôi. Tôi gặp khó khăn khi làm điều đó. Tôi hiện có thể hiển thị tất cả nhưng không cụ thể. Sẽ đánh giá cao sự giúp đỡ nào.Tải các danh mục con magento

$category = Mage::getModel('catalog/category')->load(2); 
$category->getChildCategories(); 
$tree = $category->getTreeModel(); 
$tree->load(); 
$ids = $tree->getCollection()->getAllIds(); 

Trả lời

33

đây là mã để tải danh mục hiện hoạt

/* 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>'; 
    } 
} 
?> 

niềm hy vọng này chắc chắn giúp bạn.

+0

Cảm ơn bạn rất nhiều nó hoạt động ngay bây giờ. – Tonzkie

+1

Sử dụng getAllChildren và chuyển giá trị true thành nó, điều này sẽ trả về một mảng. Không cần phải phát nổ chuỗi. Lyle Mcclanahan cung cấp lời khuyên tốt nhất – Tisch

+0

cảm ơn tuyệt vời! – zaw

1

Xin chào bạn sẽ thấy bên dưới đang

$category_model = Mage::getModel('catalog/category'); 
    $_category = $category_model->load(13); 
    $all_child_categories = $category_model->getResource()->getAllChildren($_category); 
    print_r($all_child_categories); 
2

Một câu trả lời liyakat viết, không nên được sử dụng trong các cửa hàng chuyên nghiệp, vì nó làm tăng vấn đề hiệu suất, vì tải nhiều thời gian n của đối tượng danh mục, thay vì sử dụng tập hợp các danh mục cho điều đó, nhận tất cả trẻ em

$cat->getAllChildren() 

, sau đó hạn chế việc thu loại bởi id loại cần thiết như

$coll->addIdFilter($idFilter); 

sau đó bạn sẽ không cần phải tải n lần so với cơ sở dữ liệu.

Hãy nhớ rằng tải trong vòng lặp là một trong những ví dụ mã xấu thường được sử dụng nhất trong bất kỳ dự án Magento nào và để tránh chúng!

12

Như đã đề cập bởi mhaupt, tải bộ sưu tập nhanh hơn là mỗi danh mục trong một vòng lặp. Nhưng, theo như tôi lo ngại, không cần phải tải các danh mục con theo cách thủ công. Về cơ bản đây là những gì $category->getChildrenCategories() đã làm.

Ngoài ra còn có bộ lọc để chỉ nhận danh mục hoạt động. Chỉ cần gọi addIsActiveFilter() trên bộ sưu tập.

a.) Tải trọng hoạt động chủ đề con qua 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.) Tải chủ đề con tích cực với getChildrenCategories()

// 1. Load collection 
$categoryCollection= $category->getChildrenCategories(); 

// 2. Add filter to collection to get active categories only 
$categoryCollection->addIsActiveFilter(); 

Bộ sưu tập sẽ được nạp dưới dạng cơ sở dữ liệu trong thời gian sớm vì nó được truy cập. Nếu bộ sưu tập không được tải và $subcategories->count() chỉ được gọi là "số lượng SELECT (*)" sẽ được kích hoạt đối với cơ sở dữ liệu (trái ngược với count($subcategories) sẽ buộc bộ sưu tập tải chính nó).

Iterating bộ sưu tập

foreach($categoryCollection as $category) { 
    echo $category->getName(); 
} 

Nếu bạn thêm nhiều bộ lọc để bộ sưu tập sau khi truy cập vào nó, bộ sưu tập sẽ không tải bản thân lại tự động. Để áp dụng các thay đổi cho bộ sưu tập, chỉ cần gọi $categoryCollection->load() để tải lại bộ sưu tập từ cơ sở dữ liệu.

+0

'getChildrenCategories' sẽ cung cấp cho bạn bộ sưu tập * đã tải * và * đang hoạt động * (xem 'Mage_Catalog_Model_Resource_Category :: getChildrenCategories()'). Không chỉ 'addIsActiveFilter' thừa, nhưng vô dụng, như bất kỳ cuộc gọi thay đổi bộ sưu tập nào khác sau đó, bởi vì bộ sưu tập đã được nạp. Có lẽ phương thức này tốt hơn: '\ Mage_Catalog_Model_Category :: getCategories ($ parent, $ recursionLevel = 0, $ sort = false, $ asCollection = false, $ toLoad = true)'. – nevvermind

5

Những người đang nói sử dụng getAllChildren() thay vì getChildren() đơn giản là sai. Cả hai phương thức trả về cùng một điều, với một sự khác biệt, getAllChildren (true) sẽ trả về một mảng thay vì một chuỗi được phân tách bằng dấu phẩy. getAllChildren ($ bool asArray) mặc định là false. Quan điểm của tôi là bạn sẽ phải sử dụng

Mage::getModel('catalog/category')->load($catId); 

bên trong vòng lặp trừ khi bạn sử dụng chức năng bên dưới.

private function fetchCatsById($onlyThese) 
{ 
    $cats = Mage::getModel('catalog/category') 
       ->getCollection(true) 
       ->addAttributeToSelect('*') 
       ->addIdFilter($onlyThese) 
       ->addAttributeToFilter('level','2') 
       ->addIsActiveFilter(); 

    return $cats; 
} 

$cats = $this->fetchCatsById($onlyThese); 
+0

Đây là cách thích hợp để làm điều đó, xấu hổ nó cuối cùng ở đây –

Các vấn đề liên quan