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






Вы можете установить модуль 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>';
}
}
Отключить / включить элементы меню означает показать / скрыть его. Итак, мы можем сделать это с помощью кода ниже в файле темы
/**
* 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;
}
}
}
}
Большое спасибо за поддержку!
Вам нужно исключить меню из кеша, если вы собираетесь изменять его динамически:
/**
* 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']);
}
Спасибо за поддержку !