我有一个自联接表,其中每个文件夹都有一个父文件夹,其深度不受限制。一个文件夹可以将另一个文件夹作为父文件夹,对深度没有限制。
今天我的代码看起来像这样,我正在寻找一种尽可能深入挖掘的方法,而不需要对每一步进行硬编码,是否有一种方法可以定义一个带循环的twig函数,它自己调用在循环的每一轮?
<select id='parent' name='container'>
<option value='none'>No parent</option>
{% for folder in folders %}
<option value='{{ folder.id }}'>{{ folder.name }}</option>
{% for folder in folder.children %}
<option value='{{ folder.id }}'> {{ folder.name }}</option>
{% endfor %}
{% endfor %}
</select>
答案 0 :(得分:9)
您需要一个单独的文件呈现选项,以递归方式包含自身:
<select>
<option value="none">No parent</option>
{% include 'options.html.twig' with {'folders': folders, 'level': 0} %}
</select>
options.html.twig
:
{% for folder in folders %}
<option value="{{ folder.id }}">
{% for i in range(0, level) %} {% endfor %}
{{ folder.name }}
</option>
{% include 'options.html.twig' with {'folders': folder.children, 'level': level + 1} %}
{% endfor %}
我在这里写了这段代码,所以不要指望它是正确的,但它应该足以让你有这个想法。
答案 1 :(得分:0)
这必须使用递归来完成。我从未用树枝测试它,但你可以开发一种机制,你递归地包括一个模板。
因此,您的当前模板将包含在循环中,直到达到特定条件。所以你需要在你的内循环中使用某种if子句。
祝你好运;)