La gestion de contenu et le moteur Apache Jelly
Apache Jelly est un moteur de script et de traitement basé sur Java et XML qui permet 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 cette ServiceNow instance, le moteur Apache Jelly affiche des éléments tels que des formulaires, des listes et des pages de l’interface 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 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. Si la balise n’est pas 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" />.
Inclure 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" >- 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 créées par la plateforme et utilisées à des fins de plateforme ServiceNow .
Les préfixes j2 et g2 sont exactement comme j et g, sauf qu’ils sont traités dans une deuxième phase. 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 parcourt 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>Un autre exemple consiste à créer un rapport de tous les incidents ouverts affectés à chaque groupe. Pour cela, 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 des incidents ouverts. Utilisez une balise g2 :evaluate . La balise evaluate 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 des groupes d’affectation d’incident ne sont pas attendus. Notez également l’attribut var sur la balise d’évaluation. Cet attribut spécifie la variable définie à partir de ce bloc. À la fin du script, il y a un gr sur une ligne à part. Cette dernière ligne est ce qui définit la variable.
Vous pouvez omettre la variable jvar_groups , mais toutes les variables de la balise evaluate deviennent 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’interrompt car jvar_groups ne peut 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>j :while . Il s’agit d’une boucle while normale qui peut itérer via un objet GlideRecord. Notez également que vous générez 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 pour échapper la sortie.
L’expression jvar_groups.getValue('name')est en cours d’échappement 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 plusieurs 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>