Rozwijanie makra w zapytaniach dotyczących listy zawartości

W zapytaniach dotyczących listy zawartości można — aby wyświetlać ostatnio zaktualizowaną zawartość — definiować wartości właściwości, które są obliczane, gdy strona jest uruchamiana.

Większość właściwości składników serwisu jest statyczna. Użytkownik wybiera lub wprowadza ustaloną wartość dla jednej z właściwości składnika i wartość ta nie ulega zmianie bez względu na to, czy strona jest czy nie jest uruchomiona. Można jednak zdefiniować wartości właściwości, które to wartości są obliczane, gdy strona jest uruchamiana. Jest to przydatne do wyświetlania — w zapytaniach dotyczących zawartości — zawartości, która ostatnio została zaktualizowana. Użytkownicy mogą wówczas wprowadzać takie daty, jak "w ostatnich 3 dniach".

Rozszerzenie Mustache JS można wstawiać w wielu właściwościach. Wartości, do których występują odwołania, są wyprowadzane z modelu, który jest wykonywany w chwili uruchomienia strony. Gotowy do użycia model obsługuje daty sformatowane dla wywołań Content REST API. Model ten można rozbudować o dodatkowe wartości, tak aby spełniał specyficzne wymagania użytkowników.

Na przykład wartość napisowa, którą można wprowadzić dla właściwości, może mieć postać:

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

Ten odnoszący się do daty wpis Mustache będzie obliczany w trybie wykonawczym, a zatem zwracana wartość będzie się zmieniać w zależności od tego, kiedy nastąpiło uruchomienie (rozwija się do postaci updatedDate gt "2220181002060000000"). W ten sposób użytkownik może skonstruować dowolną złożoną wartość napisową daty bez konieczności wprowadzania predefiniowanej wartości.

Obsługujące właściwości składników

Następujące właściwości obsługują składnię szablonu Mustache JS:

  • Lista zawartości

    • Dodatkowy napis-zapytanie

    • Na przykład: updatedDate gt "{{#content.date}}today - 3 days{{/content.date}}"

  • Tytuł/akapit/tekst

    • Formatowany tekst wprowadzany za pomocą edytora CKEditor

    • Na przykład: "Format Content REST API dla daty: {{#content.date}}now{{/content.date}}"

Uwaga:

Bez własnego modelu dla szablonu Mustache, rozwijanie w tytułach/akapitach/tekście jest mało przydatne. Jest jednak bardzo przydatne do weryfikowania, czy to, co zostało wprowadzone w dodatkowym napisie-zapytaniu, będzie obliczane przy przełączaniu między trybem edycji a trybem widoku i czy będzie od razu widoczne.

Obsługiwana składnia składników

Obiekt content.date jest od razu obsługiwany. Przyjmuje dwa główne parametry: today i now.

