Created
December 12, 2018 16:27
-
-
Save KaiCMueller/3bd0570f115d709264972440d4a87b58 to your computer and use it in GitHub Desktop.
EasyAdmin: Active entity menu items
Little improved solution for EasyAdmin v2.x
Twig extension:
public function easyadmin_mark_selected(array $menu)
{
$request = $this->container->get(RequestStack::class)->getCurrentRequest();
if ($request->query->has('menuIndex') && $request->query->has('submenuIndex')) {
return $menu;
}
if (!$requestEntity = $request->query->get('entity')) {
return $menu;
}
foreach ($menu as &$item) {
if (isset($item['entity']) && $requestEntity === $item['entity']) {
$item['active'] = true;
}
foreach ($item['children'] as &$subItem) {
if (isset($subItem['entity']) && $requestEntity === $subItem['entity']) {
$item['active'] = true;
$item['subActive'] = true;
$subItem['active'] = true;
}
}
}
return $menu;
}
Extended template:
{% extends '@!EasyAdmin/default/menu.html.twig' %}
{% import _self as helper %}
{% block main_menu %}
{% set _menu_items = _menu_items|easyadmin_mark_selected %}
{% for item in _menu_items %}
{% block menu_item %}
{% set is_selected_menu = app.request.query.get('menuIndex')|default(-1) == item.menu_index or item.active|default(false) %}
{% set is_selected_submenu = is_selected_menu and app.request.query.get('submenuIndex')|default(-1) != -1 or item.subActive|default(false) %}
{% if easyadmin_is_granted(item.permission) %}
<li class="{{ item.type == 'divider' ? 'header' }} {{ item.children is not empty ? 'treeview' }} {{ is_selected_menu ? 'active' }} {{ is_selected_submenu ? 'submenu-active' }}">
{{ helper.render_menu_item(item, _translation_domain) }}
{% if item.children|default([]) is not empty %}
<ul class="treeview-menu">
{% for subitem in item.children %}
{% block menu_subitem %}
{% if easyadmin_is_granted(subitem.permission) %}
<li class="{{ subitem.type == 'divider' ? 'header' }} {{ is_selected_menu and app.request.query.get('submenuIndex')|default(-1) == subitem.submenu_index or subitem.active|default(false) ? 'active' }}">
{{ helper.render_menu_item(subitem, _translation_domain) }}
</li>
{% endif %}
{% endblock menu_subitem %}
{% endfor %}
</ul>
{% endif %}
</li>
{% endif %}
{% endblock menu_item %}
{% endfor %}
{% endblock main_menu %}
Hi @brizzz, thanks for your contribution! Can you please explain what the "improvements" are? Thank you!
Thank you for starting point :) You version not work correctly on v2.x for me. And the base template of v2.x have some style changes. Improvements:
- less code duplication and better BC: extending base template and override only "main_menu" block
- move hard logic of defining active item to twig filter (by the way v3.x implemnts similiar approach)
@brizzz good point! I think it makes sense to keep both approaches, while recommending your approach for EasyAdmin v2 and up.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This is a replacement of the menu for EasyAdmin v1.x.
See https://gist.github.com/KaiCMueller/3bd0570f115d709264972440d4a87b58#gistcomment-3270699 for v2 and up.
The menu will automatically detect if you are working on an entity that is linked in the menu and set the corresponding menu item to active, including submenu items.
You will not have to add the request parameters "menuIndex" and "submenuIndex" when linking to an entity.
You will have to override the original template by placing this file in /templates/bundles/EasyAdminBundle/default