# Widgety v CMS Total.js: použite ich na stránke a napíšte vlastné

> Ako sa widget zobrazuje v HTML stránky (atribút data-cms a jeho JSON), časti súboru widgetu, zástupný symbol CLASS, vykresľovanie widgetu na serveri cez exports.render a inštalácia widgetov cez API.

Framework: cms
Product: CMS (cms@8071e48)
Language: sk
Content-SHA256: f77452e925e44d7c9e3dad2b5597181d0934da10e69d4978819d420ca54e9c1f
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: 
Review: not-recorded

**Widget** je blok, ktorý umiestnite na stránku: nadpis, upozornenie, galériu. Nesie vlastný štýl, formulár na jeho nastavenie v editore a voliteľne kód, ktorý ho vykreslí na serveri. Widget je jeden súbor HTML, ako komponent [Flow](/en/flow/write-a-component/), a CMS ho ukladá do svojich metadát.

## Widget na stránke

V HTML stránky je widget `div` s dvoma atribútmi:

```html
<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` je `<widget id>__<configuration>`, kde konfigurácia je objekt JSON zapísaný cez `encodeURIComponent`. Zapisuje ho editor; môžete ho zapísať aj sami, keď generujete stránky.
- `data-cms-id` je identifikátor inštancie na stránke.

Keď sa stránka obslúži, CMS odstráni atribút `data-cms`, ponechá HTML vo vnútri a do hlavičky pridá štýl každého widgetu stránky. Ak widget nie je nainštalovaný, jeho blok sa vynechá.

## Časti súboru widgetu

| Časť | Na čo slúži |
|---|---|
| `<script total>` | metadáta a serverový kód: `exports.id`, `name`, `author`, `version`, `preview` (obrázok alebo data URI), `config` (predvolené hodnoty) a voliteľne `dependencies`, `install`, `uninstall` a `render` |
| `<style>` | CSS widgetu |
| `<body>` | dizajn widgetu tak, ako ho zobrazuje editor; prvky s triedou `CMS_edit` sú upraviteľné; ostatné triedy `CMS_*` (`CMS_repeat`, `CMS_remove`, `CMS_unwrap`...) sú značky pre editor a kompilátor ich pred obsluhou stránky odstráni |
| `<settings>` | formulár, ktorý upravuje `config` v editore (vstupy jComponent, ktorých cesta začína `?.`) a `<script>` s `exports.save(config, el)`, ktorý zmení dizajn pri zmene konfigurácie |
| `<template>` | voliteľná šablóna widgetu |
| `<readme>` | pomocník widgetu |

`CLASS` v štýle, nastaveniach, šablóne a dizajne sa nahradí triedou, ktorá patrí widgetu (`w-` a jeho id), takže dva widgety nikdy nezdieľajú pravidlo: vo widgete `alert` sa `.CLASS-color1` stane `.w-alert-color1`.

`exports.dependencies` prijíma zoznam alebo reťazec oddelený čiarkami: adresa končiaca `.js` sa stane `<script src>` a adresa končiaca `.css` sa stane `<link rel="stylesheet">`, pridaným do hlavičky stránky.

## Vykreslenie na serveri

Widget bez `exports.render` sa iba vyčistí a obslúži tak, ako je. S `render` môže zostaviť svoje HTML z konfigurácie:

```html
<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` je konfigurácia inštancie, `opt.html` HTML, ktoré bolo vo vnútri bloku, a `opt.id`, `opt.uid` a `opt.body` ho opisujú. `next(html, replace)` odovzdá HTML, ktoré sa obslúži; s `true` ako druhým argumentom nahradí celý blok. Tento súbor sme uložili do lokálneho CMS a stránka s `data-cms="hello__..."` a `{"text":"mundo"}` vyšla ako `<p class="w-hello">Hello MUNDO</p>` s `.w-hello{color:#07c}` v hlavičke. Oficiálny widget `picture` používa rovnakú funkciu na pridanie `loading="lazy"` k obrázku a `code` na vypísanie kódu zo svojich nastavení.

`exports.install` a `exports.uninstall` sa spustia s databázou CMS, keď sa widget pridá, zmení alebo odstráni.

## Inštalácia a odstránenie widgetov

Plugin *Widgets* administrácie importuje súbor; cez API je to `widgets_save` s `{ "html": "<file content>", "singleton": true }` (`singleton` vynechá widget, ak už existuje), `widgets_list`, `widgets_read`, `widgets_detail` a `widgets_remove`. Vyžadujú oprávnenie `widgets` (pozri [API administrácie](/en/cms/the-admin-api/)). 43 oficiálnych widgetov je v [repozitári widgetov](/en/cms/the-widgets-repository/).
