it-swarm.com.ru

Получить ребенка категории magento

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

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

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

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

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

34
liyakat

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

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

a.) Загружать активные дочерние категории через 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.) Загружать активные дочерние категории с помощью 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(), чтобы перезагрузить коллекцию из базы данных.

12
Andreas Riedmüller

Те, кто говорят использовать 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);
5
oasisfleeting

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

$cat->getAllChildren()

затем ограничьте коллекцию категорий необходимыми идентификаторами категорий, такими как 

$coll->addIdFilter($idFilter);

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

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

2
mhaupt

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

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

Если вы хотите любое количество подкатегорий родительской категории, чем нажмите здесь http://magentoo.blogspot.com/2014/01/get-all-subcategories-of-parent-category-magento.html

0
user3146094