Gestion du 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 l’instance ServiceNow , le moteur Apache Jelly affiche des éléments tels que des formulaires, des listes et des pages d’interface utilisateur. Le code Apache Jelly s’affiche bien dans un bloc de contenu dynamique, mais peut rencontrer 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 chaque balise j et g respectivement. 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 le résultat en cache. 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 à peu près au 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. À 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 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 apportés aux groupes d’affectation d’incident ne sont pas prévus. 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 dans 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 émise :${}signifie première phase,$[]signifie deuxième phase. - Le HTML précédant 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 (aucun 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>