4

我有一个自联接表,其中每个文件夹都有一个父级,并且其深度是无限的。一个文件夹可以有另一个文件夹作为父文件夹,深度没有限制。

今天我的代码看起来像这样,我正在寻找一种无需对每一步都进行硬编码的情况下尽可能深入挖掘的方法,是否有一种方法可以定义一个带有循环的 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 }}'>&nbsp;&nbsp;&nbsp;{{ folder.name }}</option>    
                {% endfor %}
        {% endfor %}
</select>  
4

2 回答 2

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) %}&nbsp;{% endfor %}
        {{ folder.name }}
    </option>

    {% include 'options.html.twig' with {'folders': folder.children, 'level': level + 1} %}
{% endfor %}

我在这里写了这段代码,所以不要指望它是正确的,但它应该足以给你这个想法。

于 2012-09-25T13:22:03.313 回答
0

这必须使用递归来完成。我从来没有用树枝测试过它,但你可以开发一种机制,你可以递归地包含一个模板。

因此,您当前的模板会将自身包含在循环中,直到达到特定条件。因此,您的内部循环中需要某种 if 子句。

祝你好运 ;)

于 2012-09-25T13:17:41.793 回答