/

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ètreTypeDéfautDescription
$targetFieldstring-Le champ dans lequel la valeur calculée est écrite ; doit être un champ éditable en liste blanche
$expressionstring-Une expression JS ; les noms de champs nus sont remplacés par leur valeur actuelle
$event?stringnullÉvénement DOM déclenchant le recalcul ; null retombe sur 'input' (recalcule à chaque frappe)
$watchFields?stringnullChamps à 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.