Рейтинг:0

theme_preprocess_menu не видит главное меню

флаг in

Предыстория: у меня есть веб-сайт мероприятия, на котором я хочу скрыть пункт меню регистрации на мероприятие, когда регистрация на мероприятие закрыта.

theme_preprocess_menu не срабатывает ни на чем, кроме «menu__toolbar». Код:

функция myTheme_preprocess_menu(&$variables, $hook) {
  дпм($хук);
}

просто дает результат «menu__toolbar» на любой странице, где активна моя тема. Моя тема основана на Бартике.

Как мне заставить его запускаться в главном меню?

leymannx avatar
флаг ne
Это просто `hook_preprocess_menu(&$variables)` без `$hook`, а затем `dpm($variables)`. Название темы должно содержать только строчные буквы и символы подчеркивания. Вы сбрасывали кеш? Запускается ли тот же хук из пользовательского модуля? Где именно вы поставили крючок? Видно ли в данный момент главное меню на странице, которую вы проверяете? Обновите свой вопрос для уточнения.
No Sssweat avatar
флаг ua
Попробуйте с **[hook_menu_links_discovered_alter](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Menu%21menu.api.php/function/hook_menu_links_discovered_alter/9.3.x)**
No Sssweat avatar
флаг ua
Но более подходящим решением было бы запретить доступ с помощью **[hook_entity_access](https://www.prometsource.com/blog/how-manage-hook-entity-access-with-drupal)**, как если бы доступ был запрещено, автоматически скрывает ссылку.
apaderno avatar
флаг us
Функции предварительной обработки получают три аргумента от [`ThemeManager::render()`](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Theme%21ThemeManager.php/function/ThemeManager%3A %3Arender/9.3.x), который вызывает их как `$preprocessor_function($variables, $hook, $info);`. Однако значение `$hook` также хранится в `$variables['theme_hook_original']`; нет необходимости использовать второй параметр, и поэтому функции предварительной обработки обычно его не используют.
apaderno avatar
флаг us
Чтобы скрыть пункт меню, лучше изменить его значение #access, как сказал @NoSssweat. Функция предварительной обработки была бы слишком поздней для этого, и это был бы неправильный хук для использования, поскольку его цель — изменить способ рендеринга элемента.
флаг in
Большое спасибо. hook_entity_access аккуратно решает одну из моих проблем (ту, которую я описал выше). Есть еще один пункт меню, который я хотел бы скрыть, но не отключать: «Вход в систему». После закрытия мероприятия никому, кроме администратора, не нужно входить в систему, поэтому я хотел бы скрыть это, но все же разрешить администратору использовать /user/login для доступа к сайту.
Рейтинг:0
флаг us

Что вы получаете $ крючок не говорит, для какого меню вызывается функция предварительной обработки. Это просто предложение, которое Drupal улавливает в ТемаМенеджер::рендеринг().

  // Вызываем hook_theme_suggestions_HOOK().
  $suggestions = $this->moduleHandler->invokeAll('theme_suggestions_' . $base_theme_hook, [
    $ переменные,
  ]);

  // Если реализация темы была вызвана прямым предложением темы
  // как '#theme' => 'node__article', добавьте его в массив предложений перед
  // вызов подсказки alter hooks.
  если (isset($info['базовый хук'])) {
    $suggestions[] = $крючок;
  }

  // Вызываем hook_theme_suggestions_alter() и
  // hook_theme_suggestions_HOOK_alter().
  $ крючки = [
    'тема_предложения',
    'тема_предложения_' . $base_theme_hook,
  ];
  $this->moduleHandler->alter($hooks, $suggestions, $variables, $base_theme_hook);
  $this->alter($hooks, $suggestions, $variables, $base_theme_hook);

  // Проверяем, существует ли каждое предложение в реестре тем, и если да,
  // используем его вместо базового хука. Например, функция может использовать
  // '#theme' => 'node', но модуль может добавить 'node__article' в качестве предложения
  // через hook_theme_suggestions_HOOK_alter(), что позволяет теме
  // альтернативный файл шаблона для узлов статьи.
  foreach (array_reverse($suggestions) как $suggestion) {
    если ($theme_registry->имеет($предложение)) {
      $info = $theme_registry->get($suggestion);
      сломать;
    }
  }

Olivero_theme_suggestions_menu_alter() является одним из хуков, которые изменяют предложения для файла шаблона меню. В вашем случае может быть модуль, делающий подобное предложение.

function Olivero_theme_suggestions_menu_alter (& $ предложения, массив $ переменных) {
  если (isset($variables['атрибуты']['регион'])) {
    $предложения[] = 'меню__' . $variables['атрибуты']['регион'];
  }
}

То, что вы ищете, это имя машины меню, хранящееся в $переменные['имя_меню'] как задокументировано в меню.html.twig.

Если целью является скрытие пункта меню, использование этого хука предварительной обработки не является решением. Скрыть пункт меню достаточно, например, чтобы вошедший в систему пользователь не имел доступа к маршруту, используемому для этого пункта меню. В этом случае Drupal не покажет пункт меню.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.