2013-09-21 11 views
5

Jestem trochę nowy w gałązce i wiem, że można dodać wartości w szablonie i zebrać je w zmiennej. Ale to, czego potrzebuję, to pokazać letnią wartość w szablonie, zanim je podsumuję. Potrzebuję czegoś w rodzaju automatów w starej symfonii. Lub w php mogę to zrobić przez ob_start(). Jakoś to możliwe w gałązce?Wiersz sumy rzędów nad letnią ochroną

Bardzo mi się podoba to coś takiego.

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

Dlaczego nie wykonujesz obliczeń w kontrolerze? Gałązka rzeczywiście ma tylko służyć do wyświetlania obliczonych danych. W MVC twoje poglądy nie powinny być przeprowadzane. – Chausser

Odpowiedz

2

Możliwe rozwiązanie tego problemu polega na zastosowaniu standardu MVC i umożliwieniu kontrolerowi wykonania obliczeń sumarycznych.

//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 
    ); 
} 

Teraz masz zmienna suma już obliczony użyć w pliku gałązka:

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

Mijam tablicę obiektów do szablonu zawierającego liczby. Coś takiego: Array (0 => Object1, 1 => Object2) itd. Te obiekty zawierają liczby w niektórych kolekcjach. Pomyślałem, że gdybym mógł dodać liczby w szablonie, nie musiałbym przechodzić przez tę tablicę obiektów z jakąś skomplikowaną logiką z 4 foreachami. To było dla mnie prostsze, ale prawdopodobnie pójdę z twoimi sugestiami i zsumuję te liczby w kontrolerze. Dzięki za odpowiedzi! – omgitsdrobinoha

+0

Właśnie coś przyszło mi do głowy, kiedy zacząłem wprowadzać w życie twoją odpowiedź.Potrzebuję tych sum pogrupowanych według obiektów, aby po ich wyświetleniu łatwo poradzić sobie z sumami dla obiektów. Chcę coś takiego: $ obj-> numbers to tablica, którą wypisuję, a $ obj-> suma może być wartością sumowaną. – omgitsdrobinoha

+0

Zaktualizowałem swoją odpowiedź, aby podać przykład na podstawie struktury obiektu. Jeśli dodasz właściwość sum do swojego obiektu, możesz ustawić ją za pomocą powyższej metody. wtedy twoja implementacja gałązki wyglądałaby tak, jakbym tam też była. – Chausser

3

jeśli nie chcesz używać kontrolera i wan t zrobić sumowanie w gałązka następnie spróbuj użyć polecenia 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 }} 

Zakładam pętla była w określonym miejscu, ponieważ jest on przeznaczony do wyjścia coś do szablonu, to pozwala zmienić kolejność ładowania podczas nadal wyświetlane, jak chcesz.

0

Tworzę rozszerzenie gałązki, aby to osiągnąć. Celem jest nadanie macierzy i właściwości rozszerzeniu gałązki i obliczenie wyniku.

pierwsze, zarejestrować usługę:

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

Następnie wdrożenia TwigExtension:

namespace AffiliateDashboardBundle \ Usługi;

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

Po tym można łatwo obliczyć sumę właściwości określonej kolekcji. Pracuje również z relacjami doktryny. Przykład użycia:

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

Zrobione!