Extensões para a sintaxe Jelly
A sintaxe Jelly do Apache é usada para renderizar formulários, listas, páginas de IU e muitas outras coisas renderizadas no ServiceNow.
Com o Jelly, a lógica pode ser incorporada ao conteúdo estático e os valores calculados podem ser inseridos no conteúdo estático.
Esta página do Apache tem um resumo dos marcadores Jelly padrão: http://commons.apache.org/jelly/tags.html
Namespaces
Jelly geralmente inclui vários namespaces ao invocar marcadores.
Os namespaces "j" são Jelly padrão, enquanto os namespaces "g" são exclusivos ServiceNow scripts. Por exemplo, o marcador <g:evaluate> é fornecido por ServiceNow Para permitir que você calcule um valor usando JavaScript. O marcador Jelly padrão <j:test> é usado para avaliar uma condição.
Fases
Normalmente, há duas fases indicadas por namespaces <j> versus <j2> e <g> versus <g2>.
Os namespaces sem o "2" acontecem na primeira fase de processamento e são armazenados em cache, exceto quando usados em uma página de IU. Aqueles com o "2" nunca são armazenados em cache. Deve-se tomar cuidado ao selecionar se usar a fase 1 ou a fase 2 para eficiência e resultados corretos.
Para além dos namespaces, a sintaxe usada para inserir valores no conteúdo estático difere dependendo de qual fase fornecerá o valor. Um dólar com chaves ao redor de um valor insere o valor na fase 1. Por exemplo, (jvar_ref) insere o valor jvar_ref durante a fase 1 do processo de geleia. Um dólar com colchetes ao redor de um valor insere o valor na fase 2. Por exemplo, [jvar_ref] insere o valor jvar_ref durante a fase 2. Um valor entre aspas é tratado como uma cadeia de caracteres. Por exemplo, '[jvar_ref]' insere o valor jvar_ref como uma cadeia de caracteres durante a fase 2.
<script>
if (confirm("$[gs.getMessage('home.delete.confirm') ]"))
...
</script>
<input type="hidden" id="${jvar_name}" name="${jvar_name}" value="${jvar_value}" class="${jvar_class}" />
Se for testado
Você pode usar instruções if em scripts Jelly.
Testar se algo é verdadeiro ou não pode ser feito da seguinte forma:
<j:if test="${jvar_something}">...do something...</j:if>
<j:if test="${!jvar_something}">...do something...</j:if>
- É booliano e verdadeiro
- É uma cadeia de caracteres e é "true", "yes", "on" ou "1"
Testar se algo existe pode ser feito da seguinte forma:
<j:if test="${empty(jvar_something)}">...do something...</j:if>
- nulo
- uma cadeia de caracteres vazia
- uma coleção de tamanho zero
- um mapa sem chaves
- uma matriz vazia
Set_if
Define uma variável como um de dois valores diferentes, dependendo se um teste é verdadeiro ou falso.
<g2:set_if var="jvar_style" test="$[gs.getPreference('table.compact') != 'false']"
true="margin-top:0px; margin-bottom:0px;"
false="margin-top:2px; margin-bottom:2px;" />
versus <g:inline> versus <g:call> <g:insert>
Esta página fornece uma explicação comparativa de três marcadores: <g:insert>, <g:inline> e <g:call>.
<g:insert>
O <g:insert> marcador Jelly insere um arquivo Jelly no seu Jelly em um novo contexto. Isso significa que você não pode acessar as variáveis estabelecidas anteriormente no Jelly.
<g:insert template="get_target_form_function.xml" />
<g:inline>
O <g:inline> marcador Jelly insere um arquivo Jelly no seu Jelly no mesmo contexto. Isso significa que o Jelly inserido pode acessar as variáveis que você estabeleceu anteriormente e pode mudar os valores dessas variáveis.
<g:inline template="element_default.xml" />
<g:call>
Para melhor encapsulamento, o marcador <g:call> pode ser usado. Sua função só terá acesso aos valores passados para ela. Após uma chamada, o contexto Jelly terá a aparência igual a antes da chamada. Isso significa que você não pode definir uma variável global aqui e lê-la mais tarde. Isso também significa que você não pode definir erroneamente uma variável global chamada "jvar_temp" e substituir uma variável da qual outra pessoa dependia.
A aprovação de valores, se necessário, é feita explicitamente, incluindo o nome do parâmetro na linha <g:call> seguido pelo sinal de igual seguido pelo valor entre aspas:
<g:call function="collapsing_image.xml" id="${jvar_section_id}" image="$[jvar_cimg]"
first_section_id="${jvar_first_section_id}" image_alt="${jvar_cimg_alt}"/>
Se os valores forem passados e você quiser ter padrões ou parâmetros obrigatórios, o Jelly referenciado na função deverá incluir uma linha para declarar se os parâmetros são obrigatórios ou têm um valor padrão:
<g:function id="REQUIRED" image="REQUIRED" image_prefix="" image_alt="REQUIRED"/>
O exemplo acima indica que 3 dos parâmetros são obrigatórios e um parâmetro é opção com um valor padrão em branco. Se você não estiver passando valores ou se quiser ter valores padrão ou obrigatórios, não será necessário incluir a linha <g:function>. No entanto, em geral, convém incluir uma linha de <g:function>.
O valor pode ser referenciado em seu modelo anexando o prefixo "jvar_" ao nome do parâmetro:
<img id="img.${jvar_id}" src="images/${jvar_image}" alt="${jvar_image_alt}" onclick="toggleSectionDisplay('${jvar_id}', '${jvar_image_prefix}','${jvar_first_section_id}');"/>
Para o <g:call>, os parâmetros também podem ser passados implicitamente como uma lista de variáveis nomeadas em um parâmetro "argumentos":
<g:call function="item_link_default.xml" arguments="sysparm_view,ref_parent,jvar_target_text"/>
Como uma alternativa para passar variáveis para a função por meio de argumentos de marcador separados, é possível passar uma lista de variáveis em um único argumento "argumentos". Todas as variáveis identificadas por nome (separadas por vírgulas) em argumentos parâmetros são reintroduzidos na função com exatamente o mesmo nome (por exemplo, dentro do modelo de função, temos variáveis sysparm_view, ref_parent e jvar_target_text disponíveis para nós).
O modelo de função pode retornar um valor para o modelo de chamada usando retorno atributo. Na função jvar_answer a variável define o valor de retorno.
<g:call function="item_body_cell_calc_style.xml" arguments="jvar_type" return="jvar_style"/>
<g:evaluate>
O marcador <g:evaluate> é usado para avaliar uma expressão escrita em Rhino JavaScript e, às vezes, para definir uma variável para o valor da expressão.
A última declaração na expressão é o valor que a variável conterá.
<g2:evaluate var="jvar_page" jelly="true">
var page = "";
var pageTitle = "";
var pageGR = new GlideRecord("cmn_schedule_page");
pageGR.addQuery("type", jelly.jvar_type");
pageGR.query();
if (pageGR.next()) {
page = pageGR.getValue("sys_id");
pageTitle = pageGR.getDisplayValue();
}
page;
</g2:evaluate>
<g2:evaluate var="not_important" expression="sc_req_item.popCurrent()"/>
"verdadeiro"
Se você quiser que o Evaluate retorne um objeto (por exemplo, uma matriz), use o argumento object "true".
<g2:evaluate object="true" var="jvar_items" expression="SncRelationships.getCMDBViews()" />
jelly: "verdadeiro"
Se você quiser acessar variáveis do Jelly dentro de uma avaliação, inclua jelly Antes do nome da variável Jelly. Por exemplo, para acessar GlideJellyContext:
<g2:evaluate var="jvar_row_no" jelly="true">
var gf = jelly.context.getGlideForm();
var row = gf.getRowNumber();
row;
</g2:evaluate>
Outro exemplo de acesso a um jvar usando o parâmetro Jelly O valor de jvar_h foi definido anteriormente e podemos acessá-lo dentro de avaliar :
$[NLBR:jvar_h.getHTMLValue('newvalue')]
<g2:evaluate var="jvar_fix_escaping" jelly="true">
var auditValue = jelly.jvar_h.getHTMLValue('newvalue');
gs.log("************ " + auditValue);
</g2:evaluate>
"True"
Se você tiver a necessidade de pegar os resultados de uma avaliação que ocorre na fase 1 e propagá-la para a fase 2, use copyTophase2 Há alguma proteção para escapar neste uso. Por exemplo:
<g:evaluate var="jvar_has_special_inc" copyToPhase2="true">
var specialInc = gs.tableExists("special_incident");
specialInc;
</g:evaluate>
$[jvar_has_special_inc]
Se você não precisa avaliar algo, você pode fazer isso mais diretamente. Cuidado com os problemas de escape aqui (aspas duplas em jvar_rows causariam um problema no exemplo):
<j2:set var="jvar_rows" value="${jvar_rows}"/>
<g:breakpoint/>
Este marcador pode ser usado para exibir as variáveis atuais do Jelly e seus valores no log.
Certifique-se de remover este marcador antes de ir para a produção.
<g:ui_form/>
Este marcador define um formulário na página de IU.
Por exemplo, se o seu formulário continha application_sys_id g:ui_form pode se beneficiar de um script de processamento.
<g:ui_form>
<p>Click OK to run the processing script.</p>
<g:dialog_buttons_ok_cancel ok="return true" />
<input type="hidden" name="application_sys_id" value="499836460a0a0b1700003e7ad950b5da"/>
</g:ui_form>
Para obter mais informações, consulte Macros de IU.
<g:ui_input_field />
Este marcador adiciona uma referência a uma macro de IU que cria um campo de entrada em uma página que permite que os usuários insiram informações. . iu_input_field Passa um rótulo, nome, valor e tamanho para a macro de IU.
<g:ui_input_field label="sys_id" name="sysid" value="9d385017c611228701d22104cc95c371" size="50"/>Para obter mais informações, consulte Macros de IU.
<g:ui_checkbox/>
Este marcador coloca uma marca de seleção editável pelo usuário em uma página. O nome e o valor são passados para a macro de IU.
Este é um exemplo de uma tabela em uma página de IU:
<table>
<tr>
<td nowrap="true">
<label>Time Card Active:</label>
</td>
<td>
<g:ui_checkbox name="timecard_active" value="${sysparm_timecard_active}"/>
</td>
</tr>
</table>
Para obter mais informações, consulte Macros de IU.
<g:dialog_buttons_ok_cancel/>
Este marcador coloca botões na página de IU que executam um script de processamento especificado se o marcador retornar verdadeiro.
Se sua página de IU contiver um formulário (usa o marcador <g:form>), você poderá enviar o formulário e executar o Script de processamento. O Script de processamento pode acessar naturalmente os campos no formulário. Por exemplo, se o formulário continha o campo application_sys_id:
<g:ui_form>
<p>Click OK to run the processing script.</p>
<g:dialog_buttons_ok_cancel ok="return true" />
<input type="hidden" name="application_sys_id" value="499836460a0a0b1700003e7ad950b5da"/>
</g:ui_form>
<g:ui_reference/>
Este marcador adiciona uma referência a uma página que pode ser referenciada por um Script de processamento.
O exemplo a seguir cria uma referência definida por parâmetros de nome, ID e tabela no marcador:
<g:ui_reference name="QUERY:active=true^roles=itil" id="assigned_to" table="sys_user" />
Em seguida, no Script de processamento, faça referência ao campo de nome da seguinte forma:
newTask.assigned_to = request.getParameter("QUERY:active=true^roles=itil");
<g:ui_reference name="parent_id" id="parent_id" table="pm_project" query="active=true" completer="AJAXTableCompleter"
columns="project_manager;short_description"/>
E comercial
Ampersands no Jelly pode causar-lhe tristeza porque Jelly é XML.
Usar (AMP) Para inserir um e comercial no Jelly. Se você estiver escrevendo JavaScript que aparece na parte HTML de uma página de IU ou macro de IU que realmente será executada no navegador, é melhor colocar esse código no campo "client script" e dessa forma você pode evitar problemas de escape. No entanto, se você realmente precisar colocá-lo no campo "html", você precisará fazer algo assim:
ta = ta[1].split('$[AMP]');
E
Usar E Para inserir um JavaScript e no Jelly.
Por exemplo:
if (d ${AND} e)
var color = d.value;
Em um teste Jelly você usaria && . Por exemplo:
<j:if test="${jvar_form_name == 'sys_form_template' && !RP.isDialog()}">
Menos de
Sinais menores que (""") também podem causar problemas devido ao Jelly ser XML. Isso pode ser resolvido revertendo o teste para que não seja necessário ou usando E no lugar do sinal menor que.
<g2:evaluate var="jvar_text">
var days = "";
var selectedDays = '$[${ref}]';
for (var i = 1; i ${AMP}lt;= 7; i++) {
if (selectedDays.indexOf(i.toString()) >= 0) {
days += gs.getMessage("dow" + i);
days += " ";
}
}
days;
</g2:evaluate>
Muitas vezes, você pode evitar o operador "menor que" usando apenas "não igual", que não tem problemas de escape. Por exemplo:
for (var i=0; i != ta.length; i++) {
}
Espaço em branco
Normalmente, o espaço em branco é removido pelo Jelly. Para mantê-lo, você deve especificar que ele não será cortado.
Por exemplo, o seguinte mantém o espaço após os dois pontos.
<j2:whitespace trim="false">${gs.getMessage('Did you mean')}: </j2:whitespace>
Espaços
Para codificar um espaço não separável ( ), você pode usar [SP] .
Por exemplo:
<span id="gsft_domain" style="display: inline">
${gs.getMessage('Domain')}:$[SP]
<span id="domainDD" class="drop_down_element" style="text-decoration: none; color: white">
${gs.getMessage("Loading...")}
</span>
</span>
Rastreamento Jelly
ServiceNow Tem um recurso que permite que a avaliação do Jelly seja rastreada.
O rastreamento é enviado para o log. Isso só deve ser ativado durante a depuração, pois isso produz muito registro em log. Para ativar o rastreamento, defina a propriedade glide.ui.template.trace como verdadeira. Por exemplo, o script a seguir pode ser executado para fazer isso:
GlideProperties.set ( 'glide.ui.template.trace' , true ) ;
Se você quiser ver suas entradas de log no navegador da Web na parte inferior de cada página, navegue até .