我有一个菜单树,像大陆作为父母,它有亚洲,澳大利亚,欧洲的子菜单。等每个大陆都有国家的子树。
在节点页面和块中,我想列出'Continent'的所有菜单和子菜单树。
在Drupal 7中我们应该使用menu_tree_all_data,在Drupal 8中它应该通过'Menu LinkTree Element'来完成,但我不是很清楚它以及如何使用它。
请评论。
您可以使用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;
}
如果您使用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中进行了检查