Les compilateurs de composant personnalisés suivent le même modèle que les compilateurs de page et peuvent être créés pour des présentations de section, des composants personnalisés et des présentations de contenu.
Pendant le processus de compilation, la commande cec compile-template
recherche un fichier compile.js
au même emplacement que le fichier render.js
pour le composant :
src
components
<yourComponent>
assets
render.js
compile.js
Si ce fichier n'existe pas, le composant n'est pas compilé et est affiché lors de l'exécution.
Si le fichier existe, il doit implémenter une interface compile()
qui renvoie une promesse. Par exemple, le compilateur Starter-Blog-Author-Summary
suivant est un compilateur de présentation de contenu personnalisé :
var fs = require('fs'), path = require('path'), mustache = require('mustache'); var ContentLayout = function (params) { this.contentClient = params.contentClient; this.contentItemData = params.contentItemData || {}; this.scsData = params.scsData; }; ContentLayout.prototype = { contentVersion: '>=1.0.0 <2.0.0', compile: function () { var compiledContent = '', content = JSON.parse(JSON.stringify(this.contentItemData)), contentClient = this.contentClient; // Store the id content.fields.author_id = content.id; if (this.scsData) { content.scsData = this.scsData; contentType = content.scsData.showPublishedContent === true ? 'published' : 'draft'; secureContent = content.scsData.secureContent; } // calculate the hydrate data content.hydrateData = JSON.stringify({ contentId: content.id, authorName: content.fields['starter-blog-author_name'] }); try { // add in style - possible to add to <head> but inline for simplicity var templateStyle = fs.readFileSync(path.join(__dirname, 'design.css'), 'utf8'); content.style = '<style>' + templateStyle + '</style>'; var templateHtml = fs.readFileSync(path.join(__dirname, 'layout.html'), 'utf8'); compiledContent = mustache.render(templateHtml, content); } catch (e) { console.error(e.stack); } return Promise.resolve({ content: compiledContent, hydrate: true // note that we want to hydrate this component using the render.js hydrate() function. This is required for when the user clicks on the author }); } }; module.exports = ContentLayout;