テンプレートのようなものを使用できるように、template_preprocess_page()を使用してサイトのメインメニューを変数に割り当てたいと思います{{main_menu}}
。メニューをリージョンに割り当てる必要なしに、これを行う方法についてのアイデアはありますか?
テンプレートのようなものを使用できるように、template_preprocess_page()を使用してサイトのメインメニューを変数に割り当てたいと思います{{main_menu}}
。メニューをリージョンに割り当てる必要なしに、これを行う方法についてのアイデアはありますか?
回答:
メニューはブロックにすることができ、それをレンダリングするには、プリビュー関数でそのビューを読み込んで取得するだけでよいことに注意してください。
THEME.themeファイル
use Drupal\block\Entity\Block;
function THEME_preprocess_page(&$variables) {
$menu = Block::load('id_main_menu');
$variables['main_menu'] = \Drupal::entityTypeManager()->getViewBuilder('block')->view($menu);
}
page.html.twig
...
{{main_menu}}
...
注意
どこかにブロック 'main_menu'を作成する必要があります(モジュールインストール、ブロック構造ページ...)
テーマにたくさんのものをハードコーディングすることはお勧めしません。新しい開発者がサイトで何が起こっているのか理解するのが難しくなるためですが、これはいくつかの方法で可能です。ブロックおよびリージョンシステムを使用することをお勧めします。
これは生データを取得し、メニューツリーを変換しないとアクセスチェックが行われないことを理解することが重要です。メインメニューを公開する必要があるため、これは問題ないかもしれませんが、必ずしもそうではありません。
$menu_name = "main_menu"; // I think
$menu_tree = \Drupal::service('menu.link_tree');
$parameters = new \Drupal\Core\Menu\MenuTreeParameters();
$parameters
->setMaxDepth(1) // Or however far down the tree you want to go.
->onlyEnabledLinks()
->excludeRoot();
$tree = $menu_tree->load($menu_name, $parameters);
// $manipulators = [['callable' => 'menu.default_tree_manipulators::checkAccess']];
// $tree = $menu_tree->transform($tree, $manipulators);
foreach ($tree as $item) {
/** @var \Drupal\Core\Menu\MenuLinkInterface $link */
$link = $item->link;
}
こちらの@Berdirの回答を参照してください:https ://drupal.stackexchange.com/a/153195/42650
var_dump($link); exit;
ですか?