aaronadal/twig-list-loop

在 Twig 中以不同方式显示列表、网格和表格:列表循环。

v1.1 2019-12-12 08:30 UTC

This package is auto-updated.

Last update: 2024-09-12 19:24:47 UTC


README

Twig 中以不同方式显示列表、网格和表格。

假设你想要在你的 web 应用程序中创建几个相似的表格。能够定义一个单个模板骨架并在灵活的方式下重用它将会非常棒,对吧?这正是这个 Twig 标签所做的事情。让我们看看它的实际应用。

创建你的第一个列表骨架

假设你在应用程序中有两个表格:一个教师表和一个学生表。你可能想要创建一些类似的列表骨架,如下所示

{# table.tpl.twig #}
<table class="table">
    <tbody>
    {% for item in list %}
        {{ item | raw }}
    {% endfor %}
    </tbody>
</table>

你现在可以使用列表循环如下

{% list teacher in teachers using 'table.tpl.twig' %}
    <tr>
        <td>{{ teacher.id }}</td>
        <td>{{ teacher.name }}</td>
        <td>{{ teacher.subject }}</td>
    </tr>
{% endlist %}

{% list student in students using 'table.tpl.twig' %}
    <tr>
        <td>{{ student.id }}</td>
        <td>{{ student.name }}</td>
        <td>{{ student.teacher.name }}</td>
    </tr>
{% endlist %}

如你所见,语法几乎与 for 循环相同。唯一的区别是紧跟在模板骨架之后的 using 关键字。

与 for 循环一样,你也有权访问 loop 变量,并可以指定一个内联 if 表达式

{% list teacher in teachers if teacher.alive using 'table.tpl.twig' %}
    <tr>
        <td>{{ loop.index }}</td>
        <td>{{ teacher.id }}</td>
        <td>{{ teacher.name }}</td>
        <td>{{ teacher.subject }}</td>
    </tr>
{% endlist %}

listelse 变量

当你定义一个新的骨架时,你可以访问两个特殊变量:listelse。前者是一个包含列表渲染项的数组,后者包含渲染的 else 语句。

等等!else 语句?是的,就像在 for 循环中一样,在列表循环中你也可以定义一个 else 语句,并在列表为空时显示它

{# table.tpl.twig #}
{% if list %}
    <table class="table">
        <tbody>
        {% for item in list %}
            {{ item | raw }}
        {% endfor %}
        </tbody>
    </table>
{% else %}
    {{- else | raw -}}
{% endif %}
{% list teacher in teachers using 'table.tpl.twig' %}
    <tr>
        <td>{{ teacher.id }}</td>
        <td>{{ teacher.name }}</td>
        <td>{{ teacher.subject }}</td>
    </tr>
{% else %}
    <p class="error">Oops! There are no teachers.</p>
{% endlist %}

注意:如果定义了 else 语句,则 else 变量将始终包含它。这是骨架的职责来决定是否需要显示它。在上面的例子中,这是通过一个简单的条件来完成的:如果列表不为空,则显示表格,否则显示 else 消息。

将参数传递给骨架

好吧,这听起来很棒,但...如果我想要向表格添加标题怎么办?我不能将它们硬编码到骨架中,因为它们在不同的表格中可能会变化。

我为你有一个解决方案。在这种情况下,你可以将表格标题作为参数传递给骨架。看看这个片段

{# table.tpl.twig #}
{% if list %}
    {% if headers | default(false) %}
        <thead>
            <tr>
                {% for header in headers %}
                    <th>{{- header -}}</th>
                {% endfor %}
            </tr>
        </thead>
    {% endif %}
    <table class="table">
        <tbody>
        {% for item in list %}
            {{ item | raw }}
        {% endfor %}
        </tbody>
    </table>
{% else %}
    {{- else | raw -}}
{% endif %}
{% set args = {
    headers: ['ID', 'Name', 'Subject']
} %}
{% list teacher in teachers using 'table.tpl.twig' with args %}
    <tr>
        <td>{{ teacher.id }}</td>
        <td>{{ teacher.name }}</td>
        <td>{{ teacher.subject }}</td>
    </tr>
{% else %}
    <p class="error">Oops! There are no teachers.</p>
{% endlist %}

很简单,对吧?