Expandera makron i frågor för innehållslista

I en innehållslistfråga kan du definiera värden för egenskaper som beräknas när en sida körs, för att visa innehåll som nyligen har uppdaterats.

De flesta egenskaper för komponenter på webbplatser är statiska. Användaren väljer eller anger en fast sträng eller ett fast värde för en av komponentens egenskaper, som inte ändras oavsett när eller var sidan körs. Du kan emellertid definiera värden för egenskaper som beräknas när sidan körs. Det här är användbart för visning av innehåll som nyligen har uppdaterats i innehållsfrågor. Användaren kan ange datum, t.ex. "under de senaste 3 dagarna".

Du kan infoga en Mustache JS-expansion till flera egenskaper. De värden som det refereras till i de här strängarna härleds från en modell som exekveras när sidan körs. En färdigkonfigurerad modell hanterar datum som formaterats för REST-API-anrop för innehåll. Du kan utöka den här modellen med fler värden för att uppfylla användarnas krav.

Här följer ett exempel på en sträng som du kan ange för en egenskap:

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

Den här Mustache-posten för datumet utvärderas vid exekveringen, så att det returnerade värdet ändras beroende på när körningen sker (dvs. expanderas till updatedDate gt "2220181002060000000"). På så sätt kan användaren bygga upp alla komplexa datumsträngar, snarare än att behöva ange ett fördefinierat värde.

Komponentegenskaper som stöds

Följande egenskaper stöder Mustache JS-mallsyntaxen:

  • Innehållslista

    • Extra frågesträng

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

  • Titel/stycke/text

    • Rik text angiven via CKEditor

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

Obs!:

Utan en anpassad modell för Mustache-mallen är expansionen i Titel/stycke/text inte särskilt användbar. Den är emellertid väldigt användbar för validering av det du anger i den extra frågesträngen eftersom den utvärderas när du växlar mellan redigering och visning och blir omedelbart synlig.

Komponentsyntax som stöds

Objektet content.date stöds som standard. Det här tar in två allmänna parametrar, today och now.

Värdet för today tar den aktuella webbläsartiden, konverterar den till midnatt i natt och konverterar sedan det värdet till UTC-tid.

  • {{#content.date}}today{{/content.date}} expanderas till webbläsarvärdet för midnatt i natt, konverterat till UTC-värdet och formaterat till datumformatet för REST-API för innehåll. Exempel:

    2220181008065959999
  • Det kan sedan förstärkas med:

    today +/-  [day | week | month | year]
  • Värdet för today fungerar även annorlunda när du adderar eller subtraherar från det. Om du subtraherar från det använder det tiden på morgonen. Om du adderar till den använder det tiden vid midnatt. Exempel:

    • {{#content.date}}today - 1 day{{/content.date}} expanderas till igår vid dagens början.

    • {{#content.date}}today + 2 days{{/content.date}} expanderas till i övermorgon vid midnatt.

Värdet för now tar den aktuella webbläsartiden och konverterar den till UTC-tid utan någon justering.

  • {{#content.date}}now{{/content.date}} expanderas till den aktuella webbläsartiden, konverterad till UTC-värdet och formaterad till datumformatet för REST-API för innehåll.

  • now kan även förstärkas med hour. Du har alltså:

    now +/-  [hour | day | week | month | year]
  • Exempel:
    • {{#content.date}}now + 2 hours{{/content.date}} – två timmar från nu konverterad till UTC-tid, formaterad till datumformatet för REST-API för innehåll.

    • {{#content.date}}now - 1 day{{/content.date}} – igår vid den här webbläsartiden, konverterad till UTC-tid, formaterad till datumformatet för REST-API för innehåll.

Använda komponentsyntax som stöds

Om du skulle vilja använda makroexpansionen i den extra frågesträngen, låt oss säga för att returnera allt inom de senaste 3 veckorna, skulle du ange följande:

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

Endast datumet returneras, så för att det ska fungera på REST-API-anropet för innehåll läggs citattecken till när du konstruerar frågesträngen som du skulle göra för att ange ett statiskt värde.

MustacheJS

Information om syntax finns på sidorna om Mustache JS-mallen på mustache.github.io/mustache.5.html.

En ändring har gjorts i Mustache-instansen som körs vid expansion av strängar. Mustache tillhandahåller både en text-expansion som använder {{ }} och en html-expansion som använder {{{ }}}. Skillnaden mellan dessa två är att textexpansionen gör en HTML-kodning av strängen, dvs. om värdet skulle expanderas till a < b så skulle resultatet bli a &lt; b. Det här är inte vad du önskar när du konstruerar strängar för URL:er. Du skulle kunna säga till användaren att använda HTML-expansionen, men det är bara en omkostnad och genererar fler problem, som att förklara varför {{{ }}} behöver användas.

För att undvika detta har Mustache ställts in så att den inte undantar värden vid användning av {{ }}. Det innebär att {{ }} och {{{ }}} fungerar på samma sätt. Det medför även att kodningen av eventuella resultat, om sådan krävs, är en övning som överlåts åt användaren.

Den färdigkonfigurerade Mustache-modellen

Mustache kräver att en modell tillämpas på mallen för expansion. I föregående exempel är {{#content.date}} redan definierat som standard, medan en ny egenskap, t.ex. {{person}}, kan läggas till av utvecklaren. Om användaren anger ett värde i Mustache-mallen som inte finns i modellen blir resultatet en tom sträng. Så, när det gäller Hello {{person}}, skulle det expanderas till bara Hello , såvida inte utvecklaren lägger till person i modellen.

Det modellobjekt som används är ett globalt objekt som kallas SCSMacros. Utvecklaren kan fritt välja att lägga till fler poster i det här objektet. Objektet överförs till Mustache när mallen utvärderas.

Det färdigkonfigurerade modellobjektet har för närvarande endast stöd för objektet content.date:

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

Anpassad Mustache-modell

Utvecklaren kan utöka de objekt som stöds, baserat på sina krav. Det går till exempel att införa objektet lastTwoDays och förenkla expansionen till bara {{lastTwoDays}}.

Om du skulle vilja utöka modellen så att den stöder något i stil med Hello {{person}} i föregående exempel, skulle du behöva lägga till objektet person i SCSMacros. Du måste göra detta innan sidan körs. Det här kan göras inom sidlayouten genom tillägg av en skripttagg i början av den. Exempel:

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

Efter den här ändringen skulle mallen Hello {{person}} expanderas till: Hello World.

Om du vill överföra värden till objektet (till exempel Hello {{#person}}personId{{/person}}) måste du implementera en mustache lambda och omsluta och expandera värdet inom implementeringen.

Exempel:

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

När den här ändringen har gjorts skulle mallen Hello {{#person}}111{{/person}} expanderas till Hello Small, och mallen Hello {{#person}}222{{/person}} skulle expanderas till Hello Big.

Obs!:

Mustache-expansion exekveras synkront. Om du behöver hämta asynkrona värden måste de bestämmas inom modellen innan du försöker exekvera Mustache-expansionen, och detta stöds inte för närvarande, även om skräddarsydda implementeringar är möjliga.