【问题标题】:Displaying sub menu tree in Drupal 8在 Drupal 8 中显示子菜单树
【发布时间】:2016-04-21 11:50:51
【问题描述】:

我有一个菜单树,比如 Continent 作为父级,它有亚洲、澳大利亚、欧洲的子菜单。等等,每个大陆都有国家的子树。

在一个节点页面和一个块中,我想列出“大陆”的所有菜单和子菜单树。

在 Drupl 7 中我们应该使用 menu_tree_all_data,在 Drupal 8 中应该通过 'MenuLinkTreeElement' 来完成,但我不太清楚它以及如何使用它。

请发表评论。

【问题讨论】:

  • 通过使用这个drupal.org/node/2416715,我只能获得父菜单(大陆),但无法获得他们的子菜单(国家)。

标签: menu tree block drupal-8


【解决方案1】:

如果您使用Simplify Menu,则在您的.html.twig 文件中使用以下代码:

 <div class="menu-container">
  {% set items = simplify_menu('main') %}
    <ul class="list-container">
      {% for menu_item in items.menu_tree %}
        <li class="{{ item_class }} navigation__item">
          <a href="{{ menu_item.url }}" class="{{ menu_item.text }}">{{ menu_item.text }}</a>
          {% if menu_item.submenu %}
            <ul>
              {% for sub_menu_item in menu_item.submenu %}
                <li>
                  <a href="{{ sub_menu_item.url }}">{{ sub_menu_item.text }}</a>
                </li>
              {% endfor %}
            </ul>
          {% endif %}
        </li>
      {% endfor %}
    </ul>
 </div>

注意: 此代码已在 Drupal Core 8.6Simplify Menu 8.x-2.0

中检查

【讨论】:

    【解决方案2】:

    您可以使用Simplify Menu 模块,然后您可以像这样在树枝模板中将菜单树渲染为数组

    {% set items = simplify_menu('main') %}
    {% for menu_item in items.menu_tree %}
      <li>
        <a href="{{ menu_item.url }}">{{ menu_item.text }}</a>
        {% if submenuLevel1Item.description %}
          <ul>
            {% for sub_menu_item in menu_item.submenu %}
              <li>
                <a href="{{ sub_menu_item.url }}">{{ sub_menu_item.text }}</a>
              </li>
            {% endfor %}
          </ul>
        {% endif %}
      </li>
    {% endfor %}
    

    更多参数kint(items)

    或者(如果您不想安装模块)您需要预处理菜单项并将其传递给树枝,如下所示

    $menu_parameters = new \Drupal\Core\Menu\MenuTreeParameters();
    // If you need to set depth of the tree
    $menu_parameters->setMaxDepth(2);
    // If you need only enabled links
    $menu_parameters->onlyEnabledLinks();
    $menus = \Drupal::menuTree()->load('Your Menu name', $menu_parameters);
    $menuItems = [];
    foreach ($menus as $key => $value) {
      $menuUUIDArray = explode(':', $key);
      $uuid = $menuUUIDArray[1];
      $menuItem = [];
      // If its a multi lingual site
      $languageCode = \Drupal::languageManager()->getCurrentLanguage()->getId();
      $menu_content = current(\Drupal::entityManager()->getStorage('menu_link_content')->loadByProperties(array('uuid' => $uuid)));
      if ($menu_content->hasTranslation($languageCode)) {
        $menu_content = $menu_content->getTranslation($languageCode);
      }
      $url = $menu_content->getUrlObject();
      $menuItem['title'] = $menu_content->get('title')->value;
      $menuItem['link'] = ($url->toString() == '') ? '#' : $url->toString();
      $menuItem['weight'] = $menu_content->get('weight')->value;
      if ($value->hasChildren) {
        $subTreeArray = $value->subtree;
        foreach ($subTreeArray as $key => $child) {
        }
       // use foreach OR recursion to get the values
       $menuItem['children'] = ......
      }
      $menuItems = $menuItem;
    }
    

    【讨论】:

      【解决方案3】:
      $tree = \Drupal::menuTree()->load('main', new \Drupal\Core\Menu\MenuTreeParameters());
          
          function loadMenu($tree) {
            $menu = [];
            foreach ($tree as $item) {
              if($item->link->isEnabled()) {
                $menu[] = [
                  'weight' => $item->link->getWeight(),
                  'title' => $item->link->getTitle(),
                  'url' => $item->link->getUrlObject(),
                  'has_children' => $item->hasChildren,
                  'children' => loadMenu($item->subtree),
                ];
              }
            }
            return $menu;
          }
      

      更多信息:https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Menu%21MenuLinkBase.php/class/MenuLinkBase/8.9.x

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多