[S’applique également à la v8.]{class="badge positive" title="S’applique également à Campaign v8."}
Mise en forme formatting
Templates JavaScript javascript-templates
Un template JavaScript est un document HTML ou texte incluant du code JavaScript. Il est construit de la même manière qu'un contenu email dans une action de diffusion.
Identification d'un template JavaScript identification-of-a-javascript-template
Un template JavaScript est identifié par son nom et son espace de noms de la même manière que les schémas et les formulaires. Il est cependant préconisé de compléter le nom du template avec l'option .js.
Structure d'un template JavaScript structure-of-a-javascript-template
Exemple de template JavaScript de mise en forme HTML se basant sur le schéma "cus:livre" :
<html>
<body>
<!-- Title of book -->
<h1><%= content.@name %></h1>
<ul>
<% for each(var chapter in content.chapter) { %>
<li><%= chapter.@name %></li>
<% }%>
</ul>
</body>
</html>
Les différentes directives JavaScript se présentent sous la forme suivante :
- Champs de fusion : affiche le contenu des données avec la syntaxe
<%= <source> %>
, où<source>
correspond au champ source des données à afficher. - blocs d'instructions : exécute une série d'instructions JavaScript incluses entre les balises <% et %>.
L'objet content représente l'élément principal du document XML en entrée.
Dans notre exemple, la ligne suivante affiche le contenu du nom du livre :
<h1><%= content.@name %></h1>
Le code suivant itère sur l’élément de collection <chapter>
:
<% for each(var chapter in content.chapter) { %>
<li><%= chapter.@name %></li>
<% }%>
Les attributs et éléments du contenu sont représentés comme des objets JavaScript et respectent la structure du document source.
Exemple:
- content.@name : récupère la valeur de l’attribut « name » de l’élément principal
- content.@
['name']
: identique au contenu .syntaxe @name - content.chapter.length
<chapter
: retourne le nombre d’éléments sur l’élément de collection - content.chapter
[0]
.@name : récupère le nom du premier élément<chapter>
- chapter.name() : retourne le nom de l’élément
<chapter>
- chapter.parent().name() : retourne le nom de l’élément parent de
<chapter>
['<field>']
.content.@['offer-id']
.Toute la puissance d'un langage de programmation (variables, boucles, tests conditionnels, fonctions, etc.) est disponible pour construire le document en sortie. Les API SOAP sont accessibles pour enrichir le document de sortie.
Exemples:
-
Test conditionnel :
code language-none <% if (content.@number == 1 || content.@language == 'en') { %> <!-- Content to be displayed if test is true--> <% } %>
-
Appel de fonction :
code language-none <!-- Displays a horizontal bar --> ;<% function DisplayHorizontalBar() { %> <hr/> <% } %> <!-- The same function in a block --> <% function DisplayHorizontalBar2() { document.write('<hr/>'); } %> <!-- Returns the value in uppercase --> <% function formatName(value) { return value.toUpperCase(); } %> <!-- Call functions --> <%= DisplayHorizontalBar1() %> <%= DisplayHorizontalBar2() %> <%= formatName(content.@name) %>
-
Déclarations et appel de variables :
code language-none <% var counter = 0; %> <%= counter += 10 %>
-
Récupération et affichage du nom d'un destinataire avec les méthodes statiques :
code language-none <% var recipient = nms.recipient.get(1246); %> <%= recipient.lastName %>
-
Récupération et affichage du nom d'un destinataire avec les méthodes non statiques :
code language-none <% var query = xtk.queryDef.create( <queryDef schema="nms:recipient" operation="get"> <select> <node expr="@lastName"/> </select> <where> <condition expr="@id=1246"/> </where> </queryDef>); var recipient = query.ExecuteQuery(); %> <%= recipient.@lastName %>
Inclusion de template JavaScript including-a-javascript-template
Il est possible de se constituer une bibliothèque de fonctions ou de variables afin de les utiliser ultérieurement. Pour cela, vous devez importer le template JavaScript avec la fonction eval. Ainsi, vous pourrez enrichir les contextes avec des fonctions supplémentaires déclarées dans d'autres template JavaScript.
Exemple : import du template common.js.
<% eval(xtk.javascript.get("cus:common.js").data); %>
Edition d'un template JavaScript editing-a-javascript-template
La zone d'édition permet de renseigner le contenu du template JavaScript :
Pour générer à tout moment l'aperçu du document de sortie, vous devez sélectionner un contenu et le format de sortie (HTML, Texte, XML) puis cliquer sur le bouton Générer :
Exemple de réalisation et d'utilisation d'un template JavaScript example-of-how-to-create-and-use-a-javascript-template
Vous trouverez ci-dessous le paramétrage nécessaire à l'implémentation de la gestion de contenu suivante en utilisant un template Javascript :
Les étapes de réalisation de cet exemple sont les suivantes :
-
Créez le schéma suivant (ici :neo:news):
code language-none <srcSchema _cs="Invitation (neo)" entitySchema="xtk:srcSchema" img="xtk:schema.png" label="Invitation" mappingType="sql" name="news" namespace="neo" xtkschema="xtk:srcSchema"> <enumeration basetype="string" default="en" name="language"> <value label="Français" name="fr" value="fr"/> <value label="English" name="gb" value="gb"/> </enumeration> <enumeration basetype="string" name="css"> <value label="Blue" name="bl" value="blue"/> <value label="Orange" name="or" value="orange"/> </enumeration> <element label="Intervenants" name="attendee"> <key internal="true" name="id"> <keyfield xpath="@id"/> </key> <attribute label="Name" name="name" type="string"/> <element label="Image" name="image" target="xtk:fileRes" type="link"/> <attribute label="Description" name="description" type="string"/> <attribute default="Gid()" label="Id" name="id" type="long"/> </element> <element label="Invitation" name="news" template="ncm:content" xmlChildren="true"> <compute-string expr="@name"/> <attribute enum="language" label="Language" name="language" type="string"/> <attribute enum="css" label="Stylesheet" name="css" type="string"/> <attribute label="Title" name="title" type="string"/> <element label="Presentation" name="presentation" type="html"/> <attribute label="Date" name="date" type="date"/> <element label="Attendees list" name="attendeesList" ordered="true" ref="attendee" unbound="true"/> </element> </srcSchema>
-
Créez le formulaire associé (neo:news) de type Gestion de contenu :
code language-none <form _cs="News (neo)" entitySchema="xtk:form" img="xtk:form.png" label="News" name="news" namespace="neo" type="contentForm" xtkschema="xtk:form"> <container type="iconbox"> <container label="Invitation"> <input xpath="@langue"/> <input xpath="@css"/> <input xpath="@title"/> <input xpath="@date"/> <input xpath="presentation"/> </container> <container label="Intervenants"> <container toolbarCaption="Liste des intervenants" type="notebooklist" xpath="attendeesList" xpath-label="@nom"> <container> <input xpath="@nom"/> <input img="nl:sryimage.png" newEntityFormChoice="true" xpath="image"> <sysFilter> <condition expr="@isImage = true"/> </sysFilter> </input> <input xpath="@description"/> </container> </container> </container> </container> </form>
-
Créez les templates JavaScript avec les contenus du message pour les formats HTML et Texte.
-
Dans notre exemple, pour le HTML :
code language-none <html> <head> <title>Newsletter</title> <style type="text/css"> .body {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; color:#514c48; margin-left: auto; margin-right: auto;} .body table {width:748; border: solid 1px; cellpadding:0; cellspacing:0"} </style> </head> <body> <p><center><%= mirrorPage %></center></p> <center> <table> <tr> <td> <img src="[LOGO]"/> </td> <td> <h1><%= content.@title %></h1> </td> </tr> <tr> <td> <div > <h0><%= hello,</h0> <p><%= content.presentation %></p> <h0>Useful information</h0> <p> <img src="[IMAGE 1]"/>When? <br/><%= formatDate(content.@date, "%2D %Bl %4Y") %> From 10 AM in your bookshop.</p><br/> <p> <img src="[IMAGE 2]"/>Who? <br>Meet our favorite authors and illustrators and get a signed copy of their book.</p><br/> <p> <img src="[IMAGE 3]"/>Attendance is free but there is a limited number of seats: sign up now!</p> </div> </td> <td> <div style="text-align:left; width:210; height:400px; background:url([IMAGE DE FOND])"> <h0><%= participant %></h0> <% var i var iLength = content.attendeesList.length() for (i=0; i<iLength; i++) { %> <p> <%= generateImgTag(content.attendeesList[i].@["image-id"]) %> <%= content.attendeesList[i].@description %> </p> <% } %> </div2> </td> </tr> </table> </center> </body> </html>
-
Pour le texte :
code language-none <%= content.@title %> <%= content.presentation %> *** When? On <%= formatDate(content.@date, "%2D %Bl %4Y") %> From 10 AM in your bookshop. *** Who? Come and meet our favorite authors and illustrators and get a signed copy of their books. *** Attendance is free but there is a limited number of seats: sign up now! Guests: ****************** <% var i var iLength = content.attendeesList.length() //for (i=(iLength-1); i>-1; i--) for( i=0 ; i<iLength ; i++ ) { %> Description <%= i %> : <%= content.attendeesList[i].@description %> <% } %>
-
-
Créez enfin le modèle de publication utilisé pour les deux formats :
-
Pour le HTML :
-
Pour le Texte :
-
-
Vous pouvez enfin utiliser ce modèle de contenu dans vos diffusions.
Pour plus d’informations à ce sujet, reportez-vous à la section Utiliser un modèle de contenu.
Feuilles de style XSL xsl-stylesheets
Le langage XSLT permet de transformer un document XML en un document de sortie. Selon la méthode de sortie de la feuille de style, le document résultant peut être généré en HTML, en texte brut ou en une autre arborescence XML.
Cette transformation est elle-même décrite en XML dans un document appelé feuille de style.
Identification d'une feuille de style identifying-a-stylesheet
Une feuille de style est identifiée par son nom et son espace de noms de la même manière que les schémas et les formulaires. Il est cependant recommandé de compléter le nom de la feuille de style avec l'extension .xsl.
La clé d'identification d'une feuille de style est une chaîne construite avec l'espace de noms et le nom séparés par le caractère ':' (par exemple : cus:livre.xsl).
Structure d'une feuille de style structure-of-a-stylesheet
Exemple de feuille de style de mise en forme HTML se basant sur le schéma d'exemple "cus:livre" :
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output encoding="ISO-8859-1" method="html"/>
<!-- Point of entry of the stylesheet -->
<xsl:template match="/book">
<html>
<body>
<!-- Book title -->
<h1><xsl:value-of select="@name"/></h1>
<lu>
<!-- List of chapters -->
<xsl:for-each select="child::chapter">
<li><xsl:value-of select="@name"/></li>
</xsl:for-each>
</lu>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Une feuille de style est un document XML respectant les règles suivantes :
- les valeurs d'attributs sont entre guillemets,
- un élément doit avoir un marqueur d'ouverture et un marqueur de fermeture,
- les caractères « < » ou « & » doivent être remplacés par les entités '<' ou '&',
- chaque élément XSL doit utiliser l'espace de noms xsl.
Une feuille de style doit commencer par le marqueur d’élément racine XSL <xsl:stylesheet>
et se terminer par le marqueur </xsl:stylesheet>
. L’espace de noms XSL doit être défini dans le marqueur d’ouverture comme suit :
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
L’élément <xsl:output>
spécifie le format du document généré. Spécifiez le jeu de caractères souhaité et le format de sortie.
<xsl:output encoding="ISO-8859-1" method="html"/>
Les instructions suivantes décrivent le paramétrage de la feuille de style pour la mise en forme du document de sortie.
<xsl:template match="/book">
<html>
<body>
<!-- Book title -->
<h1><xsl:value-of select="@name"/></h1>
<lu>
<!-- List of chapters -->
<xsl:for-each select="child::chapter">
<li><xsl:value-of select="@name"/></li>
</xsl:for-each>
</lu>
</body>
</html>
</xsl:template>
Par défaut, le processeur XSLT recherche le template s'appliquant au noeud racine ou principal du document XML en entrée. La construction du document de sortie commence à partir de ce template.
Dans notre exemple, on génère une page HTML à partir du schéma "cus:livre" en affichant le nom du livre et la liste des chapitres.
Afficher du HTML/XML displaying-html-xml
Pour afficher un champ html, utilisez l’option disable-output-escaping="yes" de la directive <xsl:value-of>
. Vous évitez ainsi de remplacer les caractères par leur entité XML (par exemple < par <).
La directive <xsl:text>
avec l’option disable-output-escaping="yes" permet d’insérer des balises JavaScript de champs de personnalisation ou de test conditionnels.
Exemples:
-
Afficher le contenu d'un champ de type "html" :
code language-none <xsl:value-of select="summary" disable-output-escaping="yes"/>
-
Insérer le champ de personnalisation <%= recipient.email %> :
code language-none <xsl:text disable-output-escaping="yes"><%= recipient.email %></xsl:text>
-
Ajouter le test conditionnel <% if (recipient.language == 'fr')
{
%> :code language-none <xsl:text disable-output-escaping="yes"><% if (recipient.language == 'en') { %></xsl:text>
Inclusion de feuilles de style including-stylesheets
Il est possible de se constituer une bibliothèque de templates ou de variables à partager avec plusieurs feuilles de style. Le template "longMonth", présenté ci-dessus, est un exemple-type de l'intérêt de déporter un template dans une feuille de style afin d'être ré-utilisé ultérieurement.
La directive <xsl:include>
indique le nom de la feuille de style à inclure dans le document.
Exemple : inclusion de la feuille de style "common.xsl".
<? xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:include href="common.xsl"/>
<xsl:output encoding="ISO-8859-1" method="jsp" indent="yes"/>
...
</xsl:stylesheet>
Edition d'une feuille de style editing-a-stylesheet
La zone d'édition permet de renseigner le contenu de la feuille de style :
Pour générer à tout moment l'aperçu du document de sortie, vous devez sélectionner une instance de contenu et le format de mise en forme (HTML, Texte, XML), puis cliquer sur le bouton Générer :
Gestion des images image-management
Référencement des images image-referencing
Les images renseignées dans le document HTML de sortie peuvent être référencées en absolu ou en relatif.
Le référencement relatif permet de renseigner l'URL du serveur contenant les images dans les options NcmRessourcesDir et NcmRessourcesDirPreview. Ces options contiennent l'emplacement des images pour la publication et la prévisualisation dans la console cliente Adobe Campaign.
Ces deux options sont accessibles à partir de l'écran des gestions des options dans le dossier Administration > Plateforme > Options.
Exemple:
- NcmResourcesDir = "https://server/images/"
- NcmResourcesDirPreview = "x:/images/"
Lors du traitement de la feuille de style, selon le contexte (aperçu ou publication), l’attribut _resPath sur l’élément principal du document XML en entrée est automatiquement renseigné avec l’une ou l’autre des deux options.
Exemple d'utilisation de l'option d'emplacement des images et son utilisation avec une image :
<img src="<%= content.@_resPath %>/newsletter/image.png"/>
Utilisation des ressources publiques using-public-resources
Vous pouvez également utiliser les Ressources publiques pour déclarer les images et les télécharger sur le serveur selon les paramètres de l'instance, renseignés dans l'assistant de déploiement.
Vous pourrez ensuite appeler ces images dans les contenus. Pour cela, utilisez la syntaxe suivante dans le schéma de gestion de contenu :
<element label="Image" name="image" target="xtk:fileRes" type="link"/>
Dans le formulaire, le champ de sélection de l'image sera ajouté via la syntaxe suivante :
<input img="nl:sryimage.png" newEntityFormChoice="true" xpath="image">
<sysFilter>
<condition expr="@isImage = true"/>
</sysFilter>
</input>
Affichage des dates date-display
Dans le document XML en entrée, les dates sont stockées dans le format XML interne : YYYY/MM/DD HH:MM:SS
(par exemple, 2018/10/01 12:23:30
).
Adobe Campaign met à disposition des fonctions de formatage des dates pour les templates JavaScript et les feuilles de style XSL qui sont présentés ci-après.
Formatage des dates en JavaScript javascript-date-formatting
Pour afficher une date dans le format souhaité, Adobe Campaign met à disposition la fonction formatDate qui prend en entrée le contenu de la date et une chaîne spécifiant le format de sortie avec la syntaxe suivante : %4Y/%2M/%2D %2H%2N%2S
Exemples:
-
Afficher la date au format 31/10/2018 :
code language-none <%= formatDate(content.@date, "%2D/%2M/%4Y") %>
-
Afficher la date au format Juillet 2018 :
code language-none <% function displayDate(date) { var aMonth = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ]; var month = formatDate(content.@date, "%2M") var year = formatDate(content.@date, "%4Y") return aMonth[month-1]+" "+year; } %> <%= displayDate(content.@date) %>
Formatage des dates en XSL xsl-date-formatting
Il n'existe pas de fonction standard de gestion des dates dans la syntaxe XSLT. Pour afficher une date au format souhaité, Adobe Campaign fournit la fonction externe date-format. Elle prend en entrée le contenu de la date et une chaîne spécifiant le format de sortie avec la syntaxe suivante : %4Y/%2M/%2D %2H%2N%2S
Exemples:
-
Pour afficher la date au format 01/10/2018 :
code language-none <xsl:value-of select="external:date-format(@date, '%2D/%2M/%4Y')"/>
-
Pour afficher la date au format Juillet 2018 :
code language-none <!-- Returns the month in the form of a string with the month number as input --> <xsl:template name="longMonth"> <xsl:param name="monthNumber"/> <xsl:choose> <xsl:when test="$monthNumber = 1">January</xsl:when> <xsl:when test="$monthNumber = 2">February</xsl:when> <xsl:when test="$monthNumber = 3">March</xsl:when> <xsl:when test="$monthNumber = 4">April</xsl:when> <xsl:when test="$monthNumber = 5">May</xsl:when> <xsl:when test="$monthNumber = 6">June</xsl:when> <xsl:when test="$monthNumber = 7">July</xsl:when> <xsl:when test="$monthNumber = 8">August</xsl:when> <xsl:when test="$monthNumber = 9">September</xsl:when> <xsl:when test="$monthNumber = 10">October</xsl:when> <xsl:when test="$monthNumber = 11">November</xsl:when> <xsl:when test="$monthNumber = 12">December</xsl:when> </xsl:choose> </xsl:template> <!-- Display date --> <xsl:call-template name="longMonth"> <xsl:with-param name="monthNumber"> <xsl:value-of select="external:date-format(@date, '%2M')"/> </xsl:with-param> </xsl:call-template> <xsl:value-of select="external:date-format(@date, '%4y')"/>