Wartość today przyjmuje bieżącą datę i godzinę z przeglądarki, przekształca tę wartość na dzisiejszą północ, a następnie tę wartość przekształca w godzinę UTC.

  • {{#content.date}}today{{/content.date}} rozwija wartość z przeglądarki z dzisiejszą północ przekształconą w wartość UTC i sformatowaną do formatu daty Content REST API. Na przykład:

    2220181008065959999
  • Następnie wartość tę można powiększyć o:

    today +/-  [day | week | month | year]
  • Wartość today zachowuje się inaczej, gdy dni są do niej dodawane lub są od niej odejmowane. Jeśli dni są odejmowane, jest używana godzina poranna. Jeśli dni są dodawane, jest używana godzina o północy. Na przykład:

    • {{#content.date}}today - 1 day{{/content.date}} rozwija się na "wczoraj, na początku dnia".

    • {{#content.date}}today + 2 days{{/content.date}} rozwija się na "pojutrze o północy".

Wartość now przyjmuje bieżącą datę i godzinę z przeglądarki i przekształca ją w godzinę UTC bez żadnych dostosowań.

  • {{#content.date}}now{{/content.date}} rozwija bieżącą datę i godzinę z przeglądarki w wartość UTC sformatowaną do formatu daty Content REST API.

  • now można także uzupełnić o hour. Można użyć:

    now +/-  [hour | day | week | month | year]
  • Na przykład:
    • {{#content.date}}now + 2 hours{{/content.date}} — dwie godziny od teraz przekształcone w wartość UTC sformatowaną do formatu daty Content REST API.

    • {{#content.date}}now - 1 day{{/content.date}} — wczoraj o teraźniejszej godzinie z przeglądarki przekształcone w wartość UTC sformatowaną do formatu daty Content REST API.

Korzystanie z obsługiwanej składni składników

Aby użyć rozwijania makra w dodatkowym napisie-zapytaniu i na przykład uzyskać wszystko z ostatnich trzech tygodni, można by użyć:

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

Aby zwrócona data działała w wywołaniu Content REST API, są do niej — gdy jest konstruowany napis-zapytanie — dodawane znaki cudzysłowu, tak jak miałoby to miejsce podczas wprowadzania wartości statycznej.

MustacheJS

Składnia szablonów Mustache JS jest opisana na stronie "mustache.github.io/mustache.5.html".

W instancji Mustache, uruchamianej w celu rozwijania wartości napisowych, trzeba dokonać jednej zmiany. Mustache udostępnia rozwinięcie text, w którym są używane {{ }}, oraz rozwinięcie html, w którym są używane {{{ }}}. Różnica między nimi polega na tym, że rozwinięcie "text" nie wprowadza kodowania HTML; oznacza to, że jeśli wartość jest rozwijana do a < b, to wynikiem będzie a &lt; b. To nie jest oczekiwane podczas konstruowania napisów tworzących adresy URL. Można by poinformować użytkownika o konieczność stosowania rozwijania HTML, lecz zwiększyłoby to nakłady pracy i stworzyłoby dodatkowe problemy, takie jak wyjaśnienie, dlaczego trzeba używać znaków {{{ }}}.

Aby tego uniknąć Mustache skonfigurowano tak, aby nie modyfikował wartości, gdy są używane {{ }}. Oznacza to, że {{ }} i {{{ }}} działają identycznie. Wskutek tego może być wymagane dodatkowe kodowanie przez użytkownika.

Gotowy (standardowy) model Mustache

Do szablonu, aby nastąpiło rozwinięcie, trzeba zastosować model Mustache. W poprzednim przykładzie obiekt {{#content.date}} jest od razu zdefiniowany, podczas gdy może okazać się konieczne dodanie — przez programistę — nowego obiektu, takiego jak {{person}}. Jeśli użytkownik wprowadzi w szablonie Mustache wartość, której nie ma w modelu, to wynikiem będzie napis pusty. A zatem, jeśli programista nie doda obiektu person do modelu, to Hello {{person}} rozwinie się do samego Hello .

Obiekt "model" jest używany jako obiekt globalny o nazwie SCSMacros. Programista może dodawać do tego obiektu dowolne wpisy. Obiekt zostanie przekazany do systemu Mustache podczas przetwarzania szablonu.

Obecnie przez gotowy obiekt "model" jest obsługiwany tylko obiekt content.date:

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

Niestandardowy model Mustache

Programista może wprowadzić dodatkowe obsługiwane obiekty, zgodnie z wymaganiami. Na przykład może wprowadzić obiekt lastTwoDays i uprościć rozwijanie przez tylko {{lastTwoDays}}.

Chcąc rozszerzyć model, tak aby obsługiwał na przykład Hello {{person}} z poprzedniego przykładu, należy dodać do SCSMacros obiekt person. Trzeba to zrobić przed uruchomieniem strony. Można to zrobić z układu strony, dodając na jego początku znacznik "script". Na przykład:

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

Gdy zmiana ta zostanie dokonana, Hello {{person}} rozwinie się do Hello World.

Zamierzając przekazywać wartości do obiektu (na przykład Hello {{#person}}personId{{/person}}), trzeba zaimplementować interfejs mustache lambda, a następnie izolować i rozwijać wartość w obrębie tej implementacji.

Na przykład:

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

Gdy zmiana ta zostanie dokonana, szablon Hello {{#person}}111{{/person}} rozwinie się do Hello Small, a Hello {{#person}}222{{/person}} — do Hello Big.

Uwaga:

Rozwijanie Mustache jest wykonywane synchronicznie. Jeśli trzeba pobierać wartości asynchroniczne, należy je ustalać w obrębie modelu jeszcze przed próbą wykonania rozwinięcia Mustache, a to jeszcze nie jest obecnie obsługiwane, aczkolwiek są możliwe implementacje opracowywane na zamówienie.