You are here

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\ultimenu

Code

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,
  ];
}