function SystemMenuBlock::build

Same name and namespace in other branches
  1. 9 core/modules/system/src/Plugin/Block/SystemMenuBlock.php \Drupal\system\Plugin\Block\SystemMenuBlock::build()
  2. 8.9.x core/modules/system/src/Plugin/Block/SystemMenuBlock.php \Drupal\system\Plugin\Block\SystemMenuBlock::build()
  3. 10 core/modules/system/src/Plugin/Block/SystemMenuBlock.php \Drupal\system\Plugin\Block\SystemMenuBlock::build()

Overrides BlockPluginInterface::build

1 method overrides SystemMenuBlock::build()
NavigationMenuBlock::build in core/modules/navigation/src/Plugin/Block/NavigationMenuBlock.php
Builds and returns the renderable array for this block plugin.

File

core/modules/system/src/Plugin/Block/SystemMenuBlock.php, line 149

Class

SystemMenuBlock
Provides a generic Menu block.

Namespace

Drupal\system\Plugin\Block

Code

public function build() {
    $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);
    }
    // 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));
            $menu_root = $menu_trail_ids[$level - 1];
            $parameters->setRoot($menu_root)
                ->setMinDepth(1);
            if ($depth > 0) {
                $parameters->setMaxDepth(min($level - 1 + $depth - 1, $this->menuTree
                    ->maxDepth()));
            }
        }
        else {
            return [];
        }
    }
    $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);
    return $this->menuTree
        ->build($tree);
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.