Files
chill-bundles/docs/source/development/menus.md

131 lines
3.8 KiB
Markdown

###### Menus
This document explains how to use and create menus in Chill.
## Add a menu in a template
In your twig template, use the `chill_menu` function:
```twig
{{ chill_menu('person', {
'layout': '@ChillPerson/menu.html.twig',
'args' : {'person_id': person.id, 'person': person },
'activeRouteKey': activeRouteKey
}) }}
```
The available arguments are:
* `layout`: a custom layout for KNP Menu.
* `args`: an array of parameters that will be passed to the `MenuBuilder`.
* `activeRouteKey`: the route key name that should be marked as active.
## Building a menu
To build a menu, you must create a class that implements `\Chill\MainBundle\Routing\LocalMenuBuilderInterface`.
### The `getMenuIds` method
This static method returns an array of menu keys that this builder supports. For example, if you want to add items to the "person" menu:
```php
public static function getMenuIds(): array
{
return ['person'];
}
```
### The `buildMenu` method
The `buildMenu` method is called when a menu with one of the supported keys is rendered.
```php
public function buildMenu($menuId, MenuItem $menu, array $parameters): void
{
// ...
}
```
* `$menuId`: the key of the menu being built (e.g., 'person').
* `$menu`: the KNP Menu item representing the parent menu.
* `$parameters`: the arguments passed from the `chill_menu` call in the template (the `args` key).
#### Example
```php
public function buildMenu($menuId, MenuItem $menu, array $parameters): void
{
/** @var \Chill\PersonBundle\Entity\Person $person */
$person = $parameters['person'];
$menu->addChild('My Menu Entry', [
'route' => 'my_route_name',
'routeParameters' => [
'id' => $person->getId(),
],
])
->setExtras([
'order' => 100,
]);
}
```
### Ordering items
You can order menu items using the `order` extra. In case of duplicate orders, the entry is kept, but the order between items with the same weight is random.
```php
$menu->addChild('Ordered Item', [/* ... */])
->setExtras(['order' => 50]);
```
### Adding a counter
You can add a counter to a menu item by setting the `counter` extra:
```php
$menu->addChild('Tickets', [/* ... */])
->setExtras([
'counter' => $this->ticketRepository->countOpenedByPerson($person),
'order' => 150
]);
```
### Adding an icon
You can add an icon to a menu item by setting the `icon` extra. The icon name corresponds to a [Fork Awesome](https://forkaweso.me/Fork-Awesome/icons/) icon name (without the `fa-` prefix).
```php
$menu->addChild('My tasks', [
'route' => 'chill_task_singletask_my_tasks',
])
->setExtras([
'order' => -10,
'icon' => 'tasks',
]);
```
Currently, icons are extracted from Fork Awesome, but this might change in the future.
## Existing Menus
Here are some common menus used in Chill and the parameters they receive:
* `person`: Parameter `person` (instance of `Chill\PersonBundle\Entity\Person`). Used in the person file.
* `accompanyingCourse`: Parameter `accompanyingCourse` (instance of `Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriod`). Used in the accompanying course file.
* `admin`: The main administration menu.
* `section`: The "sections" menu (top navigation).
* `user`: The "my menu" (user profile/actions).
* `household`: Parameter `household` (instance of `Chill\PersonBundle\Entity\Household\Household`). Used in the household file.
## Good Examples
For more complex implementations, you can refer to:
* `src/Bundle/ChillTicketBundle/src/Menu/PersonMenuBuilder.php`
* `src/Bundle/ChillTicketBundle/src/Menu/SectionMenuBuilder.php`
* `src/Bundle/ChillDocGeneratorBundle/Menu/AdminMenuBuilder.php`
* `src/Bundle/ChillDocStoreBundle/Menu/MenuBuilder.php`
* `src/Bundle/ChillPersonBundle/Menu/UserMenuBuilder.php`
* `src/Bundle/ChillPersonBundle/Menu/HouseholdMenuBuilder.php`