Campi calcolati in tempo reale
Calcola il valore di un campo del form in tempo reale nel browser man mano che altri campi cambiano, da un semplice prodotto a una somma su una tabella figlia annidata.
set_formular()
->set_formular($targetField, $expression, $event = null, $watchFields = null) è un campo calcolato live, lato client: ogni volta che $event si attiva su uno qualsiasi dei controlli di $watchFields nel form aperto, $expression viene valutata e scritta in $targetField. Qualsiasi nome di campo nudo in $expression (ad es. quantity) viene automaticamente sostituito con il valore corrente di quel campo - nessun parsing manuale necessario.
$xcrud->set_formular('total', 'quantity*price');
| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
$targetField | string | - | Il campo in cui viene scritto il valore calcolato; deve essere un campo whitelisted e modificabile |
$expression | string | - | Un'espressione JS; i nomi di campo nudi vengono sostituiti con il loro valore corrente |
$event | ?string | null | Evento DOM che attiva il ricalcolo; null ha come predefinito 'input' (ricalcola a ogni pressione di tasto) |
$watchFields | ?string | null | Campi separati da virgole da osservare; null rileva automaticamente ogni campo a cui $expression stessa fa riferimento |
$expression è JavaScript scritto dallo sviluppatore e considerato affidabile - non è mai influenzata da dati di richiesta/utente, quindi viene inviata al client senza firma ed eseguita direttamente, non attraverso un valutatore sandboxed.
Evento esplicito ed elenco di osservazione
Ometti $event/$watchFields per il caso comune sopra descritto. Specificali quando i campi da osservare non sono semplicemente "ogni campo menzionato dall'espressione", oppure per optare per un ricalcolo meno frequente (ad es. solo al blur):
$xcrud->set_formular(
'email',
'"{firstName}".toLowerCase() + ".{lastName}@myoffice.com".toLowerCase();',
'onmouseout',
'firstName'
);
Scrivere un valore calcolato in un campo target funziona solo per controlli con un singolo valore semplice (text/textarea/number/date/datetime/time/password/year/price/un singolo select) - i campi boolean/radio/switch/checkboxes/multiselect/relation/upload non sono supportati come target di una formula.
Aggregare una tabella annidata
Una formula può anche aggregare il campo di una tabella figlia nested_table() diretta, referenziato come nomeTabellaFiglia.nomeCampo usando la sintassi sum()/avg()/count()/min()/max():
$xcrud->set_formular('totalAmount', 'sum(orderdetails.priceEach)');
Questo ricalcola totalAmount in tempo reale ogni volta che i dati riga della scheda annidata "orderdetails" cambiano (caricamento iniziale, o dopo l'aggiunta/modifica/eliminazione di una riga voce), per tutto il tempo in cui il form di modifica del genitore resta aperto. Aggiorna solo il controllo target del form aperto - non salva da sé la riga genitore. È supportato un solo livello di profondità, e count() ignora nomeCampo (comunque richiesto per una forma coerente tabellaFiglia.campo) - conta sempre le righe. Vedi Panoramica delle tabelle annidate per la configurazione della tabella figlia stessa.