Tartalomelrendezés adatszerkezetének egységesítése

A tartalomelrendezés fejlesztőjének egységesítenie kell a tartalomelrendezés által kapott adatok szerkezetét.

Ha minden adat megvan, a tartalomelrendezés egyszerűen megjelenítheti az összetevőt. Ha nincs meg minden adat, a tartalomelrendezésnek további lekérdezéseket kell végrehajtania. A tartalomelrendezés egyetlen esetben sem feltételezhet egy bizonyos adatformátumot, és nem kényszerítheti az adatokat a megjelenítendő formátumba.

Meg kell győződnie arról, hogy az összes várt adattal rendelkezik. Ha nincs meg minden szükséges adat, további lekérdezéseket kell végrehajtania. A következő mezők hiányozhatnak az adatokból:

  • A "fields" érték a hivatkozott mezőknél

  • Nagy méretű szövegmezők

Mivel a tartalomelrendezéseket meghatározott tartalomtípusokhoz tervezik, a tartalomelrendezés fejlesztője ismeri a szükséges mezők listáját. Ezen mezők mindegyikénél be kell olvasni az adatokat a tartalomelrendezés megjelenítéséhez. Két lehetőség közül választhat: vagy beolvassa a hiányzó adatokat, majd megjeleníti a tartalomelrendezést az összes adattal, vagy pedig azonnal megjeleníti a meglévő tartalomelrendezést, és utána olvassa be a hiányzó adatokat, hogy kitöltse az üres értékeket.

1. lehetőség: A hiányzó adatok beolvasása, majd az összes adatot tartalmazó tartalomelrendezés megjelenítése

Hozzon létre egy ígéretet a kívánt adatok lekéréséhez, majd akkor folytassa a megjelenítést, ha minden ígéretet visszakapott.

Például: a következő tartalomtípusokkal rendelkezünk, amelyek a megfelelő mezőket tartalmazzák:

  • starter-blog-author

    • mezők

      • starter-blog-author_name - szövegmező

      • starter-blog-author_bio - szövegmező

  • starter-blog-post

    • mezők

      • starter-blog-post_title - szövegmező

      • starter-blog-post_content - nagy méretű szövegmező

      • starter-blog-post_author - hivatkozás egy starter-blog-author elemre

A tartalomelrendezés a következő sablont tartalmazza a várt mezőértékek megjelenítéséhez:

