2013-09-21 55 views
5

Tôi là người mới đến cành và tôi biết có thể thêm giá trị vào một mẫu và thu thập chúng trong một biến. Nhưng những gì tôi thực sự cần là hiển thị giá trị được khai thác trong mẫu trước khi tôi tổng hợp chúng. Tôi cần một cái gì đó giống như khe trong symfony cũ. Hoặc trong php tôi có thể làm điều này bằng ob_start(). Nó có thể trong twig bằng cách nào đó?Hàng Twig sum phía trên summerisation

Tôi có thể thích nó như thế này.

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

Tại sao bạn không thực hiện các phép tính trong bộ điều khiển? Twig thực sự chỉ giả sử được sử dụng để hiển thị dữ liệu được tính toán. Trong MVC quan điểm của bạn arent thực sự giả sử để chạy các tính toán. – Chausser

Trả lời

2

Một giải pháp khả thi cho việc này là sử dụng tiêu chuẩn MVC và để bộ điều khiển thực hiện các phép tính tổng cho bạn.

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

Bây giờ bạn có biến số tiền đã tính toán để sử dụng trong file cành lá của bạn:

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

Tôi chuyển một mảng các đối tượng đến mẫu chứa các số. Một cái gì đó như thế này: Mảng (0 => Object1, 1 => Object2) vv Các đối tượng này chứa các số trong một số bộ sưu tập. Tôi nghĩ rằng nếu tôi có thể thêm các số trong mẫu sau đó tôi đã không phải đi qua mảng này của các đối tượng với một số logic phức tạp với như 4 foreachs. Nó chỉ đơn giản hơn với tôi, nhưng có thể tôi sẽ đi với các đề xuất của bạn và tổng hợp những con số này trong Bộ điều khiển. Cảm ơn câu trả lời! – omgitsdrobinoha

+0

Chỉ cần một cái gì đó đi vào tâm trí của tôi khi tôi bắt đầu thực hiện câu trả lời của bạn.Tôi cần số tiền này được nhóm lại bởi các đối tượng để khi tôi liệt kê các đối tượng, tôi có thể dễ dàng xử lý các khoản tiền cho các đối tượng. Tôi muốn một cái gì đó như thế này: $ obj-> số là một mảng mà tôi liệt kê ra và $ obj-> tổng có thể là giá trị tổng hợp. – omgitsdrobinoha

+0

Tôi đã cập nhật câu trả lời của mình để đưa ra một ví dụ dựa trên cấu trúc đối tượng của bạn. Nếu bạn thêm một thuộc tính sum vào đối tượng của bạn thì bạn có thể thiết lập nó bằng cách sử dụng phương thức trên. sau đó thực hiện cành của bạn sẽ trông giống như tôi đã lên đó là tốt. – Chausser

3

nếu bạn không muốn sử dụng bộ điều khiển và điều khiển t để làm tổng hợp trong cành lá sau đó hãy thử sử dụng lệnh 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 }} 

Tôi giả sử các vòng lặp là ở một nơi cụ thể bởi vì nó được thiết kế để sản xuất cái gì đó vào các mẫu, điều này cho phép bạn sắp xếp lại thứ tự nạp khi vẫn hiển thị như bạn muốn.

0

Tôi xây dựng tiện ích mở rộng để đạt được điều này. Mục tiêu là cung cấp cho mảng và thuộc tính cho một phần mở rộng ghép và tính kết quả.

Đầu tiên, đăng ký dịch vụ:

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

Sau đó thực hiện các TwigExtension:

namespace AffiliateDashboardBundle \ Dịch vụ;

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

Sau đó, bạn có thể dễ dàng tính tổng của thuộc tính của một bộ sưu tập cụ thể. Cũng làm việc với các quan hệ học thuyết. Ví dụ về cách sử dụng:

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

Xong!