KnpMenuBundle Comment faire un Breadcrumb

Cet article est obsolète, il existe une façon plus simple de faire un fil d’Ariane avec le Knp Menu Bundle.

Pas évident de trouver comment faire un fil d’Ariane ( ou breadcrumb ) avec le KnpMenuBundle

On va la faire courte.
Dans un premier temps on va coder dans le « Builder » de menu, puis on va faire un peu de Twig

Le Builder

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;
    }

    // Code pompé honteusement ici https://github.com/KnpLabs/KnpMenuBundle/issues/122#issuecomment-12149706
    public function myBreadCrumb(FactoryInterface $factory, array $options)
    {
        $menu = $this->leftExtranetMenu($factory, $options);

        $matcher = $this->container->get('knp_menu.matcher');
        $voter = $this->container->get('knp_menu.voter.router');
        $matcher->addVoter($voter);

        $treeIterator = new RecursiveIteratorIterator(
                        new KnpMenuIteratorRecursiveItemIterator(
                                new ArrayIterator(array($menu))
                        ),
                        RecursiveIteratorIterator::SELF_FIRST
        );

        $iterator = new KnpMenuIteratorCurrentItemFilterIterator($treeIterator, $matcher);

        // Set Current as an empty Item in order to avoid exceptions on knp_menu_get
        $current = new KnpMenuMenuItem('', $factory);

        foreach ($iterator as $item) {
            $item->setCurrent(true);
            $current = $item;
            break;
        }

        return $current;
    }

}

Le Twig

{% set currentItem = knp_menu_get('WaldoColorfullBundle:Builder:myBreadCrumb').getBreadcrumbsArray %}

{% 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 %}
Tagués avec : , , ,
Publié dans Symfony2, Symfony2 v2.1
3 commentaires pour “KnpMenuBundle Comment faire un Breadcrumb
  1. Miranda dit :

    Bonjour,j’ai actuellement un souci avec Symfony2 et Twig.j’ai intégreé un syste8me de formulaire avec des champs obligatoires, qui sont required .Sous Chrome et Firefox, quand je valide le formulaire alors que les champs ne sont pas remplis, j’ai un rappel à l’ordre sous forme d’infobulle. Sous IE, le formulaire part, et bien sur j’ai une erreur car les champs requis sont vides. Auriez-vous unes piste SVP ? En vous souhaitant bonne journeé

    • waldo2188 dit :

      [Troll]Refuser aux utilisateurs d’IE d’utiliser le web ;)[/Troll]

      Firefox et Chrome intègre le HTML5 et ont dans leurs spécifications d’alerter l’utilisateur sur les champs obligatoires.
      IE, « navigateur web » qui a perpétuellement une dizaine d’années de retard sur les autres n’intègre pas ces fonctionnalités.

      Pour palier à cela il vous faut donc valider votre formulaire en PHP, et c’est à ce moment là que vous devez vérifier si les champs obligatoire sont tous remplis, mais ça Symfony2 le fait déjà pour vous http://symfony.com/fr/doc/current/book/validation.html.

  2. Hugo dit :

    Ca marche niquel merci beaucoup !! ;)

1 Pings/Trackbacks pour "KnpMenuBundle Comment faire un Breadcrumb"
  1. […] Ok le titre est en anglais, mais je ne sais pas quoi mettre… Le problème que concerne cet article est encore lié au KnpMenuBundle et fait suite à un précédent article sur le KnpMenuBundle et les fils d’Ariane. […]

Laisser un commentaire

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

*