Udvide makroer i indholdslisteforespørgsler

I en indholdslisteforespørgsel kan du definere værdier for egenskaber, der beregnes, når en side køres, for at vise indhold, der er blevet opdateret for nylig.

De fleste egenskaber for komponenter på sites er statiske. Brugeren vælger eller indtaster en fast streng eller værdi for en af komponentens egenskaber, og den ændres ikke, uanset hvornår eller hvor siden køres. Du kan imidlertid definere værdier for egenskaber, der beregnes, når siden køres. Dette er nyttigt til visning af indhold, der er blevet opdateret for nylig i indholdsforespørgsler. Brugerne kan indtaste datoer, for eksempel "de sidste 3 dage".

Du kan indsætte en Mustache JS-udvidelse i flere egenskaber. De værdier, der refereres til i disse strenge, er afledt af en model, som udføres, når siden køres. En foruddefineret model håndterer data, der er formateret til indholds-REST-API-kald. Du kan udvide denne model med yderligere værdier for at opfylde eventuelle brugerkrav.

Nedenfor ses et eksempel på den streng, som du kan indtaste for en egenskab:

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

Denne Mustache-datopost evalueres under runtime, så den returnerede værdi ændres, afhængigt af det tidspunkt den køres på (det vil sige, at den udvides til updatedDate gt "2220181002060000000"). På den måde kan brugeren opbygge en hvilken som helst kompleks datostreng i stedet for at skulle indtaste en foruddefineret værdi.

Understøttede komponentegenskaber

Følgende egenskaber understøtter Mustache JS-skabelonsyntaks:

  • Indholdsliste

    • Yderligere forespørgselsstreng

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

  • Titel/afsnit/tekst

    • Rich Text, der indtastes via CKEditor

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

Bemærk:

Hvis der ikke er en tilpasset model til Mustache-skabelonen, er udvidelsen i Titel/afsnit/tekst ikke særlig nyttig. Den er imidlertid meget nyttig til validering af det, som du indtaster i Yderligere forespørgselsstreng, fordi den evalueres, mens du skifter mellem redigering og visning og bliver synlig med det samme.

Understøttet komponentsyntaks

Objektet content.date understøttes som standard. Det tager to hovedparametre, today og now.

Værdien today tager det aktuelle browserklokkeslæt, konverterer det til midnat i aften og konverterer derefter den pågældende værdi til UTC-tid.

  • {{#content.date}}today{{/content.date}} udvides til browserværdien for midnat i aften, konverteret til UTC-værdien og formateret til indholds-REST-API'ens datoformat. Eksempel:

    2220181008065959999
  • Den kan derefter forstærkes med:

    today +/-  [day | week | month | year]
  • Værdien today fungerer også anderledes, efterhånden som du føjer noget til eller trækker noget fra den. Hvis du trækker noget fra den, bruger den klokkeslættet om morgenen. Hvis du lægger noget til den, bruger den klokkeslættet ved midnat. Eksempel:

    • {{#content.date}}today - 1 day{{/content.date}} udvides til i går ved dagens start.

    • {{#content.date}}today + 2 days{{/content.date}} udvides til i overmorgen ved midnat.

Værdien now tager det aktuelle browserklokkeslæt og konverterer det til UTC-tid uden nogen reguleringer.

  • {{#content.date}}now{{/content.date}} udvides til det aktuelle browserklokkeslæt konverteret til UTC-værdien og formateret til indholds-REST-API'ens datoformat.

  • now kan også forstærkes med hour. Det vil sige, at du har:

    now +/-  [hour | day | week | month | year]
  • Eksempel:
    • {{#content.date}}now + 2 hours{{/content.date}} - to timer fra det aktuelle tidspunkt konverteret til UTC-tid, der er formateret i indholds-REST-API'ens datoformat

    • {{#content.date}}now - 1 day{{/content.date}} - i går på dette browserklokkeslæt konverteret til UTC-tid formateret til indholds-REST-API'ens datoformat

Bruge den understøttede komponentsyntaks

Hvis du skulle bruge makroudvidelsen i den ekstra forespørgselsstreng til for eksempel at returnere alt i de sidste 3 uger, skulle du indtaste følgende:

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

Kun datoen returneres, så for at du kan arbejde med indholds-REST-API-kaldet, tilføjes der anførselstegn, når du opretter forespørgselsstrengen, på samme måde som hvis du indtastede en statisk værdi.

MustacheJS

Se syntaksen på Mustache JS-skabelonsiderne på mustache.github.io/mustache.5.html.

Der er foretaget én ændring af den Mustache-instans, der køres under udvidelsen af strenge. Mustache omfatter både en text-udvidelse, der bruger {{ }}, og en html-udvidelse, der bruger {{{ }}}. Forskellen mellem disse to er, at tekstudvidelsen udfører en HTML-kodning af strengen, hvilket vil sige, at hvis værdien blev udvidet til a < b, ville resultatet være a &lt; b. Dette er ikke, hvad du ønsker ved oprettelsen af strenge til URL'er. Du kunne bede brugeren om at bruge HTML-udvidelsen, men det er blot ekstraarbejde, der genererer flere problemer, for eksempel en forklaring af, hvorfor de skal bruge {{{ }}}.

For at undgå dette er Mustache konfigureret, så der ikke udføres escape af værdier, når {{ }} bruges. Det betyder, at {{ }} og {{{ }}} fungerer på samme måde. Dette gør også kodningen af et resultat til en øvelse for brugeren, hvis det er påkrævet.

OOTB Mustache-modellen

Mustache kræver, at der anvendes en model på skabelonen ved udvidelse. I det foregående eksempel er {{#content.date}} allerede defineret på forhånd, hvorimod udvikleren kan tilføje den nye egenskab, for eksempel {{person}}. Hvis brugeren indtaster en værdi i Mustache-skabelonen, der ikke findes i modellen, resulterer det i en tom streng. Så ved angivelse af Hello {{person}} ville strengen udvides til blot Hello , medmindre udvikleren føjer person til modellen.

Det brugte modelobjekt er et globalt objekt med navnet SCSMacros. Udvikleren har frihed til at føje eventuelle yderligere poster til dette objekt. Objektet videregives til Mustache, når skabelonen er evalueret.

Det foruddefinerede modelobjekt understøtter p.t. kun objektet content.date:

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

Tilpasset Mustache-model

De understøttede objekter kan forbedres af udvikleren på basis af deres krav. Det betyder, at de kan introducere et lastTwoDays-objekt og forenkle udvidelsen til blot {{lastTwoDays}}.

Hvis du vil udvide modellen, så den for eksempel understøtter Hello {{person}} i det foregående eksempel, skal du føje objektet person til SCSMacros. Du skal gøre dette, før siden køres. Det kan du gøre i sidelayoutet ved at føje et script-tag til starten af det. Eksempel:

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

Efter at denne ændring er foretaget, udvides skabelonen Hello {{person}} til: Hello World.

Hvis du vil videregive værdier til objektet (for eksempel Hello {{#person}}personId{{/person}}), skal du implementere en mustache lambda og ombryde og udvide værdien i implementeringen.

Eksempel:

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

Efter at denne ændring er foretaget, udvides skabelonen Hello {{#person}}111{{/person}} til Hello Small, og skabelonen Hello {{#person}}222{{/person}} udvides til Hello Big.

Bemærk:

Mustache-udvidelser udføres synkront. Hvis du skal hente asynkrone værdier, skal disse fortolkes i modellen, før du forsøger at udføre Mustache-udvidelsen, og dette understøttes p.t. ikke, selvom skræddersyede implementeringer er mulige.