Skip to content

Id4v/MenuBundle

Repository files navigation

SensioLabsInsight

MenuBundle

Id4vMenuBundle is a Symfony2 bundle to manage menus easily

How it works

A Menu is a tree of MenuItems

MenuItems are

  • A label to display
    • Optionally an icon to show
  • A link to go when clicked

Installation

1 Install it using composer

composer require id4v/menu-bundle

2 Activate the bundle in your AppKernel.php file

public function registerBundles()
    {
        $bundles = array(
        ...
        # if you haven't already this bundle
        new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(),
        ...
        new \Id4v\Bundle\MenuBundle\Id4vMenuBundle(),
        ...
        );
        return $bundles
    }

3 Add this mandatory configuration for the StofDoctrineExtensionsBundle in your config.yml

stof_doctrine_extensions:
    orm:
        default:
            sluggable: true

4 Register the id4v_menu.admin.menu Service to your sonata admin configuration

5 Profit!

Usage

####Create your menu in the admin of your website.

####Organize your menu by adding MenuItems, drag and dropping them

####Render your Menu in twig templates

####Full exemple of implementation

{{ knp_menu_render("app.menu.main", {template: "Id4vMenuBundle:Menu:main.html.twig"}) }}

or

{{ knp_menu_render("app.menu.main", {template: "menu:main.html.twig"}) }}

All documentation for this tag is available here : KnpMenuBundle.

A base builder as been added to help common usage of menu creation, the BaseMenuBuilder.php class.

First of all the basic declaration of your builder can be :

namespace AppBundle\Menu;

use Knp\Menu\FactoryInterface;
use Doctrine\ORM\EntityManager;
use Id4v\Bundle\MenuBundle\Builder\BaseMenuBuilder;

class AppMenuBuilder extends BaseMenuBuilder
{
    public function __construct(FactoryInterface $factory, EntityManager $em)
    {
        parent::__construct($factory, $em);
    }

    public function createMainMenu()
    {
        return $this->getSimpleMenu('main-menu');
    }
}

You can now declare yours services :

services:
    app.menu_builder:
        class: AppBundle\Menu\AppMenuBuilder
        arguments: ["@knp_menu.factory", "@doctrine.orm.entity_manager"]

    app.menu.main:
        class: Knp\Menu\MenuItem # the service definition requires setting the class
        factory: ["@app.menu_builder", createMainMenu]
        arguments: ["@request_stack"]
        tags:
            - { name: knp_menu.menu, alias: app.menu.main }

You can consult documentation of this declaration in KnpMenuBundle Doc.

Moreover you can activate an URI matcher or adapt one on your need.

services:
    app.voter.regex:
        class: Id4v\Bundle\MenuBundle\Matcher\Voter\UriVoter
        arguments: ["@request_stack"]
        tags:
            - { name: knp_menu.voter }

Sonata Admin

Sometimes you get an abundant tree into your menus. And the performance of the administration get found affected. It's the reason why existing a configuration with the bundle.

By default you can only drap and drop two levels depth. If you want to change it, modify the menu_depth node.

Default Configuration

id4v_menu:
    admin:
        menu_depth: 2