Попытка получить дочерний объект определенной категории, который активен. Пожалуйста помоги. У меня проблемы с этим. В настоящее время я могу показать им все, но не конкретно. Поблагодарили бы за любую помощь.
$category = Mage::getModel('catalog/category')->load(2); $category->getChildCategories(); $tree = $category->getTreeModel(); $tree->load(); $ids = $tree->getCollection()->getAllIds();
вот код для загрузки активной категории
/* 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>'; } } ?>
надеюсь, это поможет вам.
Как упоминалось mhaupt, быстрее загружать коллекцию, а не каждую категорию в цикле. Но, насколько мне известно, нет необходимости вручную загружать дочерние категории. В основном это то, что уже делает $category->getChildrenCategories()
.
Существует также фильтр, чтобы получать только активные категории. Просто вызовите addIsActiveFilter()
в коллекции.
a.) Загружать активные дочерние категории через getChildren()
// 1. Get a list of all child category ids (eg "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.) Загружать активные дочерние категории с помощью 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()
чтобы перезагрузить коллекцию из базы данных.
Те, кто говорят использовать 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);
Один ответ, который написал лиякат, не должен использоваться в профессиональных магазинах, потому что он поднимает проблему с производительностью из-за множества n временных нагрузок объекта категории, скорее используйте набор категорий для этого, получите всех детей
$cat->getAllChildren()
, затем ограничьте набор категорий нужной категорией, например
$coll->addIdFilter($idFilter);
то вам не придется загружать n раз в базу данных.
Пожалуйста, имейте в виду, что нагрузки внутри циклов являются одним из наиболее часто используемых примеров неправильного кода в любых проектах Magento и для их предотвращения!
Привет, вы увидите ниже код
$category_model = Mage::getModel('catalog/category'); $_category = $category_model->load(13); $all_child_categories = $category_model->getResource()->getAllChildren($_category); print_r($all_child_categories);
Если вы хотите любое количество подкатегорий родительской категории, чем Нажмите здесь http://magentoo.blogspot.com/2014/01/get-all-subcategories-of-parent-category-magento.html