Expandir Macros em Consultas de Lista de Conteúdo

Numa consulta de lista de conteúdos, pode definir valores de propriedades que sejam calculados quando uma página for executada, para apresentar o conteúdo atualizado recentemente.

A maioria das propriedades dos componentes nos sites são estáticas. O utilizador seleciona ou introduz uma cadeia de caracteres ou um valor fixo para uma das propriedades do componente e essa entrada não é alterada qualquer que seja o momento ou local de execução da página. No entanto, pode definir valores de propriedades que sejam calculados quando a página for executada. Isto é útil para apresentar o conteúdo que foi atualizado recentemente nas consultas de conteúdo. Os utilizadores podem introduzir datas, como "nos últimos 3 dias".

Pode inserir uma expansão Mustache JS para várias propriedades. Os valores referenciados nestas cadeias de caracteres provêm de um modelo executado quando a página é executada. Um modelo pronto a utilizar processa as datas formatadas para as chamadas da API REST de Conteúdo. Pode alargar este modelo com valores adicionais de acordo com quaisquer requisitos do utilizador.

Segue-se um exemplo de uma cadeia de caracteres que pode introduzir para uma propriedade:

Content List component:
      Additional Query String property:
             updatedDate gt "{{#content.date}}today - 3 days{{/content.date}}"

Esta entrada Mustache para a data será avaliada em runtime para que o valor devolvido seja alterado dependendo do momento da execução (isto é, expande-se para updatedDate gt "2220181002060000000"). Desta forma, o utilizador pode criar qualquer cadeia de caracteres de data complexa, em vez de ter de introduzir um valor predefinido.

Propriedades de Componentes Suportadas

As propriedades seguintes suportam a sintaxe de modelo Mustache JS:

  • Lista de Conteúdo

    • Cadeia de Caracteres de Consulta Adicional

    • Por exemplo: updatedDate gt "{{#content.date}}today - 3 days{{/content.date}}"

  • Título/Parágrafo/Texto

    • RTF introduzido via CKEditor

    • Por exemplo: "Content REST API format for date: {{#content.date}}now{{/content.date}}"

Nota:

Sem um modelo customizado para o modelo Mustache, a expansão em Título/Parágrafo/Texto não é muito útil. Contudo, é muito útil para validar o que introduzir na Cadeia de Caracteres de Consulta Adicional porque será avaliado ao alternar entre a edição e a visualização, ficando imediatamente visível.

Sintaxe de Componentes Suportada

O objeto content.date é suportado conforme predefinido. Este assume dois parâmetros principais, today e now.

