Как уже упоминалось, 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()
, чтобы перезагрузить коллекцию из базы данных.
Спасибо, что так работает. – Tonzkie
Используйте getAllChildren и передайте true, это вернет массив. Не нужно взорвать строку. Lyle Mcclanahan предлагает лучший совет – Tisch
awesome Спасибо! – zaw