在夏天之上的枝杈总和

时间:2013-09-21 14:26:41

标签: symfony 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 %}

5 个答案:

答案 0 :(得分:11)

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

来扩展树枝

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

public function getFilters()
{
    return array(
        new \Twig_SimpleFilter('sum', 'array_sum'),
    );
}

答案 1 :(得分:4)

如果您不想使用控制器并希望在树枝中进行求和,请尝试使用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 }}

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

答案 2 :(得分: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
    );
}

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

{# twig file #}
{% for a in objects %}
    sum is: {{ a.sum }}
    {% for number in a.numbers %}
        {{number}}
    {% endfor %}
{% endfor %}
{# some content.. #}

答案 3 :(得分:1)

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

首先,注册服务:

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') }}

完成!

答案 4 :(得分:0)

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

  

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