在Drupal 8中显示子菜单树

问题描述 投票:3回答:2

我有一个菜单树,像大陆作为父母,它有亚洲,澳大利亚,欧洲的子菜单。等每个大陆都有国家的子树。

在节点页面和块中,我想列出'Continent'的所有菜单和子菜单树。

在Drupal 7中我们应该使用menu_tree_all_data,在Drupal 8中它应该通过'Menu LinkTree Element'来完成,但我不是很清楚它以及如何使用它。

请评论。

menu tree block drupal-8
2个回答
1
投票

您可以使用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;
}

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.6和Simplify Menu 8.x-2.0中进行了检查

© www.soinside.com 2019 - 2024. All rights reserved.