menu_item_fields-8.x-1.5/menu_item_fields.module
menu_item_fields.module
<?php
/**
* @file
* Contains hooks for the Menu Item Fields module.
*/
use Drupal\menu_item_fields\Render\Callback;
/**
* Implements hook_preprocess_menu().
*
* Render menu_link_content entities in the menu tree recursively.
*/
function menu_item_fields_preprocess_menu(&$variables) {
$menu_link_content_prefix = 'menu_link_content:';
$viewBuilder = \Drupal::entityTypeManager()
->getViewBuilder('menu_link_content');
$entityRepository = \Drupal::service('entity.repository');
$viewDisplayStorage = \Drupal::entityTypeManager()->getStorage('entity_view_display');
foreach ($variables['items'] as $itemId => &$item) {
// Recursively preprocess the items below.
if ($item['below']) {
$below_variables = [
'items' => $item['below'],
'view_mode' => $variables['view_mode'] ?? '',
'view_mode_override_field' => $variables['view_mode_override_field'] ?? '',
];
menu_item_fields_preprocess_menu($below_variables);
$item['below'] = $below_variables['items'];
}
if (!str_starts_with($itemId, $menu_link_content_prefix)) {
continue;
}
$uuid = substr($itemId, strlen($menu_link_content_prefix));
$menuLinkContent = $entityRepository->loadEntityByUuid('menu_link_content', $uuid);
// Override the view mode with a field value.
$viewMode = $variables['view_mode'] ?? 'default';
if ($variables['view_mode_override_field'] ?? '') {
$viewModeValue = $menuLinkContent->get($variables['view_mode_override_field'])->getString();
if ($viewModeValue && $viewDisplayStorage->load('menu_link_content.' . $menuLinkContent->bundle() . '.' . $viewModeValue)) {
$viewMode = $viewModeValue;
}
}
$content = $viewBuilder->view($menuLinkContent, $viewMode);
$content['#menu_item'] = $item;
$content['#pre_render'][] = [Callback::class, 'preRenderMenuLinkContent'];
$item['content'] = $content;
}
}
