/

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');
ParametroTipoPredefinitoDescrizione
$targetFieldstring-Il campo in cui viene scritto il valore calcolato; deve essere un campo whitelisted e modificabile
$expressionstring-Un'espressione JS; i nomi di campo nudi vengono sostituiti con il loro valore corrente
$event?stringnullEvento DOM che attiva il ricalcolo; null ha come predefinito 'input' (ricalcola a ogni pressione di tasto)
$watchFields?stringnullCampi 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.