9

我对 twig 有点陌生,我知道可以在模板中添加值并将它们收集到变量中。但我真正需要的是在总结它们之前在模板中显示汇总值。我需要旧 symfony 中的插槽之类的东西。或者在 php 中我可以通过 ob_start() 来做到这一点。有可能在树枝中以某种方式?

我会喜欢这样的。

sum is: {{ sum }} {# obviously it is 0 right here, but i want the value from the calculation #}

{# some content.. #} 

{% set sum = 0 %}

{% for r in a.numbers}

   {% set sum = sum + r.number %}

{% endfor %}
4

5 回答 5

12

您可以通过添加额外的过滤器来扩展树枝http://symfony.com/doc/current/cookbook/templating/twig_extension.html

在您的情况下,您可以使用 array_sum 函数:

public function getFilters()
{
    return array(
        new \Twig_SimpleFilter('sum', 'array_sum'),
    );
}
于 2014-02-19T14:44:53.783 回答
8

如果您不想使用控制器并想在 twig 中进行求和,请尝试使用 set 命令:

{# do loop first and assign whatever output you want to a variable #}
{% set sum = 0 %}    
{% set loopOutput %}               
    {% for r in a.numbers}            
       {% set sum = sum + r.number %}        
    {% endfor %}    
{% endset %}

 sum is: {{ sum }} 

{# some content.. #} 

{{ loopOutput }}

我假设循环位于特定位置,因为它旨在将某些内容输出到模板中,这使您可以重新排列加载顺序,同时仍按需要显示。

于 2014-05-23T10:09:05.010 回答
2

一个可能的解决方案是使用 MVC 标准并让您的控制器为您进行总和计算。

//In your controller file

public function yourControllerAction(){
    //how ever you define $a and $content would go here

    $sum = 0;
    foreach($objects as $a)
        $sum = 0;
        foreach($a->numbers as $r){
            $sum += $r->number;
        }
        $a->sum = $sum;
    }


    return array(
        'objects' => $objects,
        'content' => $content
    );
}

现在您已经计算了 sum 变量以在您的 twig 文件中使用:

{# twig file #}
{% for a in objects %}
    sum is: {{ a.sum }}
    {% for number in a.numbers %}
        {{number}}
    {% endfor %}
{% endfor %}
{# some content.. #}
于 2013-09-21T20:21:35.727 回答
2

我构建了一个树枝扩展来实现这一点。目标是将数组和属性赋予树枝扩展并计算结果。

首先,注册服务:

affiliate_dashboard.twig.propertysum:
    class: AffiliateDashboardBundle\Service\PropertySum
    public: false
    tags:
        - { name: twig.extension }

然后实现 TwigExtension:

命名空间 AffiliateDashboardBundle\Service;

class PropertySum extends \Twig_Extension
{
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('propertySum', array($this, 'propertySum')),
        );
    }

    public function propertySum($collection, $property)
    {
        $sum = 0;
        $method = 'get' . ucfirst($property);

        foreach ($collection as $item) {
            if (method_exists($item, $method)) {
                $sum += call_user_func(array($item, $method));
            }
        }

        return $sum;
    }

    public function getName()
    {
        return 'property_sum';
    }
}

之后,您可以轻松计算特定集合的属性的总和。还处理教义关系。示例用法:

{{ blogpost.affiliateTag.sales|propertySum('revenue') }}

完毕!

于 2016-02-07T21:42:27.513 回答
2

从 Twig 1.41 和 2.10reduce开始,添加了一个过滤器

过滤器使用箭头函数迭代地将reduce一个序列或映射缩减为单个值,从而将其缩减为单个值。箭头函数接收上一次迭代的返回值和序列或映射的当前值:

{% set numbers = [1, 2, 3] %}

{{ numbers|reduce((carry, v) => carry + v) }}
{# output 6 #}

reduce过滤器将一个值initial作为第二个参数:

{{ numbers|reduce((carry, v) => carry + v, 10) }}
{# output 16 #}

请注意,箭头函数可以访问当前上下文。

论据:

  • array: 序列或映射
  • arrow: 箭头函数
  • initial: 初始值

参考:https ://twig.symfony.com/doc/2.x/filters/reduce.html

于 2019-07-16T17:13:43.827 回答