Makrók kibontása tartalomlista lekérdezéseiben

Tartalomlista lekérdezésében értékeket definiálhat oldal futásakor kiszámított tulajdonságokhoz a legutóbb módosított tartalom megjelenítéséhez.

A webhelyeken belüli összetevők tulajdonságainak többsége statikus. A felhasználó olyan rögzített karakterláncot vagy értéket jelöli ki vagy ad meg az összetevő valamelyik tulajdonságához, amely az oldal futásának idejétől és helyétől függetlenül nem változik. Értékeket definiálhat azonban az oldal futásakor kiszámított tulajdonságokhoz is. Ez olyan tartalom megjelenítéséhez hasznos, amelyet legutóbb módosítottak a tartalomlekérdezésekben. A felhasználók például „az elmúlt 3 napon” értelemben is megadhatják a dátumot.

Mustache JS kibontást szúrhat be több tulajdonságba. Az ezekben a karakterláncokban hivatkozott értékek olyan modellből származnak, amelynek végrehajtására az oldal futásakor kerül sor. Egy beépített modell kezeli a Content REST API-hívásokhoz formázott dátumokat. A felhasználói követelmények kielégítéséhez további értékekkel bővítheti ezt a modellt.

A következő példa tulajdonság számára megadható karakterláncot mutat be:

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

Ezt a dátumra vonatkozó Mustache bejegyzést futásidőben értékeli ki a rendszer, így a visszaadott érték a futás időpontjától függően változik (kibontás után például updatedDate gt "2220181002060000000" lehet). Ily módon a felhasználó előre definiált érték megadása helyett összetett dátumkarakterláncot alakíthat ki.

Támogatott összetevő-tulajdonságok

A következő tulajdonságok támogatják a Mustache JS sablon szintaxisát:

  • Tartalomlista

    • Kiegészítő lekérdezési karakterlánc

    • Például: updatedDate gt "{{#content.date}}today - 3 days{{/content.date}}"

  • Cím/bekezdés/szöveg

    • A CKEditor szerkesztővel bevitt formázott szöveg

    • Például: "Content REST API format for date: {{#content.date}}now{{/content.date}}"

Megjegyzés:

A Mustache sablonhoz tartozó egyéni modell nélkül a cím/bekezdés/szöveg összetevőben a kibontás nem túl hasznos. Nagyon hasznos viszont a kiegészítő lekérdezési karakterlánc értékének érvényesítésénél, mivel kiértékelése a szerkesztés és a megtekintés közötti váltásnál történik, és azonnal látható.

Támogatott összetevő-szintaxis

A content.date objektum alapértelmezés szerint támogatott. A következő két fő paramétert fogadja: today és now.

