使用 parents、children、grandchildren 递归解析分层 Twig 布局

Recursive parsing of hierarchical Twig layout with parents, children, grandchildren

在我的 SF2 项目中,我有一个实体(类别),我以分层格式表示,顶部是 parent,然后是 children、grandchildren 等.

Category 实体有一个 getChildren 方法,该方法有效 returns Category 实体 objects.

我正在尝试找到一种使此布局更具动态性的方法,而不必在模板中显式设置 childrengrandchildren 变量。

有更好的方法吗?

<ul class="sortable">
    {% for cat in cats %}
        {% set children = cat.getChildren %}
        <li id="menuItem_{{ cat.id }}">
            <div data-id="{{ cat.id }}">
                <span>{{ cat.name }}</span>
            </div>
            {% for child in children %}
                {% set grandchildren = child.getChildren %}
                <ul>
                    <li id="menuItem_{{ child.id }}">
                        <div data-id="{{ child.id }}">
                            {{ child.name }}
                        </div>
                        {% for grandchild in grandchildren %}
                            <ul>
                                <li id="menuItem_{{ grandchild.id }}">
                                    <div data-id="{{ grandchild.id }}">
                                        {{ grandchild.name }}
                                    </div>
                                </li>
                            </ul>
                        {% endfor %}
                    </li>
                </ul>
            {% endfor %}
        </li>
    {% endfor %}
</ul>

那么您要实现的是对树枝中的树进行递归解析,对吗?
如果是这样,看看 macros .

{% import _self as macros %}

{% macro showChild(object) %}
  {% import _self as macros %}
  <ul>
    {% for child in object.children %}
      {{ macros.showChild(child) }}
    {% endfor %}
    <li id="menuItem_{{ object.id }}">
      <div data-id="{{ object.id }}">
        {{ object.name }}
      </div>
    </li>
  </ul>
{% endmacro %}

<ul class="sortable">
  {% for cat in cats %}
    {{ macros.showChild(cat) }}
  {% endfor %}
</ul>

就这些了:)
如果您需要帮助,请告诉我

编辑 1:
如果你想在另一个文件中使用宏,删除 "import _self" 行并在另一个文件中使用别名导入它:

index.html.twig:
{% import 'macro_file_name.html.twig' as macros %}

那你就可以用同样的记法来称呼它了