Toate compilatoarele de componente personalizate urmează acelaşi model ca şi compilatoarele de pagini şi pot fi create pentru machete de secţiune, componente personalizate şi machete de conţinut.
În timpul compilării, comanda cec compile-template
va căuta un fişier compile.js
în aceeaşi locaţie ca şi fişierul render.js
pentru respectiva componentă:
src
components
<yourComponent>
assets
render.js
compile.js
Dacă acest fişier nu există, componenta nu este compilată şi va fi randată la runtime.
Dacă fişierul există, acesta trebuie să implementeze o interfaţă compile()
, care returnează o Promisiune. De exemplu, Starter-Blog-Author-Summary
care urmează este un compilator de machete de conţinut personalizat:
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;