A today értéke veszi a böngésző aktuális időpontját, aznap éjfélre, majd ezt UTC-időre alakítja át.

  • A {{#content.date}}today{{/content.date}} kibontáskor a böngésző éjféli értéke lesz, ez UTC-időre lesz átalakítva, és a Content REST API dátumformátumára lesz formázva. Például:

    2220181008065959999
  • Ezután a következőkkel bővíthető:

    today +/-  [day | week | month | year]
  • A today érték eltérően viselkedik hozzáadáskor és kivonáskor. Belőle való kivonáskor a hajnali időpontot használja. Hozzáadáskor az éjféli időpontot használja. Például:

    • A {{#content.date}}today - 1 day{{/content.date}} értéke kibontáskor tegnap napkezdés lesz.

    • A {{#content.date}}today + 2 days{{/content.date}} értéke kibontáskor holnapután éjfél lesz.

A now értéke veszi a böngésző aktuális időpontját, és módosítás nélkül UTC-időre alakítja át.

  • A {{#content.date}}now{{/content.date}} kibontáskor a böngésző aktuális időpontja lesz UTC-értékre alakítva és a Content REST API dátumformátumára formázva.

  • A now a hour paraméterrel is bővíthető. Így a következők használhatók:

    now +/-  [hour | day | week | month | year]
  • Például:
    • {{#content.date}}now + 2 hours{{/content.date}} – két órával az aktuális időpont után UTC-időre alakítva és a Content REST API dátumformátumára formázva

    • {{#content.date}}now - 1 day{{/content.date}} – tegnap a böngésző jelenlegi időpontja UTC-időre alakítva és a Content REST API dátumformátumára formázva

A támogatott összetevő-szintaxis használata

A kiegészítő lekérdezési karakterláncban a makrókiterjesztés használatánál tegyük fel, hogy az elmúlt három hét adatait szeretné visszaadni, ekkor a következőt használhatja:

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

Csak a dátumot adja vissza a rendszer, így a Content REST API-hívásnál idézőjelek kerültek be a lekérdezési karakterlánc kialakításakor, amint ezt statikus érték bevitelekor tenné.

MustacheJS

A szintaxis megtalálható a Mustache JS sablon oldalain a mustache.github.io/mustache.5.html címen.

Egy változtatás történt a karakterláncok kibontásakor futó Mustache példánynál. A Mustache egyaránt biztosítja a text kibontást, amely a {{ }} formátumot használja, és a html kibontást, amely a {{{ }}} formátumot használja. A kettő között az a különbség, hogy a „text” kibontás HTML kódolást hajt végre a karakterláncon, azaz ha a kibontott érték a < b, akkor az eredmény a &lt; b lehet. Ez nem feltétlenül kívánatos karakterláncok kialakításakor URL-címekhez. Közölheti a felhasználókkal, hogy a HTML kibontást használják, ez azonban látszatmegoldás, és további problémákhoz vezet, például annak kifejtéséhez, hogy miért kell a {{{ }}} formátumot használniuk.

Ennek elkerülése érdekében a Mustache úgy lett beállítva, hogy nem hajt végre escape műveletet az értékeken a {{ }} használatakor. Ez azt jelenti, hogy a {{ }} és a {{{ }}} azonosan viselkedik. Ez egyúttal a felhasználóra bízza az eredmények szükség szerinti kódolását.

Az OOTB Mustache modell

A kibontáshoz a Mustache modell alkalmazását írja elő a sablonra. Az előző példában a {{#content.date}} már alapértelmezés szerint definiálva van, a fejlesztő azonban új tulajdonságot, például {{person}} vehetett fel. Ha a felhasználó a modellben nem szereplő értéket ad meg a Mustache sablonban, az eredmény üres karakterlánc lesz. Így a Hello {{person}} esetében ez csak Hello értékre lesz kibontva, ha a fejlesztő nem vette fel a person tulajdonságot a modellbe.

A használt modell objektum az SCSMacros nevű globális objektum. A fejlesztő tetszőleges további bejegyzéseket vehet fel ebbe az objektumba. Az objektumot a sablon kiértékelésekor adja át a rendszer a Mustache számára.

A beépített modell objektum jelenleg csak a content.date objektumot támogatja:

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

Egyéni Mustache modell

A támogatott objektumokat a fejlesztő igény szerint bővítheti. Bevezetheti például a lastTwoDays objektumot, és a kibontást csak a {{lastTwoDays}} értékre egyszerűsítheti.

A modell kiterjesztéséhez, hogy például támogassa az előző példában szereplő Hello {{person}} megadást, a person bejegyzés felvétele szükséges az SCSMacros globális objektumba. Ezt az oldal futása előtt kell megtenni. Ez végrehajtható az oldalelrendezésen belül az elején egy script címke felvételével. Például:

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

A változtatás után a Hello {{person}} sablon kibontásának eredménye Hello World lesz.

Ha értékeket szeretne átadni az objektumnak (például Hello {{#person}}personId{{/person}}), akkor mustache lambda megvalósítása szükséges, és az értéket be kell csomagolni és ki kell bontani a megvalósításon belül.

Például:

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

A változtatás végrehajtása után a Hello {{#person}}111{{/person}} kibontásának eredménye Hello Small, míg a Hello {{#person}}222{{/person}} kibontásának eredménye Hello Big lehet.

Megjegyzés:

A mustache kibontás végrehajtása szinkron módon történik. Ha aszinkron értékeket kíván lekérni, ezeket a modellen belül kell megoldani a mustache kibontás végrehajtási kísérlete előtt, és ez jelenleg nem támogatott, bár testreszabott megvalósítások lehetségesek.