template_preprocess_pageのメインメニューにアクセスするにはどうすればよいですか?


7

テンプレートのようなものを使用できるように、template_preprocess_page()を使用してサイトのメインメニューを変数に割り当てたいと思います{{main_menu}}。メニューをリージョンに割り当てる必要なしに、これを行う方法についてのアイデアはありますか?

回答:


8

メニューはブロックにすることができ、それをレンダリングするには、プリビュー関数でそのビューを読み込んで取得するだけでよいことに注意してください。

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'を作成する必要があります(モジュールインストール、ブロック構造ページ...)


メニューはブロックではありません。ただし、コアメニューモジュールは、各メニューのブロックプラグイン(または派生物を持つ1つのプラグイン)を提供します。
mradcliffe 2016

6

テーマにたくさんのものをハードコーディングすることはお勧めしません。新しい開発者がサイトで何が起こっているのか理解するのが難しくなるためですが、これはいくつかの方法で可能です。ブロックおよびリージョンシステムを使用することをお勧めします。

menu.link_treeサービスを使用してゼロから構築する

これは生データを取得し、メニューツリーを変換しないとアクセスチェックが行われないことを理解することが重要です。メインメニューを公開する必要があるため、これは問題ないかもしれませんが、必ずしもそうではありません。

$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


1
これは私が行きたいルートのように見えますが、そのループ内でdie(print_r($ link))を実行すると、完全に空白の結果が得られます。$ treeを印刷しようとしたときにも同じことが起こります。私は再確認しましたが、メニュー名は正しく、残りのコードはまったく同じです。私はこれを前処理ページ機能で実行しています
Matt

1
どうvar_dump($link); exit;ですか?
mradcliffe 2017年

1
@Mattと同じ問題
GiorgosK
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.