我对树枝很新,我知道可以在模板中添加值并将它们收集到变量中。但我真正需要的是在总结它们之前在模板中显示夏天的值。我需要像旧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 %}
答案 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
:初始值