aaronadal / twig-list-loop
在 Twig 中以不同方式显示列表、网格和表格:列表循环。
v1.1
2019-12-12 08:30 UTC
Requires
- twig/twig: ^1.27|^2.0|^3.0
Requires (Dev)
- phpunit/phpunit: ^5.7
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 %}
list
和 else
变量
当你定义一个新的骨架时,你可以访问两个特殊变量:list
和 else
。前者是一个包含列表渲染项的数组,后者包含渲染的 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 %}
很简单,对吧?