I widget nel CMS di Total.js: usarli in una pagina e scrivere i tuoi
Un widget è un blocco che inserisci in una pagina: un titolo, un avviso, una galleria. Porta il proprio stile, un modulo per configurarlo nell’editor e, facoltativamente, codice che lo renderizza sul server. Un widget è un file HTML, come un componente di Flow, e il CMS lo conserva nei suoi metadati.
Un widget dentro una pagina
Nell’HTML di una pagina, un widget è un div con due attributi:
<div data-cms="headline__%7B%22h%22%3A%22h1%22%2C%22align%22%3A%22left%22%7D" data-cms-id="h1">
<h1 class="w-headline-h">Hello CMS</h1>
<p>Some text</p>
</div>data-cmsè<widget id>__<configuration>, dove la configurazione è un oggetto JSON scritto conencodeURIComponent. Lo scrive l’editor; puoi scriverlo tu quando generi pagine.data-cms-idè l’identificativo dell’istanza nella pagina.
Quando la pagina viene servita, il CMS rimuove l’attributo data-cms, conserva l’HTML che c’è dentro e aggiunge all’head lo stile di ogni widget della pagina. Se il widget non è installato, il suo blocco viene scartato.
Le parti di un file di widget
| Parte | A cosa serve |
|---|---|
<script total> | i metadati e il codice del server: exports.id, name, author, version, preview (un’immagine o un data URI), config (i valori predefiniti) e, facoltativamente, dependencies, install, uninstall e render |
<style> | il CSS del widget |
<body> | il design del widget come lo mostra l’editor; gli elementi con la classe CMS_edit sono quelli modificabili; le altre classi CMS_* (CMS_repeat, CMS_remove, CMS_unwrap...) sono segnalini per l’editor, e il compilatore le rimuove prima di servire la pagina |
<settings> | il modulo che modifica config nell’editor (input di jComponent il cui percorso inizia con ?.) e uno <script> con exports.save(config, el) che cambia il design quando cambia la configurazione |
<template> | un modello facoltativo per il widget |
<readme> | l’aiuto del widget |
CLASS nello stile, nelle impostazioni, nel modello e nel design viene sostituito da una classe che appartiene al widget (w- seguito dal suo id), così due widget non condividono mai una regola: nel widget alert, .CLASS-color1 diventa .w-alert-color1.
exports.dependencies accetta un elenco o una stringa separata da virgole: un indirizzo che termina con .js diventa un <script src> e uno che termina con .css un <link rel="stylesheet">, aggiunti all’head della pagina.
Renderizzare sul server
Un widget senza exports.render viene solo ripulito e servito così com’è. Con render può costruire il proprio HTML dalla configurazione:
<script total>
exports.id = 'hello';
exports.name = 'Hello';
exports.author = 'Me';
exports.version = '1';
exports.config = { text: 'world' };
exports.render = function(opt, next) {
next('<p class="w-hello">Hello ' + (opt.config.text || '').toUpperCase() + '</p>', true);
};
</script>
<style>
.CLASS { color: #07c; }
</style>
<body>
<p class="CLASS CMS_edit">Hello world</p>
</body>opt.config è la configurazione dell’istanza, opt.html l’HTML che c’era dentro il blocco, e opt.id, opt.uid e opt.body lo descrivono. next(html, replace) fornisce l’HTML da servire; con true come secondo argomento sostituisce l’intero blocco. Abbiamo salvato questo file in un CMS locale e una pagina con data-cms="hello__..." e {"text":"mundo"} è uscita come <p class="w-hello">Hello MUNDO</p>, con .w-hello{color:#07c} nell’head. Il widget ufficiale picture usa la stessa funzione per aggiungere loading="lazy" alla sua immagine, e code per stampare il codice delle sue impostazioni.
exports.install e exports.uninstall vengono eseguiti con il database del CMS quando il widget viene aggiunto, modificato o rimosso.
Installare e rimuovere widget
Il plugin Widgets dell’admin importa un file; tramite l’API è widgets_save con { "html": "<file content>", "singleton": true } (singleton salta il widget se esiste già), widgets_list, widgets_read, widgets_detail e widgets_remove. Richiedono il permesso widgets (vedi l’API dell’admin). I 43 widget ufficiali sono in il repository dei widget.