Disponible depuis la version 5.x de Dodock
Un contrôleur de formulaire est une classe JavaScript qui définit le comportement d'un type de document lors de la saisie et de l'affichage. Il s'agit de l'équivalent moderne et structuré des anciens scripts clients (Client Scripts), regroupant les gestionnaires d'événements (onload, validate, refresh, etc.) dans une classe réutilisable et extensible.
Les applications comme Dokos ou ERPNext lient traditionnellement ces contrôleurs en haut d'un script de formulaire. Dodock introduit désormais une API dédiée pour les enregistrer proprement et s'assurer qu'ils sont bien chargés au bon moment dans le cycle de vie du formulaire.
Avant cette évolution, les applications liaient un contrôleur de classe au formulaire en l'étendant en haut du script de type de document :
extend_cscript(cur_frm.cscript, new erpnext.stock.DeliveryNoteController({ frm: cur_frm }));
Cette approche présentait deux inconvénients majeurs :
frm : le script s'exécute sans objet frm dans la portée, cur_frm est donc le seul moyen d'y accéder.setup ne fonctionne pas, car l'événement trigger("setup") collecte les gestionnaires à l'ancienne avant que ceux de la classe ne puissent être enregistrés. La méthode setup() du contrôleur n'est donc jamais déclenchée.La fonction frappe.ui.form.set_controller(doctype, ControllerClass) résout ces problèmes en enregistrant la classe auprès du gestionnaire de scripts. À l'initialisation du formulaire, après l'exécution des scripts de formulaire et des scripts clients, le ScriptManager branche automatiquement le contrôleur pour le type de document concerné, avant que l'événement setup ne soit déclenché.
Si un script a déjà lié une sous-classe du contrôleur — par exemple pour étendre un contrôleur d'application depuis un doctype_js personnalisé — ce branchement est conservé et prioritaire.
frappe.ui.form.set_controller(doctype, ControllerClass)
doctype (chaîne) — le nom du type de document concerné (par exemple "Bon de livraison").ControllerClass (classe) — la classe de contrôleur à lier à ce type de document.frappe.ui.form.set_controller("Delivery Note", erpnext.stock.DeliveryNoteController);
Cette instruction, placée dans le script de votre application, enregistre DeliveryNoteController comme contrôleur du type de document Delivery Note. Le gestionnaire de scripts se chargera de l'instancier et de le lier au formulaire au moment opportun.
L'ordre précis d'exécution garantit que les contrôleurs sont en place avant que les événements ne se déclenchent :
ScriptManager instancie et branche le contrôleur enregistré pour le type de document, à moins qu'une sous-classe n'ait déjà été liée par un script.setup — l'événement setup est déclenché sur le formulaire. Les méthodes setup() du contrôleur sont désormais appelées.Cette séquence permet aux développeurs de remplacer l'usage de cur_frm par frm dans la portée des méthodes du contrôleur, et garantit que les méthodes héritées fonctionnent comme prévu.
Le mécanisme respecte l'héritage des contrôleurs. Si une application ou un script personnalisé étend un contrôleur existant :
class MonBonDeLivraisonPersonnalise extends erpnext.stock.DeliveryNoteController {
refresh(frm) {
super.refresh(frm);
// Comportement supplémentaire
}
}
Et le lie explicitement avant que le ScriptManager ne s'exécute, le branchement personnalisé est conservé. Le contrôleur de base enregistré via set_controller ne remplace pas cette sous-classe.
Dodock utilise désormais set_controller pour lier le contrôleur de base DocTypeController sur deux types de documents techniques :
DocType) — le formulaire de configuration des types de documents.Customize Form) — l'interface de personnalisation des formulaires.Ces branchements internes illustrent l'adoption de l'API au cœur du framework et servent de référence pour les applications tierces.
Si vous maintenez une application ou un script personnalisé qui utilise extend_cscript pour lier un contrôleur, vous pouvez migrer progressivement :
Avant :
extend_cscript(cur_frm.cscript, new erpnext.stock.DeliveryNoteController({ frm: cur_frm }));
Après :
frappe.ui.form.set_controller("Delivery Note", erpnext.stock.DeliveryNoteController);
La migration vous permet de :
cur_frm dans le branchement.setup() du contrôleur est bien déclenchée.doctype. Pour étendre un contrôleur, créez une sous-classe et branchez-la explicitement si nécessaire.set_controller dans le script de formulaire de l'application, pas dans un gestionnaire d'événements.cur_frm — utilisez l'argument frm passé aux méthodes du contrôleur. L'API est conçue pour rendre cur_frm superflu.