2013-09-21 7 views
5

私は小枝にちょっと新しく、テンプレートに値を加えて変数に集めることは可能です。しかし、私が実際に必要とするのは、それらを要約する前に、テンプレートに夏時間の値を表示することです。古いsymfonyのスロットのようなものが必要です。または、私は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 %} 
+1

なぜコントローラで計算を行っていませんか? Twigは実際に計算されたデータを表示するために使用されると仮定しています。 MVCでは、あなたのビューarent本当に計算を実行すると仮定します。 – 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

私は、数字を含むテンプレートにオブジェクトの配列を渡します。このようなもの: 配列(0 => Object1,1 => Object2)など。これらのオブジェクトには、いくつかのコレクションに数値が含まれています。私はテンプレートの数値を集計することができたら、4つのforeachのような複雑なロジックでオブジェクトの配列を通過する必要はなかったと思った。 ちょうど私にはもっと簡単でしたが、おそらく私はあなたの提案をして、コントローラーでこれらの数字を合計します。 答えをありがとう! – omgitsdrobinoha

+0

私はあなたの答えを実装し始めたときに何かが私の心に入った。この合計がオブジェクトごとにグループ化されている必要があります。オブジェクトをリストすると、オブジェクトの合計を簡単に処理できるようになります。 私はちょっとこのようなものが欲しいです:$ obj-> numbersは私がリストし、$ obj-> sumの合計値です。 – omgitsdrobinoha

+0

私はあなたのオブジェクト構造に基づいて例を与えるために私の答えを更新しました。オブジェクトにsumプロパティを追加する場合は、上記の方法を使用してプロパティを設定できます。あなたの小枝の実装は、私もそこにいるように見えます。 – Chausser

3

コントローラとwanを使用したくない場合小枝での加算を行うためにtが、その後、設定されたコマンドを使用してみてください:私はそれをテンプレートに出力何かに意図されているため、ループが特定の場所にあったと仮定し

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

これを達成するために、私はtwig拡張機能を構築します。ターゲットは、配列とプロパティをtwig拡張に与え、結果を計算することです。

まず、サービスを登録:

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

その後TwigExtensionを実装:

名前空間AffiliateDashboardBundle \サービス。

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

完了!

関連する問題