Erreur d'interprétation dans le "template editor" du code front spécifique avec les données de test par défaut

Bonjour,

J’ai une erreur lors d’ouvrir ‘template editor’ (Unexpected token T in JSON at position 0), et le problème viens d’une variable qui retourne T (200) dans ‘Template editor’, sinon la variable retourne la bonne valeur (Formulaire création/mise à jour). Cette variable est appelé au niveau de la ressource JS attaché au BO.

En formulaire create/update j’ai pas d’erreur et au moment d’ouvrir ‘template editor’ j’ai cette erreur.

@david , @Alistair avez-vous une explication à ce problème ?

Version Simplicité 5.1.12

Voici une démonstration :
rubrique acquis

Cordialement,

Bonjour,

Mettez juste un try/catch dans la section de code Javascript que vous voulez isoler / sans traiter l’erreur.

Simplicité utilise des valeurs de test dans l’éditeur de template, donc qui ne correspondent pas à des valeurs réelles. Quelle est la définition du champ en question (type + rendering) Simplicité pourra essayer de générer une valeur plus conforme (comme un json vide plutôt qu’un texte) ?

Sinon vous pouvez surcharger la méthode testData pour qu’elle ne fasse rien sur votre objet ou valorise différemment les données de tests dans les champs (setFieldValue).

public void testData(String rowId, boolean random, boolean refs) {
  // Common fields
  super.testData(rowId, random, refs);
  // specific test value
  setFieldValue("mySpecialField", "{ \"code\":123, \"value\":[\"abc\",\"def\"] }");
}

Bonjour @Francois ;

J’ai essayé la deuxième solution de surcharger la méthode testData, et qu’on j’ouvre ‘template editor’ pas d’erreur mais en réouvrant le formulaire de création/mise à jour j’ai une erreur et un comportement un peu bizarre, je vous mets ci-dessous mon code et une démonstration.

  • Les champs namJenOdsEvaluation, namJenPourcentReponseItemsEval, namJenNbrItemsEval sont valorisés dans initUpdate

  • Les champs namJenOdsEvaluation, namJenPourcentReponseItemsEval, namJenNbrItemsEval sont pas persistés en BDD.

Code dans la ressource JS:

// NamJeune front side hook
(function(ui) {
	
	if (!ui) return;
	var app = ui.getAjax();
	

	Simplicite.UI.hooks.NamJeune = function(o, cbk) {
		// Minimalistic backward compatibility with legacy UI getFieldValue for responsive UI
		window.getFieldValue = function(name) {	return window.$ui.getUIField(null, o, name, null, false).ui.val(); };
		window.setFieldValue = function(name, value) { return window.$ui.getUIField(null, o, name, null, false).ui.val(value); };
		
		try {
			console.log("NamJeune hooks loading...");
			var p = o.locals.ui;
			if (p && o.isMainInstance()) {
			
				p.form.onload = function(ctn, obj) {
									
					/*Traitement du graphe Acquisition de compétences*/	
					/*Début traitement*/
				    //Information propre au jeune 
				    var odsEvlauation = [];
				    var tableauItemsReponse = [];
				    
				    var nom  = window.$ui.getUIField(null, obj, "namNom").ui.val();
				    
				    var prenom  = window.$ui.getUIField(null, obj, "namPrenom").ui.val();
				    
				    try{
				    var ods = window.$ui.getUIField(null, obj, "namJenOdsEvaluation").ui.val();
				    
				    
				    var pourcentReponseItemsEvalue = window.$ui.getUIField(null, obj, "namJenPourcentReponseItemsEval").ui.val();
				    
				    var nbrItemsEvaluation = window.$ui.getUIField(null, obj, "namJenNbrItemsEval").ui.val();
				    				    
				    var odsJen = JSON.parse(ods);
				    
				    var pourCentItems = JSON.parse(pourcentReponseItemsEvalue);
				    
				    var itemsEvaluationNbr = JSON.parse(nbrItemsEvaluation);
				    
				    
				    tableauItemsReponse = new Array(pourCentItems.length);
				    
				    
				    for (var i = 0; i < odsJen.items.length; i++) {
				    	var evalOds = odsJen.items[i];
				    	odsEvlauation.push(evalOds.odsJeune);
				    	
				    	
				    	var itemsReponsePr = pourCentItems[i].items;
				    	
				    	var itemsRpCent= new Array(itemsReponsePr.length);
				    	
				    	var itemsNbrEvaluation = itemsEvaluationNbr.items[i];
				    	
				    	//Items Evlaue
				    	for(var j = 0; j < itemsReponsePr.length; j++){
				    		var reponsePourcent = itemsReponsePr[j];
				    		if(reponsePourcent != null){
				    		
				    			itemsRpCent[j]= Math.floor((reponsePourcent.pourcentItemsJeune * 100) / itemsNbrEvaluation.nbrItemsEvalJeune);
				    			
				    		}
				    		
				    	}
				    	tableauItemsReponse[i]=itemsRpCent;
				    	
				    	
				    }
				    
				}
				catch(err) {
					app.error("Erreur de traitement des données pour alimenter le graphe acquisition de compétences : " + err.message);
					
					
				}    
						
						
						$ui.loadCharts(function(){
							$ui.charts.chart($("#chart-container"), {
								  type: 'horizontalBar',
							  data: {
							    labels: odsEvlauation,
							    datasets: [
							    {
							      barThickness: 30,
							      minBarLength: 2,
							      label: 'A',
							      data: tableauItemsReponse.map(v => v[0]), 
							      backgroundColor: 'green'
							    },
							    {
							      barThickness: 30,
							      minBarLength: 2,
							      label: 'ECA',
							      data: tableauItemsReponse.map(v => v[1]), 
							      backgroundColor: 'orange'
							    },
							    {
							      barThickness: 30,
							      minBarLength: 2,
							      label: 'NO',
							      data: tableauItemsReponse.map(v => v[2]),
							      backgroundColor: 'gray'
							    }]
							  },
							  options: {
							    scales: {
							      xAxes: [{
							        stacked: true
							      }]
							    },
							    responsive : true,
							    maintainAspectRatio : true,
							    
							  }
							});
						});
						/*fin traitement*/
					
				};
				
				
				
			}
		}catch(e) {
			app.error("Error in Simplicite.UI.hooks.NamJeune: " + e.message);
		}
		finally {
			console.log("NamJeune hooks loaded.");
			cbk && cbk(); // final callback
		}
			
	};
	

})(window.$ui);

