Afficher les sous categories d’une categorie et le nombres produit

février 18, 2010 59 Commentaires

Code magento permettant d’afficher les sous catégories et le nombre de produits des sous catégories. Pratique pour aider à la navigation, quand le client arrive dans une catégorie il a accès à toutes les catégories avec le nombre de produits qu’elle contient, ainsi qu’un lien vers la sous catégorie

Placez le code dans list.phtml

Le code est ajouté dans list.phtml de votre thème magento actif.

<?php 
 
 //obtenir catégorie courante de magento
$catcourante = Mage::registry('current_category');
 
//  id
$collection = Mage::getModel('catalog/category')->getCategories($catcourante->getEntityId());
 
 
foreach($collection as $cat) {
   if($cat->getIsActive()) {
	$category = Mage::getModel('catalog/category')->load($cat->getEntityId());
 
         // collection de produits visibles avec un tatut actif
 
	$prodCollection = Mage::getResourceModel('catalog/product_collection')->addCategoryFilter($category);
	Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($prodCollection);
	Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($prodCollection);
 
	?><!--sortie Html -->
	<a href="<?php echo $category->getUrl() ?>"><?php echo $category->getName() ?></a> (<?php echo $prodCollection->count() ?>)<br/>
 
	<?php
	}
}
 
?>

Le code et clair et commenté, vous pouvez supprimer le nombre de produits en supprimant

<?php echo $prodCollection->count() ?>
Les sous catégories de magento sont affichées avec le nombre de produits et un lien vers chaque sous catégories..

Les sous catégories de magento sont affichées avec le nombres de produit et un lien vers chaques sous catégories.

