web-dev-qa-db-fra.com

Obtenir les catégories enfants magento

Essayer d'obtenir un enfant d'une catégorie spécifique qui est active. S'il vous plaît aider. J'ai du mal à le faire. Je suis actuellement en mesure de les montrer tous mais pas spécifiquement. J'apprécierais toute aide.

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

voici le code pour charger la catégorie active

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

espérons que cela vous aidera.

34
liyakat

Comme mentionné par mhaupt, il est plus rapide de charger une collection plutôt que chaque catégorie dans une boucle. Mais, en ce qui me concerne, il n’est pas nécessaire de charger manuellement les catégories enfants. En gros, c’est ce que $category->getChildrenCategories() fait déjà.

Il existe également un filtre pour obtenir uniquement les catégories actives. Il suffit d'appeler addIsActiveFilter() sur la collection.

a.) Chargez les catégories enfants actives via 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.) Chargez les catégories enfants actives avec getChildrenCategories()

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

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

La collection sera chargée de la base de données dès son accès. Si la collection n'est pas chargée et que $subcategories->count() est appelé, seul un "nombre SELECT (*)" sera envoyé à la base de données (contrairement à count($subcategories) qui obligera la collection à se charger elle-même).

Itérer la collection

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

Si vous ajoutez d'autres filtres à la collection après y avoir accédé, la collection ne se chargera plus automatiquement. Pour appliquer les modifications à la collection, appelez simplement $categoryCollection->load() pour recharger la collection à partir de la base de données.

12

Ceux qui disent utiliser getAllChildren () au lieu de getChildren () ont tout simplement tort. Les deux méthodes renvoient exactement la même chose, avec une différence, getAllChildren (true) renverra un tableau au lieu d'une chaîne délimitée par des virgules. getAllChildren ($ bool asArray) est défini par défaut sur false. Mon point étant que de toute façon vous allez devoir utiliser 

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

dans une boucle, sauf si vous utilisez la fonction ci-dessous.

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

La seule réponse écrite par liyakat, ne devrait pas être utilisée dans les magasins professionnels, car elle pose un problème de performances, en raison des multiples charges de temps n de l’objet category, utilisez plutôt la collection de catégories pour cela, obtenez tous les enfants 

$cat->getAllChildren()

, puis limitez la collection de catégories par les identifiants de catégorie nécessaires, comme 

$coll->addIdFilter($idFilter);

alors vous ne devrez pas charger n fois contre la base de données.

N'oubliez pas que les charges dans les boucles sont l'un des exemples de code incorrect utilisés le plus souvent dans les projets Magento et à les éviter!

2
mhaupt

Bonjour, vous verrez ci-dessous le code 

$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

Si vous souhaitez un nombre quelconque de sous-catégories de catégorie parente, cliquez ici http://magentoo.blogspot.com/2014/01/get-all-subcategories-of-parent-category-magento.html

0
user3146094