Code dans la classe “NamJeune” (Surcharge de la méthode testDate) :

public void testData(String rowId, boolean random, boolean refs) {
    
	  // Common fields
	  super.testData(rowId, random, refs);
	  // specific test value
	  setFieldValue("namJenOdsEvaluation", "{\"items\":[{\"odsJeune\":\"Sport\"}]}");	  
	  setFieldValue("namJenPourcentReponseItemsEval", "[{\"items\":[{\"pourcentItemsJeune\":\"2\"}]}]");	  
	  setFieldValue("namJenNbrItemsEval", "{\"items\":[{\"nbrItemsEvalJeune\":\"47\"}]}");
	  	  
	}

La démonstration :

rubrique acquisition

Votre contenu est spécifique, cela relève d’un debug simple de votre code.

Passer par le template editor force des valeurs dans les champs de l’objet Main (the_ajax_xxx)
Votre initUpdate vient peut être en surcharge du testData.

Mettez un “debugger” dans votre code front pour l’exécuter en pas à pas.
et des traces dans votre code pour debugger vos hooks.

Vous pouvez aussi inhiber le code pour le template editor.

obj.getParameter("_UI_EDIT_TEMPLATE_")!=null

Sinon :

  • “ui” est déjà la UI passée en paramètre, inutile de mettre window.$ui
  • mettre ctn à la place de null, vous devez chercher le champ dans le container demandé, (null = #work par défaut, mais ce n’est pas toujours le cas) :
var nom  = ui.getUIField(ctn, obj, "namNom").ui.val();				   

Bonjour @Francois;

J’ai te laisse avec cette démonstration dans laquelle j’ai “debugger” le code front:

rubrique acquisition debbuge

Dans la BO, j’ai positionné des log dans la fonction “testData” et “initUpdate” et je constaté que lorsque j’ouvre le formulaire “initUpdate” est lancée et lorsque j’ouvre ‘template editor’ la fonction “testDate” est lancée, une fois je ferme ‘template editor’ et je reviens sur le formulaire la fonction 'initUpdate" n’est pas exécutée.

Dans le BO, j’ai défini des logs dans les fonctions “testData” et “initUpdate” et j’ai noté que lorsque j’ouvre le formulaire, la fonction “initUpdate” est lancée et que lorsque j’ouvre ‘template editor’, la fonction “testDate” est lancée, mais une fois que je ferme ‘template editor’ et que je reviens au formulaire, la fonction “initUpdate” n’est pas exécutée.

Merci pour votre retour,

Quand vous fermez l’éditeur vous revenez à la définition de l’objet, pas au formulaire de l’objet.
On va quand même vérifier que l’initUpdate est bien appelé au retour du template editor.

Par ailleurs, l’initUpdate n’est pas sensé servir à valoriser des champs dans un cas général, car il n’est pas appelé par exemple en cas d’appel via API/get. Pour valoriser des champs métier “par dessus” les valeurs remontées par la base, il est préférable de le faire dans le postSelect qui ne dépend pas du contexte d’usage ou d’une navigation sur la UI.

Re-bonjour @Francois ;

Le problème est identifié dans d’autres BO, lorsque j’ouvre “template editor” et que je reviens au formulaire, j’ai un affichage un peu bizarre. Je vous laisse avec la démonstration :

template editor

Effectivement après analyse, suite à une précédente demande OBS, quand on passe par le template editor, Simplicité positionne un flag _UI_EDIT_TEMPLATE_ sur l’instance main pour éviter d’appeler trop de hooks en back (bypass du initUpdate, initAction… qui posaient des problèmes quand les données étaient fictives), et aussi de pouvoir inhiber du code si besoin dans ce contexte en back :

if (!editTemplateUsage()) ...

On a ajouté un traitement pour que lorsqu’on quitte le template editor, ce flag soit retiré, sans avoir à vider le cache de l’objet manuellement. Ce sera livré dans la semaine, en attendant il faut cliquer sur le bouton “Vider de cache” de l’objet au retour de l’éditeur dans la définition de l’objet.

Merci @Francois pour votre réponse

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.