Show Menu
SUJETS×

Mise en forme

Templates JavaScript

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

Un template JavaScript est identifié par son nom et son espace de nommage 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

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>
Le caractère « - » étant réservé dans le langage JavaScript, la récupération de la valeur de tout attribut ou élément contenant ce caractère devra passer par la syntaxe ['<field>'] .
Par exemple: 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 :
    <% if (content.@number == 1 || content.@language == 'en') { %>
    <!-- Content to be displayed if test is true--> 
    <% } %>
    
    
  • Appel de fonction :
    <!-- 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 :
    <%  var counter = 0; %>
    
    <%= counter += 10 %>
    
    
  • Récupération et affichage du nom d'un destinataire avec les méthodes statiques :
    <% var recipient = nms.recipient.get(1246); %>
    <%= recipient.lastName %>
    
    
  • Récupération et affichage du nom d'un destinataire avec les méthodes non statiques :
    <% 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

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

La zone d'édition permet de renseigner le contenu du template JavaScript :
Il est nécessaire de renseigner le schéma du modèle de données associé pour l'initialisation des objets 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 :
Il n'est pas nécessaire d'enregistrer les modifications pour visualiser l'aperçu du document de sortie.

Exemple de réalisation et d'utilisation d'un template JavaScript

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 :
  1. Créez le schéma suivant (ici : neo:news ):
    <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>
    
    
  2. Créez le formulaire associé ( neo:news ) de type Gestion de contenu :
    <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>
    
    
  3. Créez les templates JavaScript avec les contenus du message pour les formats HTML et Texte.
    • Dans notre exemple, pour le HTML :
      <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 :
      <%= 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 %>
        <% }  
      %>
      
      
  4. Créez enfin le modèle de publication utilisé pour les deux formats :
    • Pour le HTML :
    • Pour le Texte :
  5. 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

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

Une feuille de style est identifiée par son nom et son espace de nommage 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 nommage et le nom séparés par le caractère ':' (par exemple : cus:livre.xsl ).

Structure d'une feuille de style

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 nom 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 nommage 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.
Pour plus d'informations sur le langage XSLT, reportez-vous à une documentation de référence.

Afficher du 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" :
    <xsl:value-of select="summary" disable-output-escaping="yes"/>
    
    
  • Insérer le champ de personnalisation <%= recipient.email %> :
    <xsl:text disable-output-escaping="yes"><%= recipient.email %></xsl:text>
    
    
  • Ajouter le test conditionnel <% if (recipient.language == 'fr') { %> :
    <xsl:text disable-output-escaping="yes"><% if (recipient.language == 'en') { %></xsl:text>
    
    

Inclusion de feuilles de style

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>

Le nom de l'espace de nommage ne doit pas être renseigné dans la référence de la feuille de style à inclure. Par convention, cette feuille de style est créée avec l'espace de nommage utilisateur.

Edition d'une feuille de style

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 :
Il n'est pas nécessaire d'enregistrer les modifications de la feuille de style pour visualiser l'aperçu du document de sortie.

Gestion des images

Référencement des images

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/"
  • NcmRessourcesDirPreview = "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"/>

Il est conseillé de déclarer une variable contenant la référence du serveur où sont stockées les images ("resPath" dans notre exemple).

Utilisation des ressources publiques

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>

Les Ressources publiques , leur paramétrage et leur mode d'utilisation sont présentés dans cette section .

Affichage des dates

Dans le document XML en entrée, les dates sont stockées dans le format interne XML : AAAA/MM/JJ HH:MM:SS (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

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  :
     <%= formatDate(content.@date, "%2D/%2M/%4Y") %>
    
    
  • Afficher la date au format Juillet 2018  :
    <%
     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

Il n'existe pas de fonction standard de gestion des dates dans la syntaxe XSLT. Pour afficher une date dans le format souhaité, Adobe Campaign met à disposition 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  :
    <xsl:value-of select="external:date-format(@date, '%2D/%2M/%4Y')"/>
    
    
  • Pour afficher la date au format Juillet 2018  :
    <!-- 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')"/>