Многие стандартные шаблоны в Drupal содержат вывод переменной пользователя (user), что делает возможным реализацию различной логики, в том числе и проверку роли пользователя.
Например, вы желаете показывать какой-то элемент шаблона, только для пользователя с специфической ролью:
1 2 3 |
{% if 'administrator' in user.getroles %} {{ node.field_secret_field }} {% endif %} |
Если переменная user не передана в шаблон, то можно добавить её через соответствующий препроцессор шаблона, или добавить функцию вроде is_role(‘USER_ROLE’) в TWIG.
В Drupal кастомные функции в TWIG можно добавить через описание своего сервиса типа twig.extension.
Для начала надо сформировать описатель, который подскажет какой класс в нашем модуле будет описывать расширение сервиса. Пусть модуль называется my_module.
Тогда нам нужно создать файл
/modules/custom/my_module/my_module.services.yml:
1 2 3 4 5 |
services: custom_twig.twig.CustomTwig: class: Drupal\my_module\Twig\CustomTwig tags: - { name: twig.extension } |
Он говорит, что наш класс CustomTwig выполняет роль расширения TWIG. Понятно, что у модуля должен быть еще и обязательно файл-описатель самого модуля — my_module.info.yml.
Класс, согласно PSR-4, должен находится в
/modules/custom/my_module/src/Twig/CustomTwig.php файле.
Вот так я добавил функцию is_role:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php namespace Drupal\my_module\Twig; use Twig\Extension\AbstractExtension; use Twig\TwigFunction; /** * Custom twig functions. */ class CustomTwig extends AbstractExtension { /** * @return array */ public function getFunctions() { return [ new TwigFunction('is_role', [$this, 'isRole']) ]; } /** * Provides function to check user role * * @param String $roleName * The machine name of user role * * @return bool */ public function isRole(string $roleName): bool { $current_user = \Drupal::currentUser(); $roles = $current_user->getRoles(); return in_array($roleName, $roles); } } |
После сброса кешей, функцию можно будет использовать в шаблонах:
1 2 3 4 |
{% if is_role('aufthenticated') %} пользователь авторизован {% endif %} |