2013-09-21 4 views
5

Я немного новичок в ветке, и я знаю, что можно добавить значения в шаблон и собрать их в переменной. Но мне действительно нужно показать летнее значение в шаблоне, прежде чем подводить итоги. Мне нужно что-то вроде слотов в старом symfony. Или в php я мог бы сделать это с помощью ob_start(). Это возможно в твипе?Twig sum row above summerisation

Мне понравилось это примерно так.

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 %} 
+1

Почему вы не выполняете вычисления в контроллере? Twig действительно только предполагается использовать для отображения вычисленных данных. В MVC ваши взгляды действительно предполагают выполнение расчетов. – Chausser

ответ

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 file #} 
{% for a in objects %} 
    sum is: {{ a.sum }} 
    {% for number in a.numbers %} 
     {{number}} 
    {% endfor %} 
{% endfor %} 
{# some content.. #} 
+0

Я передаю массив объектов шаблону, который содержит числа. Что-то вроде этого: Array (0 => Object1, 1 => Object2) и т. Д. Эти объекты содержат числа в некоторых коллекциях. Я подумал, что если бы я смог добавить числа в шаблон, мне не пришлось бы проходить через этот массив объектов с некоторой сложной логикой, например, с четырьмя четырьмя файлами. Это просто было проще для меня, но, возможно, я поеду с вашими предложениями и суммирую эти цифры в контроллере. Спасибо за ответы! – omgitsdrobinoha

+0

Только что-то пришло мне в голову, когда я начал реализовывать свой ответ.Мне нужны эти суммы, сгруппированные по объектам, поэтому, когда я перечисляю объекты, я могу легко обрабатывать суммы для объектов. Я вроде бы хочу что-то вроде этого: $ obj-> numbers - это массив, который я перечисляю, а сумма $ obj-> sum может быть суммированной. – omgitsdrobinoha

+0

Я обновил свой ответ, чтобы привести пример, основанный на вашей структуре объекта. Если вы добавите свойство sum к своему объекту, вы можете установить его, используя вышеуказанный метод. то реализация вашей ветки будет выглядеть так, как будто у меня там тоже есть. – Chausser

3

если вы не хотите использовать контроллер и wan т сделать суммирование в веточке, то попробуйте использовать набор команд:

{# 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 }} 

Я предполагаю, что цикл был в определенном месте, так как он предназначен для вывода чего-то в шаблон, это позволяет изменить порядок загрузки в то время как по-прежнему отображается, как вы хотите.

0

Я строю расширение ветки, чтобы достичь этого. Цель состоит в том, чтобы предоставить массив и свойство расширению ветки и вычислить результат.

Во-первых, зарегистрировать услугу:

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

Done!

Смежные вопросы