MenuLinkTree::buildItems

protected MenuLinkTree::buildItems(array $tree, CacheableMetadata &$tree_access_cacheability, CacheableMetadata &$tree_link_cacheability)

Builds the #items property for a menu tree's renderable array.

Helper function for ::build().

Parameters

\Drupal\Core\Menu\MenuLinkTreeElement[] $tree: A data structure representing the tree, as returned from MenuLinkTreeInterface::load().

\Drupal\Core\Cache\CacheableMetadata &$tree_access_cacheability: Internal use only. The aggregated cacheability metadata for the access results across the entire tree. Used when rendering the root level.

\Drupal\Core\Cache\CacheableMetadata &$tree_link_cacheability: Internal use only. The aggregated cacheability metadata for the menu links across the entire tree. Used when rendering the root level.

Return value

array The value to use for the #items property of a renderable menu.

Throws

\DomainException

File

core/lib/Drupal/Core/Menu/MenuLinkTree.php, line 204

Class

MenuLinkTree
Implements the loading, transforming and rendering of menu link trees.

Namespace

Drupal\Core\Menu

Code

protected function buildItems(array $tree, CacheableMetadata &$tree_access_cacheability, CacheableMetadata &$tree_link_cacheability) {
  $items = array();

  foreach ($tree as $data) {
    /** @var \Drupal\Core\Menu\MenuLinkInterface $link */
    $link = $data->link;
    // Generally we only deal with visible links, but just in case.
    if (!$link->isEnabled()) {
      continue;
    }

    if ($data->access !== NULL && !$data->access instanceof AccessResultInterface) {
      throw new \DomainException('MenuLinkTreeElement::access must be either NULL or an AccessResultInterface object.');
    }

    // Gather the access cacheability of every item in the menu link tree,
    // including inaccessible items. This allows us to render cache the menu
    // tree, yet still automatically vary the rendered menu by the same cache
    // contexts that the access results vary by.
    // However, if $data->access is not an AccessResultInterface object, this
    // will still render the menu link, because this method does not want to
    // require access checking to be able to render a menu tree.
    if ($data->access instanceof AccessResultInterface) {
      $tree_access_cacheability = $tree_access_cacheability->merge(CacheableMetadata::createFromObject($data->access));
    }

    // Gather the cacheability of every item in the menu link tree. Some links
    // may be dynamic: they may have a dynamic text (e.g. a "Hi, <user>" link
    // text, which would vary by 'user' cache context), or a dynamic route
    // name or route parameters.
    $tree_link_cacheability = $tree_link_cacheability->merge(CacheableMetadata::createFromObject($data->link));

    // Only render accessible links.
    if ($data->access instanceof AccessResultInterface && !$data->access->isAllowed()) {
      continue;
    }
    $element = [];

    // Set a variable for the <li> tag. Only set 'expanded' to true if the
    // link also has visible children within the current tree.
    $element['is_expanded'] = FALSE;
    $element['is_collapsed'] = FALSE;
    if ($data->hasChildren && !empty($data->subtree)) {
      $element['is_expanded'] = TRUE;
    }
    elseif ($data->hasChildren) {
      $element['is_collapsed'] = TRUE;
    }
    // Set a helper variable to indicate whether the link is in the active
    // trail.
    $element['in_active_trail'] = FALSE;
    if ($data->inActiveTrail) {
      $element['in_active_trail'] = TRUE;
    }

    // Note: links are rendered in the menu.html.twig template; and they
    // automatically bubble their associated cacheability metadata.
    $element['attributes'] = new Attribute();
    $element['title'] = $link->getTitle();
    $element['url'] = $link->getUrlObject();
    $element['url']->setOption('set_active_class', TRUE);
    $element['below'] = $data->subtree ? $this->buildItems($data->subtree, $tree_access_cacheability, $tree_link_cacheability) : array();
    if (isset($data->options)) {
      $element['url']->setOptions(NestedArray::mergeDeep($element['url']->getOptions(), $data->options));
    }
    $element['original_link'] = $link;
    // Index using the link's unique ID.
    $items[$link->getPluginId()] = $element;
  }

  return $items;
}
doc_Drupal
2016-10-29 09:27:17
Comments
Leave a Comment

Please login to continue.