Calcoli nella Viste

Campi calcolati in base agli altri Campi. Aggregare valori di un Campo delle Entità elencate nella Vista.
Aggiornata il:

Se nella app hai bisogno di svolgere calcoli basati sui valori dei Campi delle Entità, puoi farlo con le Viste. Distinguiamo due casi diversi:

EsigenzaEsempio
Calcolare un valore da attribuire ad una Entità, partendo da valori contenuti nel Campi dell'Entità (o nei Campi di Entità in relazione con l'Entità) e mostrarlo nella Vista a fianco dell'EntitàCalcolare il prezzo di una cassetta di frutta venduta a peso, moltiplicando il prezzo al kg del tipo di frutta per il peso della cassetta.  
Calcolare un valore partendo dall'insieme dei valori di un Campo delle Entità elencate nella Vista e mostrarlo in fondo alla VistaCalcolare la media dei prezzi degli oggetti elencati

Campi calcolati in base ad altri Campi

La prima esigenza sopra indicata può essere risolta installando ed attivando il modulo aggiuntivo "Views Simple Math Field" che aggiunge alle Viste il Campo Simple Math Field -  Globale - Views field that performs simple math expressions. Nella configurazione di questo Campo è possibile scrivere una formula che calcola un valore sulla base del valore degli altri Campi presenti nella Vista. Nella formula si possono inserire operatori matematici, logici e di confronto ed altre operazioni complesse. 

Riprendendo l'esempio sopra citato, data l'Entità "Cassetta" con un Campo "Peso", che memorizza il peso in kg della frutta contenuta nella cassetta ed un Campo "Tipo di Frutta", che punta ad una Entità di tipo "Frutta" che ha un Campo "Prezzo al kg", se si elencano nella Vista i Campi "Peso" e "(Tipo d Frutta) Prezzo al kg" possiamo aggiungere un Campo di tipo Simple Math in cui scrivere la formula Peso * Prezzo_al_kg

Come esempio didattico, vediamo come aggiungere alla Vista "Miei Prestiti conclusi" della app di esempio che elenca i Prestiti su Attrezzi dell'Utente corrente un Campo che mostra la durata in giorni del prestito effettuato, calcolato come differenza tra la data di consegna dell'Attrezzo al Richiedente e la data di restituzione dell'Attrezzo al Proprietario. Diversamente dal precedente esempio che si limitava a moltiplicare due numeri, in questo esempio vediamo anche un metodo per calcolare la differenza in giorni tra due date.

aggiungi alla Vista il Campo "Consegna" in un formato utile al calcolonella sezione Campi esiste già un Campo "Consegna", mostrato all'Utente nel formato leggibile "giorno mese anno". Questo formato però non è adatto per calcolare la differenza tra date. Aggiungi quindi nella sezione Campi una seconda copia del Campo "Consegna", come Formattatore seleziona Personalizzato e come Formato data/ora digita "U". Il formato "U" rappresenta la data come numero di secondi passati da una data fissa (1 gennaio 1970; per una spiegazione di questo riferimento temporale vedi Tempo (Unix) su Wikipedia). L'elenco completo dei formati possibili per le date è nella apposita pagina del Manuale PHP . Nascondi il Campo, perché non serve all'Utente ma al calcolo.
aggiungi alla Vista il Campo "Restituzione" nello stesso formatonella sezione Campi esiste già un Campo "Restituzione", mostrato all'Utente nel formato leggibile "giorno mese anno". Per lo stesso motivo sopra spiegato, nella sezione Campi aggiungi una seconda copia anche del Campo "Restituzione", come Formattatore selezione Personalizzato e come Formato data/ora digita "U". Nascondi il Campo. 
aggiungi alla Vista un Campo di tipo Simple Mathnella sezione Campi della Vista aggiungi il Campo Simple Math Field -  Globale - Views field that performs simple math expressions e come Etichetta digita "Durata"
predisponi il Campo ad usare i valori dei Campi "Consegna" e "Restituzione" per il calcolonell'elenco Select the fields to use in the formula della configurazione del Campo seleziona i Campi "Consegna" e "Restituzione". a questi Campi corrispondono i Token (anch'essi elencati) "@field_restituzione_1" e  "@field_consegna_1" (il _1 in fondo al nome del Token è dovuto al fatto che la Vista conteneva già un Campo "Consegna" ed un Campo "Restituzione").
scrivi nel Campo la formula che calcola la differenza in giorni

In Formula digita 

(@field_restituzione_1 - @field_consegna_1) / 86400 +1

La formula è piuttosto intuitiva: dentro la parentesi viene calcolata la differenza in secondi tra la data di fine prestito e la data di inizio prestito; il risultato viene poi diviso per il numero di secondi in un giorno. Alla differenza in giorni la formula aggiunge 1 giorno per evitare di mostrare 0 nel caso un prestito inizi e finisca nella stessa data. 

Sempre nella configurazione del Campo, attiva l'opzione Arrotonda scegliendo zero numeri dopo la virgola, per mostrare un numero intero di giorni.

 

ATTENZIONE:  Se nella Formula si utilizza un Token presente in Select the fields to use in the formula ma non selezionato, la Vista può andare in errore. Per rimediare, basta tornare nell'editor della Vista ed attivare il flag a fianco del Token.

Poiché un Campo di tipo Simple Math è trattato come un qualunque altro Campo, anche ad esso corrisponde un Token  - di nome {{ field_views_simple_math_field }} - che ne contiene il valore calcolato e che può essere a sua volta usato nei Campi successivi, tra cui ci possono essere altri Campi Simple Math.

Il valore calcolato in un Campo Simple Math è mostrato all'Utente, ma non salvato nella Entità, quindi non è disponibile al di fuori della Vista. Per salvare in un Campo dell'Entità un valore calcolato in base agli altri Campi dell'Entità stessa ci sono due modi, che richiedono altri moduli aggiuntivi:

  • aggiungere all'Entità un Campo di tipo Computed, messo a disposizione dal modulo "Computed Field", che però richiede di programmare in PHP e che quindi esula dagli scopi di MieApp.
  • disegnare col modulo "ECA" una procedura che, al salvataggio di una Entità, esegua un calcolo usando i Campi dell'Entità stessa e scriva il risultato in un ulteriore Campo dell'Entità. Questo metodo evita di dover programmare in PHP e sarà spiegato nella sezione Automazioni di MieApp  

Aggregare valori di un Campo delle Entità elencate 

Se invece si vuole calcolare un valore calcolato come aggregazione di un Campo delle Entità elencate, ad esempio il prezzo medio (o il peso medio) delle Cassette di frutta, occorre installare e attivare il modulo aggiuntivo "Views Aggregator Plus". 

Questo potente modulo consente di modificare in modo significativo una Vista, però in questo primo esempio ci limitiamo a sfruttarne la capacità di aggiungere in fondo alla Vista "Miei Prestiti Conclusi" sopra descritta la media della durata dei Prestiti effettuati: 

attiva l'aggregazione nelle due Visualizzazioni presenti nella Vista ("Mie Prestiti Conclusi" e "Prestiti conclusi sull'Attrezzo")nella sezione Formato della Vista seleziona Table with aggregation options
attiva sul Campo "Durata" il calcolo della medianella sezione Formato della Vista, sotto Impostazioni identifica il Campo Durata, attiva  Apply column function e seleziona Median