O valor today assume a hora atual do browser, converte-a para a meia-noite de hoje e, em seguida, converte esse valor para uma hora UTC.

  • {{#content.date}}today{{/content.date}} expande-se para o valor do browser de meia-noite de hoje, convertido para o valor UTC e com o formato de data da API REST de Conteúdo. Por exemplo:

    2220181008065959999
  • Depois, pode ser aumentado com:

    today +/-  [day | week | month | year]
  • O valor today também se comporta de modo diferente ao efetuar uma adição ou subtração do mesmo. Se subtrair do mesmo, será utilizada a hora da manhã. Se adicionar ao mesmo, será utilizada a hora da meia-noite. Por exemplo:

    • {{#content.date}}today - 1 day{{/content.date}} expande-se para ontem ao início do dia.

    • {{#content.date}}today + 2 days{{/content.date}} expande-se para depois de amanhã à meia-noite.

O valor now assume a hora atual do browser e converte-a para uma hora UTC sem qualquer ajustamento.

  • {{#content.date}}now{{/content.date}} expande-se para a hora atual do browser convertida para o valor UTC e com o formato de data da API REST de Conteúdo.

  • now também pode ser aumentado com hour. Assim, tem:

    now +/-  [hour | day | week | month | year]
  • Por exemplo:
    • {{#content.date}}now + 2 hours{{/content.date}} - duas horas a partir de agora, convertido para uma hora UTC no formato de data da API REST de Conteúdo

    • {{#content.date}}now - 1 day{{/content.date}} - ontem a esta hora do browser, convertida para uma hora UTC no formato de data da API REST de Conteúdo

Utilizar a Sintaxe de Componentes Suportada

Para utilizar a expansão de macros na cadeia de caracteres de consulta adicional, supondo que pretende devolver tudo relativamente às últimas 3 semanas, deve introduzir o seguinte:

updatedDate gt "{{#code.date}}today - 3 weeks{{/code.date}}"

Só a data é devolvida e, por isso, para trabalhar na chamada da API REST de Conteúdo, são acrescentadas aspas quando constrói a cadeia de caracteres de consulta, como faria ao introduzir um valor estático.

MustacheJS

Para a sintaxe, consulte as páginas de modelos Mustache JS em mustache.github.io/mustache.5.html.

Foi feita uma alteração à instância do Mustache que é executada ao expandir cadeias de caracteres. O Mustache fornece uma expansão text que utiliza {{ }} e uma expansão html que utiliza {{{ }}}. A diferença entre as duas é que a expansão text efetua uma codificação HTML na cadeia de caracteres; isto é, se o valor for expandido para a < b, o resultado será a &lt; b. Não é isto que pretende para criar cadeias de caracteres para URLs. Pode dizer ao utilizador para utilizar a expansão HTML, mas é apenas uma sobrecarga e irá gerar mais problemas, como explicar por que motivo é necessário utilizar {{{ }}}.

Para evitar esta situação, o Mustache foi configurado de modo a não identificar valores com caracteres de escape ao utilizar {{ }}. Isto significa que {{ }} e {{{ }}} têm ambos o mesmo comportamento. Isto também deixa a codificação de qualquer resultado como um exercício para o utilizador, se for necessário.

O Modelo Mustache OOTB

O Mustache requer a aplicação de um modelo ao modelo base para expansão. No exemplo anterior, {{#content.date}} já está definido e pronto a utilizar, ao passo que uma nova propriedade, tal como {{person}}, pode ser acrescentada pelo programador. Se o utilizador introduzir um valor no modelo Mustache que não esteja no modelo, o resultado será uma cadeia de caracteres vazia. Assim, no caso de Hello {{person}}, será expandido para Hello apenas, a não ser que o programador acrescente person ao modelo.

O objeto do modelo utilizado é um objeto global chamado SCSMacros. O programador pode acrescentar quaisquer entradas adicionais neste objeto. O objeto será transmitido ao Mustache quando o modelo for avaliado.

O objeto do modelo pronto a utilizar atualmente só suporta o objeto content.date:

{   
   content: {
     date: <lambda implementation>
   }
}

Modelo Mustache Customizado

Os objetos suportados podem ser melhorados pelo programador com base nos respetivos requisitos. Assim, é possível introduzir um objeto lastTwoDays e simplificar a expansão para {{lastTwoDays}} apenas.

Para alargar o modelo de modo a suportar algo como Hello {{person}} no exemplo anterior, deverá acrescentar o objeto person a SCSMacros. Terá de o fazer antes de a página ser executada. Pode ser feito na disposição da página acrescentando um identificador script no início. Por exemplo:

<script type="text/javascript">
window.SCSMacros = window.SCSMacros || {};  // define/get the SCSMacros object
window.SCSMacros.person = "World";
</script>

Após efetuada esta alteração, o modelo Hello {{person}} será expandido para: Hello World.

Se pretender transmitir valores ao objeto (por exemplo, Hello {{#person}}personId{{/person}}), necessita de implementar um mustache lambda e incluir e expandir o valor na implementação.

Por exemplo:

<script type="text/javascript">
window.SCSMacros = window.SCSMacros || {};  // define/get the SCSMacros object
//implement "person" as a lambda
window.SCSMacros.person = function () {
  var people = { '111': { firstName: 'Small', lastName: 'World'}, '222': { firstName: 'Big', lastName: 'Universe'} };  
  return function (text, render) {     
     var expandedText = render(text);
     var chosenPerson = people[expandedText] || people['111'];      
     return chosenPerson.firstName;
  }
};
</script>

Após efetuada esta alteração, o modelo Hello {{#person}}111{{/person}} será expandido para Hello Small e o modelo Hello {{#person}}222{{/person}} será expandido para Hello Big.

Nota:

A expansão Mustache é executada de modo síncrono. Se precisar de obter valores assíncronos, estes terão de ser decifrados no modelo antes de tentar executar a expansão Mustache e isto não é suportado atualmente, embora sejam possíveis implementações personalizadas.