You are here

public function MicrositeMenu::build in Entity Reference Hierarchy 8.2

Same name and namespace in other branches
  1. 3.x modules/entity_hierarchy_microsite/src/Plugin/Block/MicrositeMenu.php \Drupal\entity_hierarchy_microsite\Plugin\Block\MicrositeMenu::build()

Builds and returns the renderable array for this block plugin.

If a block should not be rendered because it has no content, then this method must also ensure to return no content: it must then only return an empty array, or an empty array with #cache set (with cacheability metadata indicating the circumstances for it being empty).

Return value

array A renderable array representing the content of the block.

Overrides SystemMenuBlock::build

See also

\Drupal\block\BlockViewBuilder

File

modules/entity_hierarchy_microsite/src/Plugin/Block/MicrositeMenu.php, line 69

Class

MicrositeMenu
Defines a class for a microsite menu.

Namespace

Drupal\entity_hierarchy_microsite\Plugin\Block

Code

public function build() {
  $cache = new CacheableMetadata();
  if (!($node = $this
    ->getContextValue('node')) || !$node instanceof NodeInterface || !($microsites = $this->childOfMicrositeLookup
    ->findMicrositesForNodeAndField($node, $this->configuration['field']))) {
    $build = [];
    if ($node) {
      $cache
        ->addCacheableDependency($node);
    }
    $cache
      ->applyTo($build);
    return $build;
  }

  /** @var \Drupal\entity_hierarchy_microsite\Entity\MicrositeInterface $microsite */
  $microsite = reset($microsites);
  $cache
    ->addCacheableDependency($node);
  $cache
    ->addCacheableDependency($microsite);
  if ($home = $microsite
    ->getHome()) {
    $cache
      ->addCacheableDependency($home);
  }
  $menu_name = $this
    ->getDerivativeId();
  if ($this->configuration['expand_all_items']) {
    $parameters = new MenuTreeParameters();
    $active_trail = $this->menuActiveTrail
      ->getActiveTrailIds($menu_name);
    $parameters
      ->setActiveTrail($active_trail);
  }
  else {
    $parameters = $this->menuTree
      ->getCurrentRouteMenuTreeParameters($menu_name);
  }
  if ($home) {
    $parameters
      ->setRoot('entity_hierarchy_microsite:' . $home
      ->uuid());
  }

  // Adjust the menu tree parameters based on the block's configuration.
  $level = $this->configuration['level'];
  $depth = $this->configuration['depth'];
  $parameters
    ->setMinDepth($level);

  // When the depth is configured to zero, there is no depth limit. When depth
  // is non-zero, it indicates the number of levels that must be displayed.
  // Hence this is a relative depth that we must convert to an actual
  // (absolute) depth, that may never exceed the maximum depth.
  if ($depth > 0) {
    $parameters
      ->setMaxDepth(min($level + $depth - 1, $this->menuTree
      ->maxDepth()));
  }

  // For menu blocks with start level greater than 1, only show menu items
  // from the current active trail. Adjust the root according to the current
  // position in the menu in order to determine if we can show the subtree.
  if ($level > 1) {
    if (count($parameters->activeTrail) >= $level) {

      // Active trail array is child-first. Reverse it, and pull the new menu
      // root based on the parent of the configured start level.
      $menu_trail_ids = array_reverse(array_values($parameters->activeTrail));
      if ($depth > 0) {
        $parameters
          ->setMaxDepth(min($level - 1 + $depth - 1, $this->menuTree
          ->maxDepth()));
      }
    }
    else {
      $build = [];
      $cache
        ->applyTo($build);
      return $build;
    }
  }
  $tree = $this->menuTree
    ->load($menu_name, $parameters);
  $manipulators = [
    [
      'callable' => 'menu.default_tree_manipulators:checkAccess',
    ],
    [
      'callable' => 'menu.default_tree_manipulators:generateIndexAndSort',
    ],
  ];
  $tree = $this->menuTree
    ->transform($tree, $manipulators);
  $build = $this->menuTree
    ->build($tree);
  $cache
    ->applyTo($build);
  return $build;
}