Content Management et le moteur Apache Jelly

  • Rversion finale: Xanadu
  • Mis à jour 1 août 2024
  • 4 minutes de lecture
  • Apache Jelly est un moteur de script et de traitement basé sur Java et XML permettant de transformer XML en code exécutable.

    Le moteur Apache Jelly ressemble beaucoup à XML et devrait être confortable pour les développeurs familiers avec JavaScript, XML, XHTML ou HTML. Dans l’instance, le moteur Apache Jelly affiche des éléments tels que des formulaires, des listes et des pages d’interface ServiceNow utilisateur. Le code Apache Jelly s’affiche bien dans un bloc de contenu dynamique, mais peut avoir des problèmes lorsqu’il est utilisé dans des blocs statiques. Vous pouvez utiliser des balises, des appels et des instructions Jelly, mais HTML agit comme du XHTML.

    <?xml version= "1.0" encoding= "utf-8" ?>
    <j:jelly trim = "false" xmlns:j = "jelly:core" xmlns:g = "glide" xmlns:j2 = "null" xmlns:g2 = "null" >
     
    	<j:if test = "${current_page.getName()=='Solutions'}" >
    	<h1 class = "page_name" > <b> <a href = "solutions.do?" title="${gs.getMessage('Solutions')}" >${gs.getMessage('Solutions')}</a> </b> </h1>
    	<p class = "page_description" >
    	 	    ${current_page.getDescription()}
    	</p> <br />
    	</j:if>
    	<j:if test = "${current_page.getName()=='IT 3.0'}" >
    	   <h1 class = "page_name" > <b> <a href = "solutions.do?" title="${gs.getMessage('Solutions')}" >${gs.getMessage('Solutions')}</a> </b> | ${current_page.getName()}</h1>
    	   <p class = "page_description" >
    	 	    ${current_page.getDescription()}
    		</p> <br />
    		</j:if>
    		</j:jelly>

    Assurez-vous que toutes les balises sont fermées. S’il ne s’agit pas d’une balise qui se ferme naturellement, placez une barre oblique avant le crochet de fin. Par exemple, a <BR /> ou un <IMG src="cms.png" />.

    Si vous n’êtes pas familier avec le scripting Jelly, consultez les rubriques suivantes :

    Incluez la balise suivante avec tous les scripts Apache Jelly.

    <j:jelly trim= "false" xmlns:j= "jelly:core" xmlns:g= "glide" xmlns:j2= "null" xmlns:g2= "null" >
    La balise semble complexe, mais gardez à l’esprit les informations suivantes.
    • Le script Apache Jelly utilise plusieurs espaces de noms.
    • Il existe deux types de préfixes dans les balises : j et g. Le préfixe j est utilisé pour les balises qui font nativement partie d’Apache Jelly. Le préfixe g est utilisé pour les balises que la plateforme a créées et utilise à des fins de plateforme ServiceNow .

    Les préfixes j2 et g2 sont identiques à j et g, sauf qu’ils sont traités dans un second temps. L’analyseur de script Apache Jelly parcourt respectivement chaque balise j et g. Par exemple :

    <j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
    	<j:set var="jvar_phase1" value="Hello" />
    	<j2:set var="jvar_phase2" value="World" />
    	${jvar_phase1} $[jvar_phase2]
    </j:jelly>

    Dans la phase 1, l’analyseur passe en revue toutes les balises j et g. Il met ensuite en cache le résultat. Avant d’exécuter la deuxième phase, il prend les espaces de noms j et g et déplace les espaces de noms vers la deuxième phase. Il ressemble à quelque chose comme le code suivant.

    <j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="jelly:core" xmlns:g2="glide">
    	<j2:set var="jvar_phase2" value="World" />
    	Hello $[jvar_phase2]
    </j:jelly>
    Pour les appels subséquents de ce script, seule la phase 2 est analysée.
    Remarque :
    Si vous prévoyez d’utiliser les balises Jelly de la phase 2 (g2 et j2) sur les tables Type de contenu [content_type] ou Contenu dynamique [content_block_programmatic], sélectionnez l’option Deux phases dans le formulaire de contenu.

    Un autre exemple consiste à créer un rapport de tous les incidents ouverts affectés à chaque groupe. À cette fin, vous pouvez utiliser un rapport et gagner du temps, mais c’est un bon exemple pour apprendre Jelly. Commencez par la balise Jelly :

    <j:jelly trim= "false" xmlns:j= "jelly:core" xmlns:g= "glide" xmlns:j2= "null" xmlns:g2= "null" >
    </j:jelly>

    Tout d’abord, vous avez besoin d’une liste d’incidents ouverts. Utilisez une balise g2 :assess. La balise d’évaluation exécute le script. Tout ce qui se trouve à l’intérieur de la balise est analysé comme une règle métier, ainsi, par exemple, vous pouvez appeler des règles métier globales, des includes de script et gliderecord.

    <j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
    	<g:evaluate var="jvar_groups" object="true">
    		var now_GR = new GlideRecord("sys_user_group");
    		gr.orderBy('name');
    		gr.query();
    		gr;
    	</g:evaluate>
    </j:jelly>

    Ce script est en phase 1, car des changements fréquents dans les groupes d’affectation d’incident ne sont pas prévus. Notez également l’attribut var sur la balise value. Cet attribut spécifie quelle variable est définie à partir de ce bloc. À la fin du script, il y a un gr sur une ligne à part. C’est cette dernière ligne qui définit la variable.

    Vous pouvez omettre la variable jvar_groups , mais toutes les variables de la balise d’évaluation deviennent alors des variables Apache Jelly. object =true spécifie que la variable n’est pas un type de données primitif. Si object=true est omis, le script s’arrêtera car jvar_groups ne pourra contenir que des éléments tels que des entiers et des chaînes.

    Après la balise d’évaluation, parcourez ces groupes et recherchez les incidents pour chacun d’eux.

    <j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
    	<g:evaluate var="jvar_groups" object="true">
    		var now_GR = new GlideRecord("sys_user_group");
    		gr.orderBy('name');
    		gr.query();
    		gr;
    	</g:evaluate>
    	<table>
    		<tr>
    			<th>Name</th>
    			<th>Incidents</th>
    		</tr>
    		<j:while test="${jvar_groups.next()}">
    			<tr>
    				<td>${HTML:jvar_groups.getValue('name')}</td>
    				<td></td>
    			</tr>
    		</j:while>
    	</table>
    </j:jelly>
    Vous pouvez inclure du code XML normal dans le script Apache Jelly à tout moment. Comme il n’y a pas d’espace de noms, le script Apache Jelly n’essaie pas d’analyser les balises XML. Remarquez la boucle j :while . Il s’agit d’une boucle while normale qui peut itérer via un objet GlideRecord. Notez également que vous affichez une valeur avec ${HTML :jvar_groups.getValue('name')}. Voici les éléments importants :
    • Les crochets extérieurs, ${}, spécifient la sortie de la variable et la phase dans laquelle la variable est sortie : ${} signifie première phase, $[] signifie deuxième phase.
    • HTML avant l’expression sert à échapper la sortie. L’expression jvar_groups.getValue('name') est échappée pour HTML. Pour les autres types d’échappement, il existe JS (Javascript), NS (No Script) et d’autres options.

    Pour sélectionner un seul enregistrement et ne pas itérer dans de nombreux enregistrements, le code ressemble à l’exemple suivant :

    <j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
    	<g:evaluate var="jvar_groups" object="true">
    		var now_GR = new GlideRecord("sys_user_group");
    		gr.orderBy('name');
    		gr.query();
    		gr;
    	</g:evaluate>
    	<j:if test="${jvar_groups.next()}">
    		We found ${HTML:jvar_groups.getValue('name')}
    	</j:if>
    </j:jelly>