Simple fast object-oriented menu maker for Symfony 5, (*1)
, (*2)
Installation
Step 1: Download the Bundle
Open a command console, enter your project directory and execute the
following command to download the latest stable version of this bundle:, (*3)
composer require appaydin/pd-menu
This command requires you to have Composer installed globally, as explained
in the installation chapter
of the Composer documentation., (*4)
Step 2: Enable the Bundle
With Symfony 4, the package will be activated automatically. But if something goes wrong, you can install it manually., (*5)
Then, enable the bundle by adding it to the list of registered bundles
in the config/bundles.php
file of your project:, (*6)
<?php
// config/bundles.php
return [
//...
Pd\MenuBundle\PdMenuBundle::class => ['all' => true]
];
Step 1: Without Service
You can create menus without service. You can load the necessary parameters using $options
, (*7)
<?php
// src/Menu/FirstMenu.php
namespace App\Menu;
use Pd\MenuBundle\Builder\ItemInterface;
use Pd\MenuBundle\Builder\Menu;
class FirstMenu extends Menu
{
/**
* Override
*/
public function createMenu(array $options = []): ItemInterface
{
// Create Root Item
$menu = $this
->createRoot('settings_menu', true) // Create event is "settings_menu.event"
->setChildAttr(['data-parent' => 'admin_account_list']); // Add Parent Menu to Html Tag
// Create Menu Items
$menu->addChild('nav_config_general', 1)
->setLabel('nav_config_general')
->setRoute('admin_settings_general')
->setLinkAttr(['class' => 'nav-item'])
->setRoles(['ADMIN_SETTINGS_GENERAL'])
// Contact
->addChildParent('nav_config_contact', 5)
->setLabel('nav_config_contact')
->setRoute('admin_settings_contact')
->setLinkAttr(['class' => 'nav-item'])
->setRoles(['ADMIN_SETTINGS_CONTACT'])
// Email
->addChildParent('nav_config_email', 10)
->setLabel('nav_config_email')
->setRoute('admin_settings_email')
->setLinkAttr(['class' => 'nav-item'])
->setRoles(['ADMIN_SETTINGS_EMAIL'])
// Template
->addChildParent('nav_config_template')
->setLabel('nav_config_template')
->setRoute('admin_settings_template')
->setLinkAttr(['class' => 'nav-item'])
->setRoles(['ADMIN_SETTINGS_TEMPLATE'])
// Account
->addChildParent('nav_config_user')
->setLabel('nav_config_user')
->setRoute('admin_settings_user')
->setLinkAttr(['class' => 'nav-item'])
->setRoles(['ADMIN_SETTINGS_USER']);
return $menu;
}
}
The creation process is very simple. You can specify additional options., (*8)
{{ pd_menu_render('App\\Menu\\FirstMenu', {
'custom': 'variable or options'
}) }}
You can change the default options., (*9)
{{ pd_menu_render('App\\Menu\\FirstMenu', {
'template': '@PdMenu/Default/menu.html.twig',
'depth': null,
'currentClass': 'active',
'trans_domain': 'admin',
'iconTemplate' => '<i class="material-icons">itext</i>'
}) }}
You can change the default options globally., (*10)
config/packages/pd_menu.yaml
pd_menu:
template: '@PdMenu/Default/menu.html.twig',
depth: null,
currentClass: active
trans_domain: admin,
iconTemplate: '<i class="fa&text"></i>'
All menus automatic events are generated. Example : "menu_name.event", (*11)
Now let's create a listener for the event., (*12)
<?php
// src/Listener/MenuListener.php
namespace App\Listener;
use Pd\MenuBundle\Event\PdMenuEvent;
class MenuListener
{
public function onCreate(PdMenuEvent $event)
{
// Get Menu Items
$menu = $event->getMenu();
// Add New Item
$menu->addChild('demo_item', 5)
->setLabel('Home Page')
->setRoute('home_route');
}
}
Let's create a service for the listener., (*13)
App\Menu\MenuListener:
tags:
- { name: kernel.event_listener, event: settings_menu.event, method: onCreate }