次のように、特定のメニューのリンクメニューの子項目(第1レベルのみ)のリストを含むブロックを作成する必要があります。
このコードを使用してメニュー項目を設定できますが、各項目を処理してメニュー項目のタイトルとメニュー項目のURLを取得する方法がわかりません。
$menu_name = 'main';
$menu_tree = \Drupal::menuTree();
$parameters = $menu_tree->getCurrentRouteMenuTreeParameters($menu_name);
$parameters->setMinDepth(0);
$tree = $menu_tree->load($menu_name, $parameters);
$manipulators = array(
array('callable' => 'menu.default_tree_manipulators:checkAccess'),
array('callable' => 'menu.default_tree_manipulators:generateIndexAndSort'),
);
$tree = $menu_tree->transform($tree, $manipulators);
私はこの質問に基づいた答えを見つけました: メニューツリーを連想配列に変換する方法?
各配列要素を MenuLinkInterface のアイテムとして使用できます
他のパラメータを確認するには、クラス MenuTreeParameters を確認します
<?php
/**
* @file
* Contains \Drupal\YOUR_MODULE\Plugin\Block\SectionsFooter.
*/
namespace Drupal\YOUR_MODULE\Plugin\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Link;
/**
* Provides a 'SectionsFooter' block.
*
* @Block(
* id = "sections_footer",
* admin_label = @Translation("Sections"),
* category = @Translation("YOUR_MODULE")
* )
*/
class SectionsFooter extends BlockBase {
/**
* {@inheritdoc}
*/
public function build() {
$menu_name = 'main';
$menu_tree = \Drupal::menuTree();
$parameters = $menu_tree->getCurrentRouteMenuTreeParameters($menu_name);
$parameters->setMinDepth(0);
//Delete comments to have only enabled links
//$parameters->onlyEnabledLinks();
$tree = $menu_tree->load($menu_name, $parameters);
$manipulators = array(
array('callable' => 'menu.default_tree_manipulators:checkAccess'),
array('callable' => 'menu.default_tree_manipulators:generateIndexAndSort'),
);
$tree = $menu_tree->transform($tree, $manipulators);
$list = [];
foreach ($tree as $item) {
$title = $item->link->getTitle();
$url = $item->link->getUrlObject();
$list[] = Link::fromTextAndUrl($title, $url);
}
$output['sections'] = array(
'#theme' => 'item_list',
'#items' => $list,
);
return $output;
}
}
参照: