Я использую PHP Phalcon, и я хотел бы реализовать два разных меню. Первый для обычного пользователя, а второй для администратора. Я хочу иметь два шаблона меню для легкого расширения меню.
Теперь у меня есть что-то вроде этого:
//Main template:
[...]
if (session->role == 'admin')
include 'adminmenu.volt'
elseif (session->role == 'user')
include 'usermenu.volt'
{{ get_content() }} //from upper templates
[...]
(У незарегистрированного пользователя нет меню.)
Я думаю, что это не совсем правильно. Прежде всего, я не знаю, как выделить активную позицию. Во-вторых, я хотел бы управлять меню из контроллера, например, добавить специальную опцию, изменив что-то в базе данных.
Есть ли правильный способ сделать это? Я хотел бы получить простое решение без использования JavaScript, модулей или микросервисов
Вы, вероятно, ищете частичные. В вашем базовом шаблоне вы захотите что-то вроде:
{% if this.session->get('role') == 'admin' %}
{{ partial('adminmenu') }}
{% else %}
{{ partial('usermenu') }}
{% endif %}
Вам нужно настроить каталог partials на ваш взгляд:
//This is a path relative to your views directory.
//The following is accurate if your partials directory is a child of your views directory.
$this->view->setPartialsDir('partials');
Как только вы это сделаете, выполнение {{частичное (‘имя’)}} будет ссылаться на файл name.volt в вашем каталоге partials.
Что касается выделения вашей позиции. Ваш частичный может позвонить диспетчеру и спросить, что контроллер и действия:
{{ this.dispatcher.getControllerName() }} and {{ this.dispatcher.getControllerName() }}
Вы можете проверить их значение в атрибуте href и установить активный флаг, если он равен true.
Других решений пока нет …