Drupal 8 - программно отключить или включить ссылку в основной навигации

Это касается Drupal 8. Я пытаюсь управлять элементом ссылки в основной навигации. Я хочу включить / отключить элемент программно. Я искал, но не могу найти, как это сделать. Я нашел MenuLinkManager, MenuLinkContent, но не могу делать то, что хочу. Спасибо за вашу помощь.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
3 993
4

Ответы 4

Вы можете установить модуль Special Menu Items https://www.drupal.org/project/special_menu_items

Или сделайте это в своей функции theme_link в вашем template.php

function myTheme_link($variables) {
  if ((isset($variables['path']) && ($variables['path'] == $_GET['q'] || ($variables['path'] == '<front>' && drupal_is_front_page())))) {

    return ($variables['options']['html'] ? $variables['text'] : check_plain($variables['text']));
  } else {
    return '<a href = "' . check_plain(url($variables['path'], $variables['options'])) . '"' . drupal_attributes($variables['options']['attributes']) . '>' . ($variables['options']['html'] ? $variables['text'] : check_plain($variables['text'])) . '</a>';
  }
}

Спасибо за поддержку !

Luis Figueira 23.10.2018 13:16

Отключить / включить элементы меню означает показать / скрыть его. Итак, мы можем сделать это с помощью кода ниже в файле темы

/**
 * Implements hook_preprocess_menu().
 */
function theme_preprocess_menu(&$variables) {
  if (isset($variables['menu_name']) && $variables['menu_name'] === 'main') {
    foreach($variables['items'] as $key => $item) {
      $path = $item['url']->toString();
      switch($path) {
        case '/menupath':
          unset($variables['items'][$key]); //Remove menu item
        break;          
      }           
    }
  }
} 

Большое спасибо за поддержку!

Luis Figueira 23.10.2018 13:16

Вам нужно исключить меню из кеша, если вы собираетесь изменять его динамически:

/**
 * Implements hook_preprocess_HOOK().
 */
function YOUR_MODULE_preprocess_menu(&$variables) {
  foreach ($variables['items'] as $key => $item) {
    if ($key == 'depot_opm.document_demande_existant_tabs') {
      unset($variables['items'][$key]);
    }
  }
}

/**
 * Implements hook_preprocess_HOOK().
 */
function YOUR_MODULE_preprocess_block(&$variables) {
  // Disable the cache of the menu block.
  if ($variables['derivative_plugin_id'] == 'tabs-documents') {
    $variables['#cache']['max-age'] = 0;
  }
}

Предполагая, что вы действительно хотите удалить ссылку, я бы использовал hook_menu_links_discovered_alter()

Например:

/**
 * Implements hook_menu_links_discovered_alter().
 *
 * @param array $links
 *   An array of links.
 */
function HOOK_menu_links_discovered_alter(array &$links): void {
  unset($links['machine_name_to_remove']);
}

Другие вопросы по теме