2013-08-30 3 views
9

Попытка получить дочерние объекты определенной категории, которая активна. Пожалуйста помоги. У меня проблемы с этим. В настоящее время я могу показать им все, но не конкретно. Поблагодарили бы за любую помощь.Получить категории детей magento

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

ответ

33

здесь код для загрузки активная категория

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

надеюсь, что это, несомненно, поможет вам.

+0

Спасибо, что так работает. – Tonzkie

+1

Используйте getAllChildren и передайте true, это вернет массив. Не нужно взорвать строку. Lyle Mcclanahan предлагает лучший совет – Tisch

+0

awesome Спасибо! – zaw

1

Здравствуйте, вы увидите ниже код

$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

Один ответ liyakat писал, не должны использоваться в профессиональных магазинах, потому что он поднимает проблему с производительностью из-за множества n временных нагрузок объекта категории, скорее используйте набор категорий для этого, получите всех детей

$cat->getAllChildren() 

, а затем ограничить сбор категории по категории необходимых идентификаторами как

$coll->addIdFilter($idFilter); 

, то вам не придется загружать п раз в базе данных.

Пожалуйста, имейте в виду, что нагрузки внутри циклов являются одним из наиболее часто используемых примеров плохого кода в любых проектах Magento и для их предотвращения!

12

Как уже упоминалось, mhaupt быстрее загружает коллекцию, а не каждую категорию в цикле. Но, насколько мне известно, нет необходимости вручную загружать дочерние категории. В основном это то, что уже делает $category->getChildrenCategories().

Существует также фильтр, позволяющий получать только активные категории. Просто позвоните addIsActiveFilter() в коллекцию.

а.) Активная нагрузка дочерних категории через 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(); 

б.) Нагрузка активных детей категорию с getChildrenCategories()

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

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

коллекции будут загружены из базы данных, как только по мере его доступа. Если коллекция не загружена и $subcategories->count() вызывается только «SELECT count (*)», будет запущена против базы данных (в отличие от count($subcategories), которая заставит сборку загружать себя).

Итерируя коллекцию

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

Если добавить несколько фильтров в коллекцию после доступа к ней, коллекция не будет загружать себя снова автоматически. Чтобы применить изменения к коллекции, просто вызовите $categoryCollection->load(), чтобы перезагрузить коллекцию из базы данных.

+0

'getChildrenCategories' предоставит вам * загруженную * и * активную фильтрацию * коллекцию (см. 'Mage_Catalog_Model_Resource_Category :: getChildrenCategories()'). Не только 'addIsActiveFilter' является избыточным, но и бесполезным, как и любой другой последующий вызов, изменяющий коллекцию, потому что коллекция уже загружена. Возможно, этот метод лучше: '\ Mage_Catalog_Model_Category :: getCategories ($ parent, $ recursionLevel = 0, $ sorted = false, $ asCollection = false, $ toLoad = true)'. – nevvermind

5

Те, кто говорят использовать getAllChildren() вместо getChildren(), просто ошибаются. Оба метода возвращают то же самое, с одной разницей, getAllChildren (true) вернет массив вместо строки с разделителями-запятыми. getAllChildren ($ bool asArray) по умолчанию имеет значение false. Моя точка зрения заключается в том, что в любом случае вам придется использовать

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

внутри цикла, если вы не используете приведенную ниже функцию.

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

Это правильный способ сделать это, стыдно, что это последнее место здесь –

Смежные вопросы