2

我在 Twig 模板中有循环:

{% for item in 1..0 %}
     {{ item }}
{% endfor %}

(当然在现实生活中不是 0 而是变量值)。我希望在此示例中不会执行循环,因为 0 小于 1。但实际上它显示

1 0 

问题:在这个例子中是否有任何方法在 Twig (或其他循环)中使用简单的 for 循环来告诉 Twig 我不想迭代 ++ - 或者如果 0 小于 1,我必须在循环之前添加条件来检查

编辑

当然我知道我可以在 PHP 中创建数组并在 Twig 模板中使用它,但是这种情况呢 - 无需在 PHP 中创建数组

编辑2

我希望它可以简单地用于生成星级。现在我需要代码,因为如果检查每个 for 循环,我必须添加额外的代码:

{%  if full_stars_number >= 1 %}
    {%  for item in 1..full_stars_number %}
       <img src="img/full_star.png" />
    {% endfor %}
{% endif %}
{%  if half_stars_number >= 1 %}
    {%  for item in 1..half_stars_number %}
       <img src="img/half_star.png" />
    {% endfor %}
{% endif %}
{%  if empty_stars_number >= 1 %}
    {%  for item in 1..empty_stars_number %}
       <img src="img/empty_star.png" />
    {% endfor %}
{% endif %}
4

2 回答 2

1

1..x生成一个包含值的集合。它可以按升序或降序排列。这是意料之中的。

我不确定您要达到什么目标,但是您描述的方式在 twig 开箱即用中是不可能的。

您可以编写自己的twig 函数,它会生成值,或者返回一个空数组:

{% set itemsCount = 0 %}
{% for item in my_crazy_function(itemsCount) %}
    {{ item }}
{% endfor %}

编辑:

如果你只是想重复一个值的次数,你可以编写一个树枝过滤器:

{{ '<img src="img/empty_star.png" />' | repeat(5) }}

函数实现可能只是对 PHP 的str_repeat的调用:

class Project_Twig_Extension extends Twig_Extension
{
    public function getFilters()
    {
        return array(
            new Twig_SimpleFilter('repeat', 'str_repeat'),
        );
    }

    // ...
}
于 2014-05-15T12:16:12.517 回答
1

试试这个:

{%  for item in 1..full_stars_number if full_stars_number>0 %}
   <img src="img/full_star.png" />
{% endfor %}

{%  for item in 1..half_stars_number if half_stars_number>0 %}
   <img src="img/half_star.png" />
{% endfor %}

{%  for item in 1..empty_stars_number if empty_stars_number>0 %}
   <img src="img/empty_star.png" />
{% endfor %}

这与您在 EDIT2 中所做的基本相同,但方式更加简洁。

于 2014-05-15T13:02:56.390 回答