/

Live berechnete Felder

Berechnen Sie den Wert eines Formularfelds live im Browser, während sich andere Felder ändern - von einem einfachen Produkt bis zu einer Summe über eine verschachtelte Kindtabelle.

set_formular()

->set_formular($targetField, $expression, $event = null, $watchFields = null) ist ein live berechnetes, clientseitiges Feld: Immer wenn $event auf einem der eigenen Controls von $watchFields im geöffneten Formular ausgelöst wird, wird $expression ausgewertet und in $targetField geschrieben. Jeder blanke Feldname in $expression (z. B. quantity) wird automatisch durch den aktuellen Wert dieses Felds ersetzt - kein manuelles Parsen nötig.

$xcrud->set_formular('total', 'quantity*price');
ParameterTypStandardBeschreibung
$targetFieldstring-Das Feld, in das der berechnete Wert geschrieben wird; muss ein freigegebenes, bearbeitbares Feld sein
$expressionstring-Ein JS-Ausdruck; blanke Feldnamen werden durch ihren aktuellen Wert ersetzt
$event?stringnullDOM-Event, das die Neuberechnung auslöst; null verwendet standardmäßig 'input' (Neuberechnung bei jedem Tastendruck)
$watchFields?stringnullKommagetrennte zu beobachtende Felder; null erkennt automatisch jedes Feld, auf das $expression selbst verweist

$expression ist vertrauenswürdiges, vom Entwickler geschriebenes JavaScript - es wird nie durch Request-/Benutzerdaten beeinflusst, daher wird es unsigniert an den Client gesendet und direkt ausgeführt, nicht über einen sandboxed Evaluator.

Explizites Event und explizite Watch-Liste

Lassen Sie $event/$watchFields für den obigen Standardfall weg. Geben Sie sie explizit an, wenn die zu beobachtenden Felder nicht einfach "jedes im Ausdruck erwähnte Feld" sind, oder um eine weniger häufige Neuberechnung zu wählen (z. B. nur bei Blur):

$xcrud->set_formular(
    'email',
    '"{firstName}".toLowerCase() + ".{lastName}@myoffice.com".toLowerCase();',
    'onmouseout',
    'firstName'
);

Das Schreiben eines berechneten Werts in ein Zielfeld funktioniert nur bei Controls mit einem einzelnen einfachen Wert (Text/Textarea/Nummer/Datum/Datetime/Uhrzeit/Passwort/Jahr/Preis/ein einzelnes Select) - Boolean-/Radio-/Switch-/Checkbox-/Multiselect-/Relation-/Upload-Felder werden als Formel-Ziel nicht unterstützt.

Aggregation einer verschachtelten Tabelle

Eine Formel kann auch das eigene Feld eines direkten nested_table()-Kindes aggregieren, referenziert als childTableName.fieldName mit der Syntax sum()/avg()/count()/min()/max():

$xcrud->set_formular('totalAmount', 'sum(orderdetails.priceEach)');

Dies berechnet totalAmount live neu, sobald sich die Zeilendaten des "orderdetails"-Nested-Tabs ändern (beim ersten Laden oder nach Hinzufügen/Bearbeiten/Löschen eines Positionseintrags), solange das Bearbeitungsformular des übergeordneten Datensatzes geöffnet bleibt. Es aktualisiert nur das eigene Zielfeld des geöffneten Formulars - es speichert die übergeordnete Zeile nicht selbst. Nur eine Ebene tief wird unterstützt, und count() ignoriert fieldName (weiterhin erforderlich für eine konsistente childTable.field-Form) - es zählt immer Zeilen. Siehe Nested Tables im Überblick zum Einrichten der Kindtabelle selbst.