web-dev-qa-db-ja.com

メニューツリーを連想配列にする方法は?

Drupalメニューコアを掘り下げて、メニューツリー(たとえば、アカウントメニュー)から連想配列を構築して、データをjson形式で出力できるようにする方法を見つけました。しかし、 Drupal 8.ではこれを行うことができないようです。メニューツリーから必要な情報には、タイトル、説明、URLが含まれます。また、サブメニューがあるかどうか、およびそれが有効かどうかを知る必要があります。 。Drupal 7.のmenu_build_tree()関数を使用して、これをすべて簡単に実現できます。いわゆるDrupal 8 menu_build_tree()\Drupal::menuTree();)しかし、必要なデータを抽出する方法がわからない大きなオブジェクトを取得するだけです。

7
jiaxin

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...
}

linkMenuLinkInterface であり、各アイテム自体は MenuLinkTreeElement です。

menu.link_treeから取得するのではなく、可能であれば \Drupal サービスを挿入することをお勧めします。

12
Clive

私はかなり遅れていますが、答えを探している誰かを助けるかもしれません。これがメニュー項目から再帰的な配列を生成するための私の解決策です。

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);
7
Siim