De structuur van gegevens voor een inhoudlay-out standaardiseren

De ontwikkelaar van de inhoudlay-out moet de structuur van gegevens standaardiseren die door de inhoudlay-out worden ontvangen.

Als alle gegevens aanwezig zijn, kan met de inhoudlay-out eenvoudigweg de component worden weergegeven. Als niet alle gegevens aanwezig zijn, moeten mogelijk aanvullende zoekvragen worden gemaakt door de inhoudlay-out. In alle gevallen moet door de inhoudlay-out nooit een bepaalde gegevensopmaak worden aangenomen en moet in plaats daarvan een opmaak voor de gegevens worden afgedwongen die kan worden weergegeven.

U moet ervoor zorgen dat u alle gegevens hebt die u verwacht. Als de gegevens niet bestaan, moet u de nodige aanvullende zoekvragen maken. De volgende velden ontbreken mogelijk in de gegevens:

  • De ingang "fields" voor velden waarnaar wordt verwezen

  • Grote tekstvelden

Omdat inhoudlay-outs voor bepaalde inhoudtypen zijn ontworpen, kent de ontwikkelaar van een inhoudlay-out de lijst met benodigde velden. Voor elk van deze velden moeten de gegevens worden opgehaald zodat de inhoudlay-out kan worden weergegeven. U hebt twee opties: ontbrekende gegevens ophalen en vervolgens weergeven met volledige gegevens of onmiddellijk weergeven en vervolgens ontbrekende gegevens ophalen om de lege plekken in te vullen.

Optie 1: ontbrekende gegevens ophalen en vervolgens weergeven met volledige gegevens

Maak een Promise (toezegging) om de vereiste gegevens op te halen en ga vervolgens door met het weergeven wanneer alle Promises worden geretourneerd.

We hebben bijvoorbeeld de volgende inhoudtypen met bijbehorende velden:

  • starter-blog-author

    • velden

      • starter-blog-author_name: tekstveld

      • starter-blog-author_bio: tekstveld

  • starter-blog-post

    • velden

      • starter-blog-post_title: tekstveld

      • starter-blog-post_content: groot tekstveld

      • starter-blog-post_author: verwijzing naar een item starter-blog-author

De inhoudlay-out heeft de volgende sjabloon, om deze verwachte veldwaarden weer te geven:

{{#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}}

De inhoudlay-out kan worden aangeroepen met gegevens uit de volgende zoekvragen:

  • Itemzoekvraag met "expand": alle gegevens geleverd

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

    • Dit is de opmaak van de gegevens die is vereist voor het vullen van alle waarden in de sjabloon. Als een van de andere zoekvragen wordt gebruikt, is extra werk nodig om de gegevens op te halen en deze te transformeren naar deze opmaak.

    • "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": "..."
              }
          }
      }
  • Itemzoekvraag, zonder "expand": ontbrekende itemvelden waarnaar wordt verwezen "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-zoekvraag: ontbrekend groot tekstveld "starter-blog-post_content", ontbrekende itemvelden waarnaar wordt verwezen "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"
          }
      }

Voor een consistente weergave met deze zoekvragen moet voor render.js van de inhoudlay-out worden gecontroleerd of alle velden waarnaar wordt verwezen zijn uitgevouwen en of de grote tekstvelden aanwezig zijn.

Anders moet hiervoor een zoekvraag worden uitgevoerd, moeten de gegevens worden gecorrigeerd en moet de weergave vervolgens worden uitgevoerd met de volledige gegevens.

Voorbeeldfunctie render():

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);
        }    
    });
}

Optie 2: onmiddellijk weergeven en vervolgens ontbrekende gegevens ophalen om lege plekken in te vullen

Prestaties kunnen worden verbeterd door de items te onderscheiden die mogelijk niet aanwezig zijn en deze in een tweede gang weer te geven. Hiervoor zijn twee Mustache-sjablonen vereist. De eerste sjabloon wordt gebruikt voor de initiële weergave, waarbij 'gaten' blijven zitten. Deze worden vervolgens ingevuld met de tweede weergave zodra de gegevens volledig opgehaald zijn.

Hiervoor moet de Mustache-sjabloon worden ingesteld op de ondersteuning van meerdere gangen, met behulp van afzonderlijke sjablonen voor de 'gaten' of door het model sjabloonmacro's te laten retourneren in plaats van werkelijke waarden. In beide gevallen moet u deze gaten 'verbergen' tot de gegevens worden opgehaald en ze vervolgens invullen en tonen met de juiste gebruikersinterface-animatie om te voorkomen dat de pagina te veel verspringt.