Id4vMenuBundle is a Symfony2 bundle to manage menus easily
A Menu is a tree of MenuItems
MenuItems are
- A label to display
- Optionally an icon to show
- A link to go when clicked
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!
####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 }
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