Um template JavaScript é um documento HTML ou texto que inclui código JavaScript. Ele é criado da mesma forma que um conteúdo de email em uma ação de delivery.
Um template JavaScript é identificado por seu nome e namespace como schemas e formulários. No entanto, é recomendável adicionar a opção .js ao nome do template.
Exemplo de um template de formatação HTML de JavaScript baseado no schema "cus:book":
<html>
<body>
<!-- Title of book -->
<h1><%= content.@name %></h1>
<ul>
<% for each(var chapter in content.chapter) { %>
<li><%= chapter.@name %></li>
<% }%>
</ul>
</body>
</html>
As várias diretivas JavaScript aparecem no seguinte formulário:
<%= <source> %>
sintaxe onde <source>
é o campo de origem dos dados a serem exibidos.O objeto de conteúdo representa o elemento principal do documento XML de entrada.
Em nosso exemplo, a linha a seguir exibe o conteúdo do nome do livro de nomes:
<h1><%= content.@name %></h1>
O código a seguir itera no <chapter>
elemento de coleção:
<% for each(var chapter in content.chapter) { %>
<li><%= chapter.@name %></li>
<% }%>
Os atributos e elementos do conteúdo são representados como objetos JavaScript e respeitam a estrutura do documento de origem.
Exemplo:
['name']
: idêntico ao conteúdo.sintaxe @name<chapter
elemento de coleção[0]
.@name: recupera o nome do primeiro <chapter>
elemento<chapter>
elemento<chapter>
Como o caractere '-' é reservado na linguagem JavaScript, a recuperação do valor de qualquer atributo ou elemento que contém esse caractere deve ser executada por meio da sintaxe ['<field>']
.
Por exemplo: content.@['offer-id']
.
Todos os recursos de uma linguagem de programação (variáveis, loops, testes condicionais, funções e etc.) estão disponíveis para criar o documento de saída. As APIs SOAP são acessíveis para enriquecer o documento de saída.
Exemplos:
Teste condicional:
<% if (content.@number == 1 || content.@language == 'en') { %>
<!-- Content to be displayed if test is true-->
<% } %>
Chamada de função:
<!-- 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) %>
Declarações e chamada variável:
<% var counter = 0; %>
<%= counter += 10 %>
Recuperação e exibição de um nome de recipient com métodos estáticos:
<% var recipient = nms.recipient.get(1246); %>
<%= recipient.lastName %>
Recuperação e exibição de um nome de recipient com métodos não estáticos:
<% 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 %>
É possível constituir uma biblioteca de funções ou variáveis para uso posterior. Para fazer isso, importe o template JavaScript com a função eval. Isso permite enriquecer contextos com funções adicionais declaradas em outros templates JavaScript.
Exemplo: importação do template common.jsp.
<% eval(xtk.javascript.get("cus:common.js").data); %>
A zona de edição permite que você preencha o conteúdo do template JavaScript:
O schema do modelo de dados associados deve ser preenchido para a inicialização de objetos JavaScript.
Para gerar a pré-visualização do documento de saída a qualquer momento, selecione um conteúdo e um formato de saída (HTML, Texto, XML) e clique em Generate:
Não é necessário salvar as alterações para visualizar o documento de saída.
Abaixo você encontrará a configuração necessária para implementar a seguinte gestão de conteúdo usando um template JavaScript:
Este exemplo envolve as seguintes etapas:
Crie o seguinte schema (neste caso: 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>
Crie o formulário de do tipo Content management vinculado (neo:news)
<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>
Crie os templates JavaScript com o conteúdo de mensagem para formatos HTML e Texto.
No nosso exemplo, para 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>
Para o texto:
<%= 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 %>
<% }
%>
Agora crie o template de publicação usado para ambos os formatos:
Para HTML:
Para Texto:
Você pode então usar esse template de conteúdo em seus deliveries.
Para obter mais informações, consulte Uso de um template de conteúdo.
A linguagem XSLT permite alterar um documento XML para um documento de saída. Dependendo do método de saída da folha de estilos, o documento resultante pode ser gerado em HTML, texto sem formatação ou outra árvore XML.
Essa transformação é detalhada em XML em um documento conhecido como folha de estilos.
Uma folha de estilos é identificada por seu nome e namespace, como schemas e formulários. No entanto, é recomendável adicionar a extensão .xsl ao nome da folha de estilos.
A chave de identificação de uma folha de estilos é uma cadeia de caracteres formada pelo namespace e pelo nome separados por dois pontos, por exemplo: cus:book.xls.
Exemplo de uma folha de estilos de formatação HTML com base no schema de exemplo "cus:book":
<?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>
Uma folha de estilos é um documento XML que obedece às seguintes regras:
Uma folha de estilos deve começar com o marcador de elemento raiz XSL <xsl:stylesheet>
e terminar com o marcador </xsl:stylesheet>
. O namespace XSL deve ser definido no marcador de abertura da seguinte forma:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
O elemento <xsl:output>
especifica o formato do documento gerado. Especifique o conjunto desejado de caracteres e o formato de saída.
<xsl:output encoding="ISO-8859-1" method="html"/>
As instruções a seguir descrevem a configuração da folha de estilos para a formatação do documento de saída.
<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>
Por padrão, o processador XSLT busca o template que se aplica ao nó raiz ou principal do documento XML de entrada. A construção do documento de saída começa com este template.
Em nosso exemplo, uma página HTML é gerada no schema "cus:book" exibindo o nome do livro e a lista de capítulos.
Para obter mais informações sobre a linguagem XSLT, consulte um documento de referência XSLT.
Para exibir um campo html, use a opção disable-output-escaping="yes" da diretiva <xsl:value-of>
. Isso permite evitar a substituição de caracteres por sua entidade XML (por exemplo < com <).
A diretiva <xsl:text>
com a opção disable-output-escaping="yes" permite inserir tags JavaScript para campos de personalização ou testes condicionais.
Exemplos:
Exibir o conteúdo de um campo de tipo "html":
<xsl:value-of select="summary" disable-output-escaping="yes"/>
Inserir o campo de personalização <%= recipient.email %>:
<xsl:text disable-output-escaping="yes"><%= recipient.email %></xsl:text>
Adicionar o teste condicional <% if (recipient.language == 'en') {
%>:
<xsl:text disable-output-escaping="yes"><% if (recipient.language == 'en') { %></xsl:text>
É possível construir uma biblioteca de templates ou variáveis a serem compartilhadas entre várias folhas de estilos. O template "longMonth", apresentado acima, é um exemplo típico da vantagem de localizar um template remotamente em uma folha de estilos para que ele possa ser reutilizado posteriormente.
A diretiva <xsl:include>
indica o nome da folha de estilos a ser incluída no documento.
Exemplo: incluindo a folha de estilos "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>
O nome do namespace não deve ser inserido na referência da folha de estilos para incluir. Como padrão, essa folha de estilos é criada com o namespace do usuário.
A zona de edição permite preencher o conteúdo da folha de estilos:
Para gerar uma pré-visualização do documento de saída a qualquer momento, selecione uma instância de conteúdo e o formato (HTML, Texto, XML) e clique em Generate:
Não há necessidade de salvar as alterações na folha de estilos para exibir a pré-visualização do documento de saída.
As imagens inseridas no documento de saída HTML podem ser indicadas com referências absolutas ou relativas.
A referência relativa permite que você insira o URL do servidor contendo as imagens nas opções NcmRessourcesDir e NcmRessourcesDirPreview. Essas opções contêm o local das imagens para publicação e pré-visualização no console do cliente do Adobe Campaign.
Essas duas opções são acessíveis pela tela de gestão de opções na pasta Administration > Platform > Options.
Exemplo:
Durante o processamento da folha de estilos, o atributo _resPath no elemento principal do documento XML de entrada é preenchido automaticamente com uma ou mais das opções, dependendo do contexto (pré-visualização ou publicação).
Exemplo de como usar a opção de colocação de imagem e seu uso com uma imagem:
<img src="<%= content.@_resPath %>/newsletter/image.png"/>
Recomendamos declarar uma variável contendo a referência do servidor onde as imagens são armazenadas ("resPath" em nosso exemplo).
Também é possível usar Public resources para declarar imagens e carregá-las no servidor, dependendo das configurações de instância inseridas no assistente de implantação.
Você poderá então acionar essas imagens em conteúdos. Para fazer isso, use a seguinte sintaxe no schema de gestão de conteúdo:
<element label="Image" name="image" target="xtk:fileRes" type="link"/>
No formulário, o campo para selecionar a imagem será adicionado através da seguinte sintaxe:
<input img="nl:sryimage.png" newEntityFormChoice="true" xpath="image">
<sysFilter>
<condition expr="@isImage = true"/>
</sysFilter>
</input>
Para obter mais informações sobre Public resources e como configurar e usá-los, consulte esta seção.
No documento de entrada XML, as datas são armazenadas no formato XML interno: YYYY/MM/DD HH:MM:SS (exemplo: 2018/10/01 12:23:30).
O Adobe Campaign fornece funções de formatação de data para os modelos JavaScript e folhas de estilos XSL detalhadas abaixo.
Para exibir uma data no formato desejado, o Adobe Campaign fornece a função formatDate que tem como entrada o conteúdo da data e uma cadeia de caracteres especificando o formato de saída com a seguinte sintaxe: %4Y/%2M/%2D %2H%2N%2S
Exemplos:
Exibir a data no formato 31/10/2018 :
<%= formatDate(content.@date, "%2D/%2M/%4Y") %>
Exibir a data no formato julho de 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) %>
Não há função de gerenciamento de data padrão na sintaxe XSLT. Para exibir uma data no formato desejado, o Adobe Campaign fornece a função externa date-format. Essa função assume como entrada o conteúdo da data e uma cadeia de caracteres especificando o formato de saída com a seguinte sintaxe: %4Y/%2M/%2D %2H%2N%2S
Exemplos:
Para exibir a data no formato 01/10/2018:
<xsl:value-of select="external:date-format(@date, '%2D/%2M/%4Y')"/>
Para exibir a data no formato julho de 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')"/>