Code
59 commentaires : “Afficher les sous categories d’une categorie et le nombres produit”
  1. Alain Mouafo dit :

    Bonjour,
    Je voulais savoir comment récupérer l’id de la catégorie racine. En effet, j’ai besoin de créer un plan de site magento en utilisant la démarche proposée dans « Afficher les sous catégories d’une catégorie et le nombres produit » mais je ne connais pas comment initialiser la bouche de génération de la liste des catégories et des produits.
    Il me faut connaitre l’id de la catégorie racine

  2. cédric rousset dit :

    Bonjour,
    pour récuprer une id de catégorie

    $categories=Mage::helper( 'catalog/category' )->getStoreCategories();
    foreach ( $categories as $category ) {
    echo $category->getName() . $category->getId()."<br>";
    }
  3. Severine dit :

    Les catégories Magento ne s’affichent sur la boutique

  4. angy dit :

    Salut ceddddd,

    Je voudrai pouvoir afficher ce résultat sur 2 colonnes.
    J’ai essayé mais comme je ne comprend pas très bien j’arrive au même résultat dans les deux colonnes.

    Je pense ne pas être très claire, long WE…
    J’espère que c’est quand même un peu compréhensible.

    Angy

  5. cédric rousset dit :

    Bonjour angy,
    Oui c’est clair tu veux séparer les catégories par colonne.
    Regarde du côtés de array_chunk() Pour séparer les catégories.
    Tu trouvera de la doc sur php info.

  6. garestou dit :

    Bonsoir,
    merci beaucoup pour le code, très pratique et utile pour quelqu’un qui ne connait pas bien php et le modèle Magento.
    Il reste à personnaliser l’affichage, mais c’est le plus facile.

  7. cédric rousset dit :

    Bonsoir,
    De rien et bon courage pour la personnalisation de ton code :)

  8. marvin dit :

    Salut ced,

    Je me trouve sur une fiche produit. Comment je peux savoir dans quelle rubrique racine je me trouve ?

    Ceci parce que je veux afficher un menu déployé de toute la catégorie racine dans laquelle je me trouve dans la colonne de gauche.

    marvin

  9. cédric rousset dit :

    Bonjour,
    Voici le code pour connaitre la catégorie courante

    <?php $catcourante = Mage::registry('current_category'); ?>
     
    ou 
    echo Mage::getModel('catalog/layer')->getCurrentCategory()->getName();
  10. marvin dit :

    Merci pour ta réponse mais je me suis mal fait comprendre.
    Mage::registry(‘current_category’) me donne la catégorie dans laquelle se trouve la fiche produit.

    Imaginons l’arborescence du catalogue comme suite :

    - catégorie 1 (racine)=> identifiant ?
    —— Sous catégorie 1
    —— Sous catégorie 2 =>Mage::registry(‘current_category’)
    ———– Ma fiche produit
    —— Sous catégorie 3

    Est-il possible d’avoir l’identifiant de la catégorie 1 racine, une sorte de Mage::registry(‘current_category_root’) ?

    Je pense que c’est faisable parce que les rubriques racines sont en surbrillances lorsque l’on est dedans peut importe dans quelle profondeur on se trouve dans les sous catégories. Donc il doit y avoir une variable qui traine pour ces « catégories racines » mais je n’arrive pas à la trouver. ( Ou alors une fonction qui remonte dans l’arbre ?)

    J’ai cherché dans le dossier « code/core » pour voir un peut comment été généré les menus racines mais rien. Je précise que je me base sur le modèle « blank » et que je n’ai pas touché à la génération du menu des catégories du catalogue.

    Marvin

  11. marvin dit :

    Je crois avoir trouvé un début de solution. Le breadcrumbs (le fil d’ariane) possède dans son tableau tous les identifiants !!

    Il me reste à trouver comment récupérer la variable $crumbs dans le block de la colonne de gauche…

  12. marvin dit :

    J’ai trouvé une solution qui ne doit pas être très « magento-friendly ». J’ai tous simplement enregistré la variable $crumbs dans le fichier breadcrumbs.phtml dans une variable de session que je récupère dans mon block dans ma colonne de gauche.

    Maintenant, peut importe dans quelle sous catégorie je me trouve dans mon catalogue, j’ai ce que je voulais : un menu sur la gauche qui affiche toutes les sous catégories de la catégorie racine.

    Désolé…

  13. cédric rousset dit :

    Salut,
    Il existe un code pour récupérer la catégorie mère, des que je remets la main dessus je le poste (je dois avoir ça dans un coin noté (mais où :) ) je sais pas.

  14. Yohan dit :

    Bonjour,

    Je souhaiterais afficher récupérer toutes les catégories (sous categ1, sous categ2, sous categ3) à partir de la catégorie mère.

    Connaissez-vous la requête qui me permettrait de récupérer celles-ci ?

  15. cédric rousset dit :

    Toutes les catégories de magento et toutes les sous catégories ?
    Qu’appelle tu catégorie mère ?

  16. Yohan dit :

    Catégorie mère -> Sous catég1 -> Sous categ2 etc etc…

    En faite j’ai créé un script qui récupère toutes les catégories mères et qui les affiche dans un menu vertical.

    Ton script permet de récupérer les sous catégories en fonction de la catégorie courante. Il m’a donc permis de résoudre un premier point à savoir : lister les souscateg1 en fonction de la categ mère.

    Seulement, je voudrais connaitre la requête qui permette de récupérer les enfants (souscateg2) des sous categ1 (directement sans attendre que la page courante soit devenu sous categ1).

  17. cédric rousset dit :

    Tu pourrais mettre ton code que j’y voie plus clair ou me le mailler (s’il est trop long).
    toutes les catégories magento.

     
    $categories=Mage::helper( 'catalog/category' )->getStoreCategories();
    foreach ( $categories as $category ) {
     
    echo $category->getName() . $category->getId()."<br>";
    }
  18. marvin dit :

    Salut ceddd,

    Si tu regardes plus haut, j’avais fait une manip pas trés « Magento-friendly » pour récupérer ma catégorie racine. Tu m’avais répondu qu’il y en avait une mais tu sasvais pas où tu l’avais mise. Je l’ai trouvé sous ton tapis ;) :

    Mage::app()->getStore()->getRootCategoryId()

    (Source : le fichier « List.php » dans « app/code/core/Mage/Catalog/Block/Product/ », fonction « _getProductCollection »)

    (ça peut peut-être aider Yohan)

    Merci encore de ton aide, je me suis lancé y’a deux semaines dans magento et je ne pensais pas que se serait aussi fastidieux si on veut « customiser » son magasin au delà de ce que nous propose Magento de base !

    « Patience et longueur de temps font plus que force ni que rage… pour Magento »

  19. Yohan dit :

    Exactement et je suis d’ailleurs arrivé à mes fins avec persévérance ! ;)

    Je partage mon script pour ceux qui auraient le même besoin que moi. Ce script consistait à :
    1 РAfficher la sous cat̩gorie1 en fonction de la cat̩gorie courante
    2 – Afficher la sous catégorie2 au clique et en fonction de la sous catégorie1 choisis par l’utilisateur

    [code]

    getCategories($catcourante->getEntityId());
    ?>

    getIsActive()):?>
    load($_category->getEntityId());?>

    <a title="" class="tab">getName();?>


    getCategories($_category->entity_id);
    $helper = Mage::helper('catalog/category');
    ?>

    <div style="display:none;" id="" class="menu-content">

    hasChildren()):?>

    <a title="getName(); ?>" href="getCategoryUrl($cat);?>">
    getName();?>

    [/code]

    A bientôt ! :)

  20. Yohan dit :

    Exactement et je suis d’ailleurs arrivé à mes fins avec persévérance ! ;)

    Ce script consistait à :
    1 – Afficher la sous catégorie1 en fonction de la catégorie courante
    2 – Afficher la sous catégorie2 au clique et en fonction de la sous catégorie1 choisis par l’utilisateur

    NB : J’ai voulu insérer mon script pour le faire partager, mais il semble que cela ne passe pas très bien… Je pense que tu peux supprimer le précédent commentaire qui est incompréhensible… Au besoin, je repasserais par ici pour voir si des personnes ont le même besoin que moi.

    A bientôt ! ;)

  21. cédric rousset dit :

    Salut,
    @marvin merci pour le code qui trainé sous le tapis:)

    @yohan
    Il faut l’intégrer avec des balises, je pense que ton code servirait a d’autres, si tu veux maile le moi, je l’insèrerai dans le blog.

  22. Dav dit :

    Bonjour,
    cela m’interesserai énormenent le code poster plus haut en version plus clair.. ;)

    je parle du code qui permet de lister les catégories en prenant en compte la catégorie mère puis en descendant dans les catégories enfants. Mais sans lister toutes les catégories mères (1er niveau)

    Merci
    PS : super le site, j’apprend pas mal de chose… ,)

  23. cédric rousset dit :

    Bonjour David,
    Le code m’a gentiment était envoyé par Yohan, je dois en faire un tutoriel ( mais j’avoue manquer de temps).

  24. Dav dit :

    bonjour cedddd, peut tu me l’envoyer par email dans ce cas ?

  25. cédric rousset dit :

    Voici le code ici je te laisse le soin de le tester, j’attends ton retour :)

    Code donner par Yohan DUPONT – Adexos.fr

    <div class="block block-navigation">
     
    <div class="block-title"><strong><span>Menu</span></strong></div>
     
    <div class="home-block-sider">
        <div class="menu-block-content">
        <ul class="bullets">
     
        <?php
         //categorie courante
        $catcourante = Mage::registry('current_category');
     
        //récupère l'id de la categorie courante
        $collection = Mage::getModel('catalog/category')->getCategories($catcourante->getEntityId());
        ?>   
     
        <?php $i=0;
        foreach ($collection as $_category): ?>
        <?php $i++ ?>
     
        <!-- ****************************** Affichage sous categ1 en fct categ courante *********************************** -->   
     
                <?php if($_category->getIsActive()):?>
                <?php $category = Mage::getModel('catalog/category')->load($_category->getEntityId());?>                           
     
                        <ul class="tabs" >
                            <li>
                            <a title="<?php echo $i;? rel="nofollow">" class="tab"><?php echo $category->getName();?></a>
    - Afficher le texte des messages précédents -
     
                            </li>
                        </ul>   
     
                <?php endif;?>
     
        <!-- ***************************** Affichage sous categ2 au click ************************************************** -->       
     
                <?php           
                $collection2 = Mage::getModel('catalog/category')->getCategories($_category->entity_id);
                $helper = Mage::helper('catalog/category');                                           
                ?>                                       
                        <?php $chainesouscat2 = ''; ?>
                        <?php foreach ($collection2 as $cat): ?>                            
                            <?php if($cat->getIsActive() && $cat->getName() != ''):?>
                            <?php $chainesouscat2 .= '<li><a title="'.$cat- rel="nofollow">getName().'" href="'.$helper->getCategoryUrl($cat).'">'.$cat->getName().'</a></li>'; ?>                 
                            <?php endif;?>             
                        <?php endforeach;?>
     
                        <?php if ($chainesouscat2 != ''): ?>
                        <div style="display:none;" id="<?php echo $i;?>" class="menu-content">
                        <?php
                        echo '<ul class="bullets-reverse">'.$chainesouscat2.'</ul>'; ?>
                        </div>                  
                        <?php endif; ?>                
     
     
        <!-- ************************************************************************************ -->   
        <?php endforeach;?>
     
        </ul>
     
        </div>
    </div>
    </div>
    <script src="<?php echo Mage::getStoreConfig('web/unsecure/base_url') ?>js/jquery/jquery-1.3.2.min.js" type="text/javascript"></script>
    <script type="text/javascript">
     
        var $myJQ = jQuery.noConflict();
        $myJQ(document).ready(function(){       
            $myJQ("a.tab").click(function () {       
     
                    if(!$myJQ(this).hasClass("active")){                   
                        $myJQ(".active").removeClass("active");
                        $myJQ(this).addClass("active");
                        $myJQ(".menu-content").slideUp();
                        var content_show = $myJQ(this).attr("title");
                        $myJQ("#"+content_show).slideDown();
                    }
     
            });
        });
     
    </script>
  26. dav dit :

    Merci beaucoup cedddd, je testerai ca demain et je te tiens au courant.
    Dav

  27. dav dit :

    Bonjour,

    Merci beaucoup pour le code, cela marche impect, j’ai du modifier pour que ça colle à mes besoin mais c’est OK ;)

    @+ et encore merci ;)

  28. cédric rousset dit :

    Merci à Yohan DUPONT – Adexos.fr

  29. Yohan dit :

    Bonjour Cédric,

    J’étais entrain de développer un nouveau menu quand je me suis rappeler qu’une personne voulait faire la même chose ici. Il s’agit de Marvin.

    Je souhaite avoir tout comme lui un menu de cette sorte : « peut importe dans quelle sous catégorie je me trouve dans mon catalogue, le menu doit afficher de manière fixe toutes les sous catégories de la catégorie racine. »

    En faite, je souhaite que mon menu reste de cette façon, peu importe où je me situe dans l’arborescence. J’ai essayé cette méthode mais sans succès :
    $collection = Mage::app()->getStore()->getRootCategoryId()

    Pourrais-tu me communiquer l’adresse mail de Marvin pour que je m’entretienne avec lui ? Merci.

  30. quentin peyramale dit :

    Bonjour
    Je suis parvenu par une autre méthode à lister les sous-catégorie mais j’aimerais aller plus loin en listant le début de la liste des produits de chaque sous-catégorie comme ça:
    [ Subcategory 1 ]
    [ Item 1 ] [ Item 2 ] [ Item 3 ]

    [ Subcategory 2 ]
    [ Item 1 ] [ Item 2 ] [ Item 3 ]

    [ Subcategory 3 ]
    [ Item 1 ] [ Item 2 ] [ Item 3 ]

    J’aimerais pouvoir appeler simplement [code]$cat.getProductListHtml()[/code] mais ça ne marche pas.

    Que faire? Merci d’avance

  31. Yohan dit :

    Bon ben finalement, je suis arrivé à mes fins plus rapidement que je ne l’espérais. A bientôt ! :)

  32. quentin peyramale dit :

    Je rectifie en mettant echo $this->getProductListHtml() ça m’affiche quelque chose mais il me dit qu’il n’y a pas de produits alors qu’il y en a!

    What’s wrong?

  33. enki dit :

    Comment ajouter les images des sous-catégories à ce code?
    Jai ajouté ce code http://samsami2u.wordpress.com/2009/09/15/add-categories-with-images-on-homepage-magento/ pour afficher les catégories en homepage et voudrais que dans les catégories jaie le même résultat avec l’image des sous-catégories. Merci

  34. Vincent T. dit :

    Bonjour,

    Je voudrais savoir comment adapter le code que tu donnes pour afficher le nombre de produit entre parenthèses, de telle sorte qu’on puisse faire afficher le nombre de produit affiché sur la page courante, dans la catégorie courante.

    En réalité, quelque soit la catégorie ou le filtre utilisé, le nombre de produit ne change pas et reste celui de la catégorie racine.

    Comment faire ?

    Merci ;)

  35. Francoisd dit :

    Salut,

    ton code marche super.
    Juste une petite question :

    Lorsque l’on se trouve sur la page d’une catégorie mère, les sous rubriques s’affichent (ton tuto) avec la liste des produits.

    En fait je cherche en enlever la liste des produits de cette page, puis à les retrouver lorsque l’on est dans la sous catégorie.

    Comment procéder ?

  36. cédric rousset dit :

    Bonjour
    Essaye sur les catégories mères d’afficher « bloc statique uniquement » et choisit un bloc statique
    qui importe un template qui contient le code. C’est la façon la plus simple ( si elle marche à tester).

  37. Francoisd dit :

    Ok merci je vais essayer.
    C’est vrai que n’y pensait plus.
    D’ailleurs c’est encore mieux car comme ça on ne touche pas aux fichiers sources par ce moyen !

  38. Francoisd dit :

    Sauf que pour le code php pur à insérer dans les blocs statiques on peut aller se brosser !
    Il faut utiliser la syntaxe magento. Je vais creuser de ce coté merci quand même.

  39. cédric rousset dit :

    Oui pas de code php dans les blocs statique. A partir du bloc statique il faut importer un template (fichier phtml) qui contient le code.
    C’est pas la solution la plus propre, mais c’est la plus simple à mettre en place.

  40. Francoisd dit :

    Encore une petite question.
    Quelle serait la syntaxe pour afficher l’image attribuée à la sous categorie ?

    Merci d’avance.

  41. cédric rousset dit :

    Bonjour,
    Tu as essayé ->getImageUrl()

  42. Francoisd dit :

    Oui merci c’est bien ca. Après il suffit d’indiquer le bon chemin (catalog/category) et c’est tout bon. Merci ! :)

  43. Jovi dit :

    Bonjour,

    Je suis sous Magento 1.4.1.1

    J’ai inséré ce code sur la page catégorie (list.ptml), et j’ai bien des catégories qui s’affichent, mais il s’agit, quelque soit la catégorie ou sous catégorie sur laquelle je suis, de toujours la même liste de catégories affichées : celles qui sont juste en dessous de la catégorie racine.
    Illustration
    Cat 1
    Sous Cat 1-1
    Sous Cat 1-2
    Cat 2
    Sous Cat 2-1
    Sous Cat 2-2
    …

    Et bien sur n’importe quelle page de catégorie (par exemple sur la page « Cat 2″, j’ai toujours affiché la liste Cat 1, Cat2, …
    au lieu de Sous Cat 2-1, Sous Cat 2-2

    Pourtant dans le code,
    $catcourante = Mage::registry(‘current_category’);
    me renvoie bien l’ID de la catégorie sur laquelle je suis.

    et
    $collection = Mage::getModel(‘catalog/category’)->getCategories($catcourante->getEntityId());
    renvoie un array avec la liste des catégories parentes au lieu des sous cat.

    Une idée ?
    Merci de votre réponse,

  44. Jovi dit :

    Solution :

    Remplacer :
    $collection = Mage::getModel(‘catalog/category’)->getCategories($catcourante->getEntityId());

    par :
    $collection = $catcourante->getChildrenCategories();

  45. signs dit :

    Petite question comment faire pour que il ne m’affiche par exemple que les 4 premières

  46. cédric rousset dit :

    Bonjour,
    Rajoute une condition $i>4 tu stoppe la boucle, ce qui affichera que 4 catégories

  47. imene dit :

    slt svp j’ai un problème je veux ficher mes produits dans la page accueil pour faire le procédure d’achat, j’ai ajouté mes produits dans manage product,j’ai modifié ses attribut en cliquant sur main web site store mais les produits ne s’affiche pas dans la page accueil svp m’aider

  48. cédric rousset dit :

    Bonjour,
    Pour la page d’accueil de magento regardez ici
    http://bloggento.fr/integration-maquette-magento-page-accueil-/2733

  49. riderbox dit :

    salut Cédric, j’utilise un code du même style que le tiens(le tiens avec plus de chose dedans au niveau de l’affichage), il fonctionne parfaitement sur mon site de dev. Je décide donc de le mettre sur le site de production est la il m’affiche uniquement les catégories qui se trouve sur la home page.

    j’ai fait un écho de ma catégories courante et j’ai pourtant la bonne catégorie courante.

    as tu déjà rencontré se genre de problème?

    merci d’avance

  50. cédric rousset dit :

    Bonjour,
    Non jamais rencontré ce problème. Il faut faire des var dump pour localiser l’erreur.

  51. riderbox dit :

    le soucis vient de cette ligne sur le site de production

    $collection = Mage::getModel(‘catalog/category’)->getCategories($catcourante->getEntityId());

    en remplaçant $catcourante->getEntityId() par un id de mes catégories, je me retrouve toujours avec le même résultat les 3 catégories se trouvant sur l’accueil.

  52. riderbox dit :

    je viens même de remarquer que si j’ecris la ligne comme ceci :

    $collection = Mage::getModel(‘catalog/category’)->getCategories();
    cela fonctionne aussi et je me retrouve avec les 3 catégories de l’accueil

  53. cédric rousset dit :

    tu es sur que tu as bien construit ton arbre des catégories ?

  54. riderbox dit :

    mon arbre est construit de cette façon
    1-TT
    1-1 sous cat tt 1
    1-2 sous cat tt 2
    1-3 sous cat tt 3
    1-4 sous cat tt 4
    2-Route
    2-1 sous cat route 1
    2-2 sous cat route 2
    2-3 sous cat route 3
    2-4 sous cat route 4
    3-quad
    3-1 sous cat quad 1
    3-2 sous cat quad 2
    3-3 sous cat quad 3
    3-4 sous cat quad 4

    visuellement sur l’administration quand on regarde les arbres sur le site de dev et de prod, ils sont identique

  55. cnahon dit :

    Bonjour,

    je me suis servi de ce script pour répertorier toutes les catégories (sur plusieurs niveaux) de mon site. Mais les catégories sont classées par ID et non par ordre alphabétique ou par classement du BackOffice.

    y’a-t-il moyen d’y remédier ?

  56. Aloa dit :

    Bonjour :)
    Merci pour ce code qui me semble indispensable.
    Il fonctionne à merveille mais je me suis rendu compte, après moultes tests qu’ils faisait buguer la fonction de recherche : sans ce code, la recherche fonctionne correctement. Avec ce code, les résultats de recherche ne sont simplement pas affiché, comme s’il était invisibles, et le footer ne s’affiche pas non plus.
    Auriez-vous une idée pour solutionner ce problème ?
    Merci par avance ;)

  57. cédric rousset dit :

    hello
    oui car $catcourante n’existe pas dans la recherche. Pour pallier à ce problème, utilise une condition pour voir si $catcourante existe
    if ($catcourante) {
    ….
    }

  58. Aloa dit :

    Tu es merveilleux :mrgreen:
    Merci pour tout, ca fonctionne évidement à merveille maintenant ;)

  59. Seb dit :

    Ce code placé dans la home page fonctionne bien sous magento 1.3
    MAIS sous magento 1.6.2 au lieu d’afficher les sous catégories ce sont les catégories qui sont affichées.

Poster un commentaire

(obligatoire)

(obligatoire)