Drupalメニューコアを掘り下げて、メニューツリー(たとえば、アカウントメニュー)から連想配列を構築して、データをjson形式で出力できるようにする方法を見つけました。しかし、 Drupal 8.ではこれを行うことができないようです。メニューツリーから必要な情報には、タイトル、説明、URLが含まれます。また、サブメニューがあるかどうか、およびそれが有効かどうかを知る必要があります。 。Drupal 7.のmenu_build_tree()
関数を使用して、これをすべて簡単に実現できます。いわゆるDrupal 8 menu_build_tree()
(\Drupal::menuTree()
;)しかし、必要なデータを抽出する方法がわからない大きなオブジェクトを取得するだけです。
MenuLinkTree::load
を使用してメニューツリーをロードできます。これにより、操作するメニューリンクの配列が得られます。そこからは、ループして必要なものを取得するだけです。
$tree = \Drupal::menuTree()->load('main', new \Drupal\Core\Menu\MenuTreeParameters());
foreach ($tree as $item) {
$title = $item->link->getTitle();
$url_obj = $item->link->getUrlObject();
$has_children = $item->hasChildren;
// etc...
}
link
は MenuLinkInterface
であり、各アイテム自体は MenuLinkTreeElement
です。
menu.link_tree
から取得するのではなく、可能であれば \Drupal
サービスを挿入することをお勧めします。
私はかなり遅れていますが、答えを探している誰かを助けるかもしれません。これがメニュー項目から再帰的な配列を生成するための私の解決策です。
private function generateSubMenuTree(&$output, &$input, $parent = FALSE) {
$input = array_values($input);
foreach($input as $key => $item) {
//If menu element disabled skip this branch
if ($item->link->isEnabled()) {
$key = 'submenu-' . $key;
$name = $item->link->getTitle();
$url = $item->link->getUrlObject();
$url_string = $url->toString();
//If not root element, add as child
if ($parent === FALSE) {
$output[$key] = [
'name' => $name,
'tid' => $key,
'url_str' => $url_string
];
} else {
$parent = 'submenu-' . $parent;
$output['child'][$key] = [
'name' => $name,
'tid' => $key,
'url_str' => $url_string
];
}
if ($item->hasChildren) {
if ($item->depth == 1) {
$this->generateSubMenuTree($output[$key], $item->subtree, $key);
} else {
$this->generateSubMenuTree($output['child'][$key], $item->subtree, $key);
}
}
}
}
そして、その関数を
//Get drupal menu
$sub_nav = \Drupal::menuTree()->load('sub-navigation', new \Drupal\Core\Menu\MenuTreeParameters());
//Generate array
$this->generateSubMenuTree($menu_tree2, $sub_nav);