{{#fields}}
<div class="blog_container">
    <div class="blog-post-title">{{starter-blog-post_title}}</div>
    {{#starter-blog-post_author.fields}}
    <div class="blog-author-container">
        <div class="blog-author-details">
            <div class="blog-author-name">{{starter-blog-author_name}}</div>
            <div class="blog-author-bio">{{{starter-blog-author_bio}}}</div>
            <span class="more-from-author">More articles from this author</span>
        </div>
    </div>
    {{/starter-blog-post_author.fields}}
    <div class="blog-post-content">{{{starter-blog-post_content}}}</div>
</div>
{{/fields}}

A tartalomelrendezést a következő lekérdezésekből származó adatokkal lehet meghívni:

  • Elemlekérdezés a következővel: "expand" - minden adat biztosított

    • /content/published/api/v1.1/items/{id}?expand=fields.starter-blog-post_author&channelToken=8dd714be0096ffaf0f7eb08f4ce5630f

    • Ezt az adatformátumot kell használni az összes érték sikeres kitöltéséhez a sablonban. Ha bármelyik másik lekérdezést használják, további műveletek szükségesek az adatok beolvasásához és ebbe a formátumba való konvertálásához.

    • "fields": {    
          "starter-blog-post_title": "...",
          "starter-blog-post_summary": "...",
          "starter-blog-post_content": "...",
          "starter-blog-post_author": {
              "id": "CORE386C8733274240D0AB477C62271C2A02",
              "type": "Starter-Blog-Author"
              "fields": {
                  "starter-blog-author_bio": "...",
                  "starter-blog-author_name": "..."
              }
          }
      }
  • Elemlekérdezés a következő nélkül: "expand" - hiányoznak a következő hivatkozott elemmezők: "starter-blog-post_author.fields":

    • /content/published/api/v1.1/items/{id}?channelToken=8dd714be0096ffaf0f7eb08f4ce5630f
    • "fields": {    
          "starter-blog-post_title": "...",
          "starter-blog-post_summary": "...",
          "starter-blog-post_content": "...",
          "starter-blog-post_author": {
              "id": "CORE386C8733274240D0AB477C62271C2A02",
              "type": "Starter-Blog-Author"
          }
      }
  • SCIM-lekérdezés - hiányzik a "starter-blog-post_content" nagy méretű szövegmező, hiányoznak a következő hivatkozott elemmezők: "starter-blog-post_author.fields":

    • /content/published/api/v1.1/items?q=(type eq "Starter-Blog-Post")&fields=ALL&channelToken=8dd714be0096ffaf0f7eb08f4ce5630f

    • "fields": {
          "starter-blog-post_title": "...",
          "starter-blog-post_summary": "...",
          "starter-blog-post_author": {
              "id": "CORE386C8733274240D0AB477C62271C2A02",
              "type": "Starter-Blog-Author"
          }
      }

Ahhoz, hogy a megjelenítést a fenti lekérdezések bármelyike nélkül következetesen elvégezhesse, meg kell győződnie arról, hogy a tartalomelrendezésben lévő render.js fájl minden hivatkozott mezőt kibont, és hogy a nagy méretű szövegmezők is szerepelnek.

Ellenkező esetben újból meg kell ismételni a lekérdezést, kijavítani az adatokat, majd megjeleníteni az összes adatot.

Minta render() függvény:

render: function (parentObj) {
    var self = this,
        template,
        contentClient = self.contentClient,
        content = self.contentItemData;

     var getRefItems = function (contentClient, ids) {
        // Calling getItems() with no "ids" returns all items.
        // If no items are requested, just return a resolved Promise.
        if (ids.length === 0) {
            return Promise.resolve({});
        } else {
            return contentClient.getItems({
                "ids": ids
            }); 
        }
     };
   
     var fetchIDs = [], // list of items to fetch
         referedFields = ['starter-blog-post_author'], // names of reference fields
         largeTextFields = ['starter-blog-post_content'], // large text fields in this asset
         fieldsData = content.fields;
     // See if we need to fetch any referenced fields
     referedFields.forEach(function (fieldName) {
         if(fieldsData[fieldName] && fieldsData[fieldName].fields) {
            // got data already, nothing else to do
         } else { 
             // fetch this item
             fetchIDs.push(fieldsData[fieldName].id);
         }
     });

     // See if we need to fetch any large text fields
     for(var i = 0; i < largeTextFields.length; i++) {
        if(!fieldsData[largeTextFields[i]]) {
           // need to fetch this content item directly to get all the large text fields
            fetchIDs.push(content.id);
            break;
        }
     }
    // now we have the IDs of all the content items we need to fetch, get them all before continuing
    getRefItems(contentClient, fetchIDs).then(function (referenceData) {
        var items = referenceData && referenceData.items || [];

        // add the data back in
        items.forEach(function (referencedItem){
            // check if it's the current item
            if(referencedItem.id === content.id) {
               // copy across the large text fields 
               largeTextFields.forEach(function (fieldName) {
                   fieldsData[fieldName] = referencedItem.fields[fieldName];
                });
            } else{
                // check for any referenced fields
                for (var i = 0; i < referedFields.length; i++) {
                    if(referencedItem.id === fieldsData[referedFields[i]].id){
                       // copy across the fields values
                       fieldsData[referedFields[i]].fields = referencedItem.fields;
                       break;
                    }
                }
            }
        });

        // now data is fixed up, we can continue as before
        try{
           // Mustache
           template = Mustache.render(templateHtml, content);

             if(template) {
                $(parentObj).append(template);
             }

        } catch (e) {            
            console.error(e.stack);
        }    
    });
}

2. lehetőség: Azonnali megjelenítés, utána a hiányzó adatok belolvasása az üres értékek kitöltéséhez

A teljesítmény javítása érdekében külön választhatja azokat az elemeket, amelyek nem szerepelhetnek, és egy második menetben jeleníti meg őket. Ehhez két Mustache-sablon szükséges: az elsővel elvégezhető a kezdeti megjelenítés, meghagyva azokat a "lyukakat", amelyeket majd a második megjelenítés során fog kitölteni, ha már minden adattal rendelkezik.

Ehhez úgy kell beállítani a Mustache-sablont, hogy több menetet támogasson: vagy külön sablont kell biztosítani a "lyukak" számára, vagy a modellnek a sablonbeli makrókat kell visszaadnia a tényleges értékek helyett. Bármelyik esetben "el kell rejtenie" ezeket a lyukakat mindaddig, amíg az adatokat be nem olvasta, majd ki kell töltenie azokkal a megfelelő mezőket, és a megfelelő felhasználói felületi animációk segítségével megjeleníteni őket, elkerülve, hogy az oldal túl sokat "ugráljon".