Utvide makroer i innholdslistespørringer

I en innholdslistespørring kan du definere verdier for egenskaper som beregnes når en side kjøres, slik at du kan vise nylig oppdatert innhold.

De fleste egenskapene for komponenter i områder er statiske. Brukeren velger eller angir en fast streng eller verdi for én av egenskapene for komponenten, og denne endres ikke uansett når eller hvor siden kjøres. Du kan imidlertid definere verdier for egenskaper som beregnes når siden kjøres. Dette er nyttig når du skal vise innhold som nylig er oppdatert i innholdsspørringer. Brukere kan angi datoer, for eksempel fra de siste 3 dagene.

Du kan sette inn et Mustache JS-uttrykk i flere egenskaper. Verdiene som refereres i disse strengene, utledes fra en modell som utføres når siden kjøres. En standardmodell behandler datoer formatert for REST-API-kall for innhold. Du kan utvide denne modellen med flere verdier for å dekke alle brukerbehov.

Nedenfor vises et eksempel på strengen du kan angi for en egenskap:

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

Denne Mustache-oppføringen for datoen evalueres under kjøring, slik at den returnerte verdien endres, avhengig av når den kjøres (det vil si at den utvides til updatedDate gt "2220181002060000000"). Brukeren kan på denne måten bygge opp en hvilken som helst kompleks datostreng i stedet for å måtte angi en forhåndsdefinert verdi.

Støttede komponentegenskaper

Følgende egenskaper støtter malsyntaks for Mustache JS:

  • Innholdsliste

    • Ekstra spørrestreng

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

  • Tittel/avsnitt/tekst

    • Rik tekst angitt via CKEditor

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

Merknad:

Uten en egendefinert modell for Mustache-malen er ikke utvidelsen i Tittel/avsnitt/tekst så nyttig. Den er imidlertid svært nyttig for å validere det du angir i den ekstra spørrestrengen, fordi den evalueres når du bytter mellom redigering og visning og umiddelbar synlighet.

Støttet komponentsyntaks

Objektet content.date støttes som standard. Det inneholder de to hovedparametrene today og now.

Verdien today henter gjeldende tid fra nettleseren, konverterer det til midnatt i dag og konverterer det deretter til UTC-tid.

  • {{#content.date}}today{{/content.date}} utvider til nettleserverdien for midnatt i dag, konvertert til UTC-verdien og formatert til datoformatet for REST-API-et for innhold. For eksempel:

    2220181008065959999
  • Den kan deretter utvides med:

    today +/-  [day | week | month | year]
  • Virkemåten for verdien today er også forskjellig når du adderer eller subtraherer fra den. Hvis du subtraherer fra den, bruker den tidspunktet om morgenen. Hvis du adderer til den, bruker den tidspunktet ved midnatt. For eksempel:

    • {{#content.date}}today - 1 day{{/content.date}} utvider til i går ved starten på dagen.

    • {{#content.date}}today + 2 days{{/content.date}} utvider til dagen etter i morgen ved midnatt.

Verdien now henter gjeldende tid fra nettleseren og konverterer det til UTC-tid uten noen justering.

  • {{#content.date}}now{{/content.date}} utvider til gjeldende nettlesertid konvertert til UTC-verdien og formatert til datoformatet for REST-API-et for innhold.

  • now kan også utvides med hour. Dermed får du:

    now +/-  [hour | day | week | month | year]
  • For eksempel:
    • {{#content.date}}now + 2 hours{{/content.date}} - to timer fra nå, konvertert til UTC-tid formatert til datoformatet for REST-API-et for innhold

    • {{#content.date}}now - 1 day{{/content.date}} - i går ved denne nettlesertiden, konvertert til UTC-tid formatert i datoformatet for REST-API-et for innhold

Bruke den støttede komponentsyntaksen

Hvis du vil bruke makroutvidelsen i den ekstra spørrestrengen, og du vil returnere alt fra de siste 3 ukene, kan du angi følgende:

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

Bare datoen returneres. Når du skal behandle kallet for REST-API-et for innhold, legger du derfor til anførselstegn når du utformer spørrestrengen på samme måte som når du angir en statisk verdi.

MustacheJS

Hvis du vil ha opplysninger om syntaks, kan du se sidene om Mustache JS-maler på mustache.github.io/mustache.5.html.

Det er utført én endring i Mustache-forekomsten som kjøres når strenger utvides. Mustache inneholder både en text-utvidelse som bruker {{ }}, og en html-utvidelse som bruker {{{ }}}. Forskjellen mellom disse to er at tekstutvidelsen foretar en HTML-koding med strengen. Hvis verdien utvides til a < b, blir dermed resultatet a &lt; b. Dette er ikke ønskelig når du utformer strenger for URL-adresser. Du kan be brukeren om å bruke HTML-utvidelsen, men det medfører merarbeid som kan skape flere problemer, for eksempel å forklare hvorfor brukeren må bruke {{{ }}}.

For å unngå dette er Mustache konfigurert slik at verdier ikke unnslipper ved bruk av {{ }}. Dette betyr at virkemåten for både {{ }} og {{{ }}} er den samme. Koding av resultater blir også en oppgave for brukeren hvis det er behov.

Mustache-standardmodellen

Mustache må ha en modell i bruk for malen for utvidelse. I det forrige eksemplet er {{#content.date}} allerede definert som standard, mens en ny egenskap, for eksempel {{person}}, kan legges til av utvikleren. Hvis brukeren angir en verdi i Mustache-malen som ikke finnes i modellen, blir resultatet en tom streng. I tilfellet for Hello {{person}} blir det bare utvidet til Hello , med mindre utvikleren legger til person i modellen.

Modellobjektet som brukes, er et globalt objekt kalt SCSMacros. Utvikleren står fritt til å legge hvilke som helst av ytterligere oppføringer i dette objektet. Objektet sendes til Mustache når malen evalueres.

Standardmodellobjektet støtter for øyeblikket bare objektet content.date:

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

Egendefinert Mustache-modell

De støttede objektene kan tilpasses av utvikleren etter behov. De kan dermed introdusere et lastTwoDays-objekt og forenkle utvidelsen til bare {{lastTwoDays}}.

Hvis du vil utvide modellen slik at den for eksempel støtter Hello {{person}} i det forrige eksemplet, må du legge til objektet person i SCSMacros. Du må gjøre dette før siden kjøres. Det kan gjøres i sideoppsettet ved å legge til en skriptkode i begynnelsen. For eksempel:

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

Når denne endringen er utført, blir malen Hello {{person}} utvidet til Hello World.

Hvis du vil sende verdier til objektet (for eksempel Hello {{#person}}personId{{/person}}), må du implementere en mustache lambda og pakke inn og utvide verdien i implementeringen.

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

Når denne endringen er utført, blir malen Hello {{#person}}111{{/person}} utvidet til Hello Small, og malen Hello {{#person}}222{{/person}} blir utvidet til Hello Big.

Merknad:

Mustache-utvidelse utføres synkront. Hvis du har behov for å hente asynkrone verdier, må disse løses i modellen før du prøver å utføre Mustache-utvidelsen. Dette støttes ikke for øyeblikket, men det er mulig å bruke skreddersydde implementeringer.