Champs calculés en direct
Calculer la valeur d'un champ de formulaire en direct dans le navigateur à mesure que d'autres champs changent, d'un simple produit à une somme sur une table enfant imbriquée.
set_formular()
->set_formular($targetField, $expression, $event = null, $watchFields = null) est un champ calculé en direct, côté client : chaque fois que $event se déclenche sur l'un des contrôles propres à $watchFields dans le formulaire ouvert, $expression est évaluée et écrite dans $targetField. Tout nom de champ nu dans $expression (par exemple quantity) est automatiquement remplacé par la valeur actuelle de ce champ - aucune analyse manuelle n'est nécessaire.
$xcrud->set_formular('total', 'quantity*price');
| Paramètre | Type | Défaut | Description |
|---|---|---|---|
$targetField | string | - | Le champ dans lequel la valeur calculée est écrite ; doit être un champ éditable en liste blanche |
$expression | string | - | Une expression JS ; les noms de champs nus sont remplacés par leur valeur actuelle |
$event | ?string | null | Événement DOM déclenchant le recalcul ; null retombe sur 'input' (recalcule à chaque frappe) |
$watchFields | ?string | null | Champs à surveiller, séparés par des virgules ; null détecte automatiquement chaque champ que $expression référence elle-même |
$expression est du JavaScript de confiance, écrit par le développeur - elle n'est jamais influencée par des données de requête/utilisateur, elle est donc envoyée au client non signée et exécutée directement, et non via un évaluateur sandboxé.
Événement et liste de surveillance explicites
Omettez $event/$watchFields pour le cas courant ci-dessus. Précisez-les lorsque les champs à surveiller ne sont pas simplement "tous les champs que l'expression mentionne", ou pour opter pour un recalcul moins bavard (par exemple uniquement sur blur) :
$xcrud->set_formular(
'email',
'"{firstName}".toLowerCase() + ".{lastName}@myoffice.com".toLowerCase();',
'onmouseout',
'firstName'
);
Écrire une valeur calculée dans un champ cible ne fonctionne que pour les contrôles à valeur simple unique (texte/textarea/nombre/date/date-heure/heure/mot de passe/année/prix/un select unique) - les champs booléen/radio/switch/checkboxes/multiselect/relation/téléversement ne sont pas pris en charge comme cible de formule.
Agréger une table imbriquée
Une formule peut aussi agréger le propre champ d'un enfant nested_table() direct, référencé comme childTableName.fieldName avec la syntaxe sum()/avg()/count()/min()/max() :
$xcrud->set_formular('totalAmount', 'sum(orderdetails.priceEach)');
Cela recalcule totalAmount en direct chaque fois que les données de ligne de l'onglet imbriqué "orderdetails" changent (chargement initial, ou après l'ajout/la modification/la suppression d'une ligne de détail), tant que le formulaire d'édition du parent reste ouvert. Cela ne met à jour que le contrôle cible propre au formulaire ouvert - cela n'enregistre pas en soi la ligne parente. Un seul niveau de profondeur est pris en charge, et count() ignore fieldName (toujours requis pour conserver une forme childTable.field cohérente) - elle compte toujours les lignes. Voir Aperçu des tables imbriquées pour la mise en place de la table enfant elle-même.