Rendre un champ en lecture seule, Enregistrer et fermer le formulaire

Bonjour,

Je souhaite, dès que je clique sur “Enregistrer”, et que la condition est vérifiée, que tous les champs de saisie soient désormais non modifiables (ReadOnly) et que le formulaire se ferme sans perdre les données (Toutes les données sont enregistrées).

@Override
    public String preSave(){
    	ObjectField mesureEducative = getField("namFseEntCecMesureEdu");
    	ObjectField sanctionDisciDmd = getField("namFseEntCecSanctionDisciplinaire");
    	
    	
    	if(mesureEducative.isEmpty() && !sanctionDisciDmd.contains("CONSEILDISCIPLINE")){
    		AppLog.info("Hello Second", this.getGrant());
               getField("namFseStatut").setValue("VALIDATIONCSECI");
    		getField("namFseEntCecDate").setUpdatable(UPD_READ_ONLY);
    		getField("namFseEntCecSynthese").setUpdatable(UPD_READ_ONLY);
    		getField("namFseEntCecMesureEdu").setUpdatable(UPD_READ_ONLY);
    		getField("namFseEntCecSanctionDisciplinaire").setUpdatable(UPD_READ_ONLY);
    		getField("namFseEntCecEcheanceSanction").setUpdatable(UPD_READ_ONLY);
    		getField("namFseEntCecCommentaire").setUpdatable(UPD_READ_ONLY);
    		setSaveAndClose(true);
    	}
    	    	   	
    	return null;
    }

Rendre un attribut en lecture seule ou non dans un pre/postSave (ou un pre/postValidate etc.) n’est pas la bonne approche.

Ce genre de règles est à implémenter dans les hooks initXxx (ici à priori dans votre initUpdate) ou sous forme de contraintes.

De manière générale tout ce qui concerne la manière dont une liste ou un formulaire s’affiche est à implémenter dans les initXxx et isXxxEnable (et/ou dans des contraintes) les autres hooks sont faits pour du traitement des données (notamment l’application de règles de gestion de validation/calcul de données). Le rôle des différents hooks est expliqué dans cette documentation : https://docs.simplicite.io/documentation/01-core/businessobject-code-hooks.md

Merci @david, et en ce qui concerne la fermeture du formulaire sans perdre les données (Toutes les données sont enregistrées) si je clique sur “Enregistrer”.

Je ne comprend pas ce que vous voulez dire par “fermeture du formulaire sans perdre les données”…

Quand on clique sur “Enregistrer” toutes les données (sauf, bien entendu, celles qui sont en read only) sont enregistrées (ou plus exactement sont soumises pour être validées puis enregistrées s’il n’y a pas d’erreur de validation ou autre).

PS:

En essayant de lire entre les lignes de votre demande je pense, comme je l’ai dit dans ma réponse précédente, que vous n’utilisez pas les bons hooks/contraintes par rapport à votre besoin.

Pour bien comprendre à quel moment chaque hook est appelé (et pour quelle instance) mettez une trace dans chacun de ces hooks :

AppLog.info("Instance: " + getInstanceName() + ", row ID: " + getRowId(), getGrant());

Ca produira une trace du genre (ici par exemple pour initUpdate)

INFO|myuser|com.simplicite.objects.MyModule.MyObject|initUpdate|Event: Instance: the_ajax_MyObject, row ID: 123

Attention, le getRowId() n’a pas de sens pour tous les hooks (par exemple ça n’a pas de sens pour un initList) .

Si vous ne maitrisez pas parfaitement les séquences d’appel des hooks et la logique d’usage des instances des objets métier vous risquez de ne pas bien les utiliser et vous retrouver avec des comportements que vous jugerez “bizarres” ou “aléatoires”.

La documentation que je vous ai indiquée rappelle ce qu’on explique lors des formations = dans quels cas utiliser les hooks principaux

Je voulais dire par “fermeture du formulaire sans perdre les données”, lorsque je clique sur “Enregistrer”, les données sont sauvegardées et le formulaire se ferme.

Je ne suis toujours pas sûr de comprendre ce que vous voulez dire par “sans perdre les données”, si je comprend bien on parle simplement d’un enregistrement du formulaire vs une fermeture sans enregistrement. Le terme “perte de données” dans ce contexte est ambigu, ça fait penser à un problème, pas à un comportement normal.

En tout cas ma réponse initiale est la bonne (si je comprend bien la question) => vous devez implémenter vos règles de “read only ou pas read only” dans un initUpdate ou dans des contraintes. Cela n’a pas de sens de le faire dans un postSave.

Si vous ne comprenez pas pourquoi, faites ce que je dis dans ma réponse précédente => mettez des traces dans tous les hooks que vous avez implémenté pour comprendre a quel moment ils s’exécutent par rapport aux actions utilisateur dans UI. Il est impossible de réaliser une application Simplicité si on ne comprend pas exactement le rôle des hooks et le moment où ils sont appelés.

Merci @david, je vais suivre les bonnes pratiques.