public function UltimenuManager::buildMenuItem in Ultimenu 8.2
Build the Ultimenu item.
Parameters
object $data: The data containing menu item.
array $active_trails: The menu item active trail ids.
array $config: The config available for the menu item.
Return value
array An array of the ultimenu item.
Overrides UltimenuManagerInterface::buildMenuItem
1 call to UltimenuManager::buildMenuItem()
- UltimenuManager::buildMenuTree in src/
UltimenuManager.php - Build the menu to contain Ultimenu regions.
File
- src/
UltimenuManager.php, line 327
Class
- UltimenuManager
- Implements UltimenuManagerInterface.
Namespace
Drupal\ultimenuCode
public function buildMenuItem($data, array $active_trails, array $config) {
$goodies = $this
->getSetting('goodies');
$link = $data->link;
$url = $link
->getUrlObject();
$mlid = $link
->getPluginId();
$titles = $this->tool
->extractTitleHtml($link);
$title = $titles['title'];
$title_html = $titles['title_html'];
$li_classes = $li_attributes = $li_options = [];
$flyout = '';
// Must run after the title, modified, or not, the region depends on it.
$region = $this->tool
->getRegionKey($link);
$config['has_submenu'] = !empty($config['submenu']) && $link
->isExpanded() && $data->hasChildren;
$config['is_ajax_region'] = FALSE;
$config['is_active'] = array_key_exists($mlid, $active_trails);
$config['title'] = $title;
$config['mlid'] = $mlid;
$li_options['title-class'] = $title;
$li_options['mlid-hash-class'] = $this->tool
->getShortenedHash($mlid);
if (!empty($goodies['mlid-class'])) {
$li_options['mlid-class'] = $link
->getRouteName() == '<front>' ? 'front_page' : $this->tool
->getShortenedUuid($mlid);
}
$link_options = $link
->getOptions();
if ($url
->isRouted()) {
if ($config['is_active']) {
$li_classes[] = 'is-active-trail';
}
// Front page has no active trail.
if ($link
->getRouteName() == '<front>') {
// Intentionally on the second line to not hit it till required.
if ($this->tool
->getPathMatcher()
->isFrontPage()) {
$li_classes[] = 'is-active-trail';
}
}
// Also enable set_active_class for the contained link.
$link_options['set_active_class'] = TRUE;
// Add a "data-drupal-link-system-path" attribute to let the
// drupal.active-link library know the path in a standardized manner.
$system_path = $url
->getInternalPath();
// Special case for the front page.
if ($url
->getRouteName() === '<front>') {
$system_path = '<front>';
}
// @todo System path is deprecated - use the route name and parameters.
$link_options['attributes']['data-drupal-link-system-path'] = $system_path;
$config['system_path'] = $system_path;
}
// Remove browser tooltip if so configured.
if (!empty($goodies['no-tooltip'])) {
$link_options['attributes']['title'] = '';
}
// Add LI title class based on title if so configured.
foreach ($li_options as $li_key => $li_value) {
if (!empty($goodies[$li_key])) {
$li_classes[] = Html::cleanCssIdentifier(mb_strtolower('uitem--' . str_replace('_', '-', $li_value)));
}
}
// Add hint for external link.
if ($url
->isExternal()) {
$link_options['attributes']['class'][] = 'is-external';
}
// Add LI counter class based on counter if so configured.
if (!empty($goodies['counter-class'])) {
static $item_id = 0;
$li_classes[] = 'uitem--' . ++$item_id;
}
// Handle list item class attributes.
$li_attributes['class'] = array_merge([
'ultimenu__item',
'uitem',
], $li_classes);
// Flyout.
$flyout = $this
->getFlyout($region, $config);
// Provides hints for AJAX.
$orientation = 'is-' . str_replace('ultimenu--', '', $config['orientation']);
$flyout_attributes['class'] = [
'ultimenu__flyout',
$orientation,
];
if (!empty($flyout)) {
if ($config['is_ajax_region']) {
$flyout_attributes['data-ultiajax-region'] = $region;
$link_options['attributes']['data-ultiajax-trigger'] = TRUE;
}
$title_html .= '<span class="caret" aria-hidden="true"></span>';
}
$extra_classes = isset($link_options['attributes']['class']) ? $link_options['attributes']['class'] : [];
if (!is_array($extra_classes)) {
$extra_classes = [
$extra_classes,
];
}
$link_options['attributes']['class'] = $extra_classes ? array_merge([
'ultimenu__link',
], $extra_classes) : [
'ultimenu__link',
];
$link_element = [
'#type' => 'link',
'#options' => $link_options,
'#url' => $url,
'#title' => [
'#markup' => $title_html,
'#allowed_tags' => [
'b',
'em',
'i',
'small',
'span',
'strong',
],
],
];
// Pass link to template.
return [
'link' => $link_element,
'flyout' => $flyout,
'attributes' => new Attribute($li_attributes),
'flyout_attributes' => new Attribute($flyout_attributes),
'config' => $config,
];
}