Разворачивание макросов в запросах списков содержимого

В запросе списка контента можно определить значения свойств, которые вычисляются при обработке страницы для отображения недавно обновленного контента.

Большинство свойств компонентов в пределах сайтов статично. Пользователи выбирают или вводят фиксированную строку или значение для одного из свойств компонента, и оно не зависит от времени или места обработки страницы. Однако можно определить значения свойств, которые вычисляются при обработке страницы. Это полезно для отображения контента, который недавно обновлялся в результате выполнения запросов контента. Пользователи могут вводить даты, например "за последние 3 дня".

Для нескольких свойств можно вставить расширение Mustache JS. Значения, на которые ссылаются эти строки, выводятся из модели, которая выполняется при обработке страницы. Готовая модель обрабатывает даты, отформатированные для вызовов API-интерфейса Content REST. Эту модель можно расширить, добавив дополнительные значения в соответствии с требованиями пользователей.

Пример строки, которую можно ввести для свойства:

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

Эта запись Mustache для даты будет оцениваться во время выполнения, чтобы возвращаемое значение изменялось в зависимости от времени выполнения (то есть, разворачивается до updatedDate gt "2220181002060000000"). Таким образом пользователь может создать любую сложную строку даты, не вводя заранее определенное значение.

Поддерживаемые свойства компонентов

Следующие свойства поддерживают синтаксис шаблона Mustache JS:

  • Список содержимого

    • Дополнительная строка запроса

    • Например: updatedDate gt "{{#content.date}}today - 3 days{{/content.date}}"

  • Заголовок, абзац, текст

    • RTF, введенный с помощью CKEditor

    • Например: "Content REST API format for date: {{#content.date}}now{{/content.date}}"

Примечание.:

Без пользовательской модели для шаблона Mustache расширение из раздела "Заголовок, абзац, текст" не очень полезно. Тем не менее, очень полезно проверить данные, вводимые в строке дополнительного запроса, так как они оцениваются при переключении между редактированием и просмотром и сразу же становятся видимыми.

Поддерживаемый синтаксис компонентов

Объект content.date поддерживается без предварительной настройки. Для этого требуются два основных параметра: today и now.

Значение today принимает текущее время браузера, преобразует его в полночь сегодня, а затем преобразует полученное значение во время UTC.

  • {{#content.date}}today{{/content.date}} распространяется до значения браузера в полночь сегодня, преобразованного в значение UTC в формате даты API-интерфейса Content REST. Пример:

    2220181008065959999
  • Затем его можно дополнить:

    today +/-  [day | week | month | year]
  • Значение today также ведет себя по-разному при добавлении к нему или вычитании из него. При вычитании из него используется утреннее время. При добавлении к нему используется время в полночь. Пример:

    • {{#content.date}}today - 1 day{{/content.date}} распространяется до вчерашнего дня в начале суток.

    • {{#content.date}}today + 2 days{{/content.date}} распространяется до послезавтра в полночь.

Значение now принимает текущее время браузера и преобразует его во время UTC без каких-либо изменений.

  • {{#content.date}}now{{/content.date}} распространяется до текущего времени браузера, преобразованного в значение UTC в формате даты API-интерфейса Content REST.

  • now можно дополнять параметром hour. Итак, получаем следующее:

    now +/-  [hour | day | week | month | year]
  • Пример:
    • {{#content.date}}now + 2 hours{{/content.date}} — значение "через два часа от текущего момента", преобразованное во время UTC в формате даты API-интерфейса Content REST

    • {{#content.date}}now - 1 day{{/content.date}} - значение "вчера в это время браузера", преобразованное во время UTC в формате даты API-интерфейса Content REST

Использование поддерживаемого синтаксиса компонентов

Предположим, что требуется вернуть все за последние 3 недели. Чтобы использовать расширение макроса в дополнительной строке запроса, необходимо ввести следующее:

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

Возвращается только дата, поэтому для работы с вызовом API-интерфейса Content REST при построении строки запроса добавляются кавычки, как при вводе статического значения.

MustacheJS

Синтаксис описывается на страницах с шаблонами Mustache JS по адресу mustache.github.io/mustache.5.html.

Было внесено одно изменение в экземпляр Mustache, который выполняется при расширении строк. Mustache предоставляет расширение text, использующее формат {{ }}, и расширение html, формат {{{ }}}. Разница между этими двумя выражениями заключается в том, что расширение "text" кодирует строку в формате HTML; то есть, если значение развернуто до a < b, результатом будет a &lt; b. Это не те строки, которые хотелось бы построить для URL-адресов. Вы могли бы посоветовать пользователю использовать расширение HTML, но это ведет лишь к непроизводительным издержкам и появлению дополнительных проблем, таких как объяснение того, почему необходимо использовать формат {{{ }}}.

Чтобы избежать этого, модуль Mustache был настроен таким образом, чтобы не избегать значений при использовании формата {{ }}. Это означает, что выражения {{ }} и {{{ }}} ведут себя одинаково. При таком подходе при необходимости кодирование результатов остается пользователям в качестве упражнения.

Модель OOTB Mustache

Для расширения Mustache требуется применить модель к шаблону. В предыдущем примере выражение {{#content.date}} уже задано, а разработчик может добавить новое свойство, например {{person}}. Если пользователь вводит в шаблоне Mustache значение, которого нет в модели, в результате получается пустая строка. Таким образом, в случае выражения Hello {{person}} оно разворачивается просто до Hello, если разработчик не добавит в модель объект person.

Используемый объект модели представляет собой глобальный объект, вызываемый SCSMacros. Разработчик может добавлять в этот объект любые дополнительные записи. При оценке шаблона объект передается модулю Mustache.

Готовый объект модели в настоящее время поддерживает только объект content.date:

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

Пользовательская модель Mustache

Поддерживаемые объекты могут быть улучшены разработчиками в соответствии со своими требованиями. Таким образом, они могут ввести объект lastTwoDays и упростить расширение просто до выражения {{lastTwoDays}}.

Чтобы расширить модель для поддержки объекта, аналогичного Hello {{person}}, в предыдущем примере потребовалось бы добавить в SCSMacros объект person. Это необходимо сделать до обработки страницы. Это можно сделать в макете страницы, добавив тег сценария в его начало. Пример:

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

После внесения этого изменения шаблон Hello {{person}} разворачивается до Hello World.

Если требуется передать значения данному объекту (например, Hello {{#person}}personId{{/person}}), необходимо реализовать mustache lambda, а также перенести и развернуть значение в данной реализации.

Пример:

<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>

После внесения этого изменения шаблон Hello {{#person}}111{{/person}} был бы развернут до Hello Small, а шаблон Hello {{#person}}222{{/person}} — до Hello Big.

Примечание.:

Расширение Mustache выполняется синхронно. Если требуется извлечь асинхронные значения, их необходимо разрешить в модели перед попыткой выполнения расширения mustache. В настоящее время это не поддерживается, хотя возможны специальные варианты реализации.