小智 110
感谢domi27,我玩弄了你的想法并想出了这个.我做了一个嵌套数组作为我的树,['link'] ['sublinks']为null或另一个更多相同的数组.
模板
用于递归的子模板文件:
<!--includes/menu-links.html-->
{% for link in links %}
<li>
<a href="{{ link.href }}">{{ link.name }}</a>
{% if link.sublinks %}
<ul>
{% include "includes/menu-links.html" with {'links': link.sublinks} %}
</ul>
{% endif %}
</li>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
然后在主模板中调用它(有点多余的'带'那里的东西):
<ul class="main-menu">
{% include "includes/menu-links.html" with {'links':links} only %}
</ul>
Run Code Online (Sandbox Code Playgroud)
宏
使用宏可以实现类似的效果:
<!--macros/menu-macros.html-->
{% macro menu_links(links) %}
{% for link in links %}
<li>
<a href="{{ link.href }}">{{ link.name }}</a>
{% if link.sublinks %}
<ul>
{{ _self.menu_links(link.sublinks) }}
</ul>
{% endif %}
</li>
{% endfor %}
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)
在主模板中执行以下操作:
{% import "macros/menu-macros.html" as macros %}
<ul class="main-menu">
{{ macros.menu_links(links) }}
</ul>
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你 :)
flu*_*flu 35
如果你想在同一个模板中使用一个宏,你应该使用这样的东西来保持与Twig 2.x兼容:
{% macro menu_links(links) %}
{% import _self as macros %}
{% for link in links %}
<li>
<a href="{{ link.href }}">{{ link.name }}</a>
{% if link.sublinks %}
<ul>
{{ macros.menu_links(link.sublinks) }}
</ul>
{% endif %}
</li>
{% endfor %}
{% endmacro %}
{% import _self as macros %}
<ul class="main-menu">
{{ macros.menu_links(links) }}
</ul>
Run Code Online (Sandbox Code Playgroud)
这扩展了random-coder
答案,并将有关宏的文档dr.scre
提示结合到现在使用但在本地导入._self
一开始我以为这个问题可以通过简单的方式解决,但事实并非如此简单。
您需要创建逻辑(可能使用 PHP 类方法),何时包含 Twig 子模板,何时不包含。
<!-- tpl.html.twig -->
<ul>
{% for key, item in menu %}
{# Pseudo Twig code #}
{% if item|hassubitem %}
{% include "subitem.html.tpl" %}
{% else %}
<li>{{ item }}</li>
{% endif %}
{% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)
因此,您可以使用特殊的Twig 循环变量,该变量在 Twig for 循环中可用。但我不确定这个循环变量的范围。
此信息和其他信息可在Twigs“for”Docu上找到!