KnpMenuBundle le breadcrumb facile !

Dans un article précédent je vous expliquais comment faire un breadcrumb (file d’Ariane) qui fonctionne avec le KnpMenuBundle.
Malheureusement cet article est obsolète (depuis un moment en faite). Les mainteneurs du super KnpMenuBundle ont déprécié la méthode magique getBreadcrumbsArray.

Ne trouvant de solution, j’ai laissé traîner. Mais aujourd’hui je me suis bougé et j’ai pondu le CnertaBreadcrumpBundle !
Comme ça la prochaine fois que j’ai à faire un Breadcrump cela sera une partie de plaisir.

Sur la page github du projet vous trouverez comme l’installer.

Je vais juste vous montrer ici une implémentation plus détaillé que dans la documentation.

Ci-dessou la classe Builder classique au KnpMenuBundle :

namespace WaldoColorfullBundleMenu;

use KnpMenuFactoryInterface;
use SymfonyComponentDependencyInjectionContainerAware;

class Builder extends ContainerAware
{
    public function mainMenu(FactoryInterface $factory, array $options)
    {
        $menu = $factory->createItem('main');

        $menu->addChild('Entrée 1', array('route' => '_route_entre_1'))
                ->addChild('Entrée 1.1', array('route' => '_route_entre_1_1'))
                ->addChild('Entrée 1.1.1', array('route' => '_route_entre_1_1_1'));

        $menu->addChild('Entrée 2', array('route' => '_route_entre_1'))
                ->addChild('Entrée 2.1', array('route' => '_route_entre_2_1'))
                ->addChild('Entrée 2.1.1', array('route' => '_route_entre_2_1_1'));

        return $menu;
    }
}

Dans cette classe on y trouve uniquement notre menu. Ici pas besoin de hack comme dans l’article précédent. C’est le CnertaBreadcrumbBundle qui fait tout le travail.

Maintenant pour l’utiliser dans Twig, rien de plus simple :

{{ cnerta_breadcrumb_render('WaldoColorfullBundle:Builder:mainMenu') }}

C’est tout. Il vous suffit d’appeler le Helper “cnerta_breadcrumb_render” et de lui donner le chemin de votre menu. Comme avec le KnpMenuBundle. Trop facile ?

Voici une implémentation un peu plus poussée, dans le cas où l’on veux customiser directement dans son template le rendu.

{% set currentItem = cnerta_breadcrumb_get('WaldoColorfullBundle:Builder:mainMenu') %}

{% for item in currentItem %}
    {% if loop.index != 1 %}
        {% if loop.index > 2 %} > {% endif %}
        {% if not loop.last %}<a href="{{ item.uri }}">{{ item.label }}</a>
        {% else %}<span>{{ item.label }}</span>{% endif %}
    {% endif %}
{% endfor %}

Cependant, si vous voulez faire les chose bien et créer un template à part uniquement pour le breadcrump, c’est possible. Il suffit d’utiliser le helper “cnerta_breadcrumb_render” et de lui passer un nom de template (comme pour le KnpMenuBundle).

{{ cnerta_breadcrumb_render('WaldoColorfullBundle:Builder:mainMenu', {'template': 'MyWonderfullBundle:Breadcrumb:myBreadcrumb.html.twig'}) }}

Le code et l’architecture de ce bundle se base énormément sur le travail fait sur le KnpLabs.
Ce bundle n’est pas parfait et doit souffrir de bugs (inconnus à ce jour). Mais voila, il fait ce qui lui est demandé et c’est déjà pas mal !

Publié dans PHP, Symfony2
5 commentaires pour “KnpMenuBundle le breadcrumb facile !
  1. KARUNAGODA Sûrya dit :

    Salut et merci pour ce Bundle,

    Je voulais juste vous notifier une faute de frappe dans la doc sur Github.

    Il manque le « b » à la fin de Breadcrumb <- dans l'url du repository

    Cordialement.

    • Waldo dit :

      Ok, merci, c’est corrigé.
      Si vous utilisé ce Bundle, je serais curieux de vos retour et avis sur cet outil.

      • KARUNAGODA Sûrya dit :

        De rien :)

        Bah, pour l’instant je galère un peu.
        J’ai utilisé les méthodes du KnpMenu pour créer mon arborescence.

        Mon code :

            /**
             * 
             * @param KnpMenuFactoryInterface $factory
             * @param array $options
             * @return type
             */
            public function mainMenu(FactoryInterface $factory, array $options)
                $menu = $factory->createItem('root');
        
                $childs = array(
                    'Tableau de bord' => array(
                        'options' => array(
                            'route' => 'dashboard',
                        ),
                        'childs' => array(
                            'Utilisateurs' => array(
                                'options' => array(
                                    'route' => 'admin_list_user'
                                )
                            ),
                            'Campagnes' => array(
                                'options' => array(
                                    'route' => 'campaign',
                                )
                            ),
                            'Statuts de canditature' => array(
                                'options' => array(
                                    'route' => 'campaignapplystatus',
        
                            ),
                        )
                    )
                );
                $this->_addChilds($menu, $childs);
        
                return $menu;
            }
        
            /**
             * 
             * @param EffinetBundleDashboardBundleMenuKnpMenuItemInterface $item
             * @param array $childs
             */
            private function _addChilds(KnpMenuMenuItem $item, array $childs)
            {
                foreach ($childs as $name => $data) {
                    $item->addChild($name, $data['options']);
                    if (isset($data['childs']) && !empty($data['childs'])) {
                        $this->_addChilds($item[$name], $data['childs']);
                    }
                }
            }
        

        J’arrive à afficher mon arborescence avec la ligne suivante :
        {{ knp_menu_render(‘BaseBundle:Builder:mainMenu’) }}
        Cependant ça ne détecte pas la page courante.

        Mais je n’ai qu’un ‘root’ qui s’affiche quand j’utilise :
        {{ cnerta_breadcrumb_render(‘BaseBundle:Builder:mainMenu’) }}

1 Pings/Trackbacks pour "KnpMenuBundle le breadcrumb facile !"
  1. […] Cet article est obsolète, il existe une façon plus simple de faire un fil d’Ariane avec le Knp Menu Bundle. […]

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*