2013-09-21 15 views
5

Sono un po 'nuovo al ramoscello e so che è possibile sommare valori in un modello e raccoglierli in una variabile. Ma quello di cui ho realmente bisogno è mostrare il valore summerised nel template prima di riassumerli. Ho bisogno di qualcosa come slot nel vecchio symfony. O in PHP, potrei farlo da parte di ob_start(). È possibile in un ramoscello in qualche modo?Riga sommità ramoscello sopra l'estivazione

Mi piacerebbe qualcosa del genere.

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

Perché non stai facendo i calcoli nel controller? Twig è in realtà solo supponiamo di essere utilizzato per visualizzare i dati calcolati. In MVC i tuoi punti di vista non sono realmente supposti di eseguire i calcoli. – Chausser

risposta

2

Una possibile soluzione a questo sarebbe quella di utilizzare lo standard MVC e lasciate che il vostro controller di fare i calcoli somma per voi.

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

Ora avete la variabile somma già calcolato da utilizzare nel file ramoscello:

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

Ho passato una matrice di oggetti al modello che contiene i numeri. Qualcosa del genere: Matrice (0 => Oggetto1, 1 => Oggetto2) ecc. Questi oggetti contengono i numeri in alcune raccolte. Ho pensato di aggiungere i numeri nel modello, quindi non ho dovuto passare attraverso questa serie di oggetti con una logica complicata con 4 foreachs. Per me è stato più semplice, ma probabilmente andrò con i tuoi suggerimenti e sommerò questi numeri nel Controller. Grazie per le risposte! – omgitsdrobinoha

+0

Mi è venuto in mente qualcosa quando ho iniziato ad attuare la tua risposta.Ho bisogno di queste somme raggruppate per oggetti in modo che quando elencho gli oggetti riesca a gestire facilmente le somme per gli oggetti. Desidero qualcosa del genere: $ obj-> numbers è un array che elenco e $ obj-> sum potrebbe essere il valore sommato. – omgitsdrobinoha

+0

Ho aggiornato la mia risposta per dare un esempio basato sulla struttura dell'oggetto. Se aggiungi una proprietà sum al tuo oggetto, puoi impostarla usando il metodo sopra. quindi la tua implementazione di ramoscello sarebbe simile a quella che ho anch'io. – Chausser

3

se non si desidera utilizzare il controller e wan t di fare la somma in ramoscello poi provare a utilizzare il comando 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 }} 

Suppongo che il ciclo era in un luogo specifico, perché è destinato ad uscita qualcosa nel modello, questo ti permette di riorganizzare l'ordine di caricamento, mentre ancora visualizzato come vuoi.

0

Costruisco un'estensione di ramoscello per ottenere ciò. L'obiettivo è quello di fornire l'array e la proprietà a un'estensione di ramoscello e calcolare il risultato.

In primo luogo, registrare il servizio:

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

quindi implementare la TwigExtension:

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

Successivamente, è possibile calcolare facilmente la somma di una proprietà di una raccolta specifica. Funziona anche con le relazioni di dottrina. Esempio di utilizzo:

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

Fatto!

Problemi correlati