# Widgety v CMS Total.js: použijte je na stránce a napište vlastní

> Jak se widget zobrazuje v HTML stránky (atribut data-cms a jeho JSON), části souboru widgetu, zástupný symbol CLASS, vykreslení widgetu na serveru přes exports.render a instalace widgetů přes API.

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

**Widget** je blok, který umístíte na stránku: nadpis, upozornění, galerii. Nese vlastní styl, formulář pro jeho nastavení v editoru a volitelně kód, který jej vykreslí na serveru. Widget je jeden soubor HTML, jako komponenta [Flow](/en/flow/write-a-component/), a CMS jej ukládá do svých metadat.

## Widget na stránce

V HTML stránky je widget `div` se dvěma atributy:

```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 konfigurace je objekt JSON zapsaný přes `encodeURIComponent`. Zapisuje jej editor; můžete jej zapsat i sami, když generujete stránky.
- `data-cms-id` je identifikátor instance na stránce.

Když se stránka obslouží, CMS odstraní atribut `data-cms`, ponechá HTML uvnitř a do hlavičky přidá styl každého widgetu stránky. Pokud widget není nainstalován, jeho blok se vynechá.

## Části souboru widgetu

| Část | K čemu slouží |
|---|---|
| `<script total>` | metadata a serverový kód: `exports.id`, `name`, `author`, `version`, `preview` (obrázek nebo data URI), `config` (výchozí hodnoty) a volitelně `dependencies`, `install`, `uninstall` a `render` |
| `<style>` | CSS widgetu |
| `<body>` | návrh widgetu tak, jak jej zobrazuje editor; prvky s třídou `CMS_edit` jsou upravitelné; ostatní třídy `CMS_*` (`CMS_repeat`, `CMS_remove`, `CMS_unwrap`...) jsou značky pro editor a kompilátor je před obsluhou stránky odstraní |
| `<settings>` | formulář, který upravuje `config` v editoru (vstupy jComponent, jejichž cesta začíná `?.`) a `<script>` s `exports.save(config, el)`, který změní návrh při změně konfigurace |
| `<template>` | volitelná šablona widgetu |
| `<readme>` | nápověda widgetu |

`CLASS` ve stylu, nastavení, šabloně a návrhu se nahradí třídou, která patří widgetu (`w-` a jeho id), takže dva widgety nikdy nesdílejí pravidlo: ve widgetu `alert` se `.CLASS-color1` stane `.w-alert-color1`.

`exports.dependencies` přijímá seznam nebo řetězec oddělený čárkami: adresa končící `.js` se stane `<script src>` a končící `.css` se stane `<link rel="stylesheet">`, přidanými do hlavičky stránky.

## Vykreslení na serveru

Widget bez `exports.render` se jen vyčistí a obslouží tak, jak je. S `render` může sestavit své HTML z konfigurace:

```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 konfigurace instance, `opt.html` HTML, které bylo uvnitř bloku, a `opt.id`, `opt.uid` a `opt.body` jej popisují. `next(html, replace)` předá HTML k obsluze; s `true` jako druhým argumentem nahradí celý blok. Tento soubor jsme uložili do lokálního CMS a stránka s `data-cms="hello__..."` a `{"text":"mundo"}` vyšla jako `<p class="w-hello">Hello MUNDO</p>` s `.w-hello{color:#07c}` v hlavičce. Oficiální widget `picture` používá stejnou funkci k přidání `loading="lazy"` ke svému obrázku a `code` k vypsání kódu ze svých nastavení.

`exports.install` a `exports.uninstall` se spustí s databází CMS, když se widget přidá, změní nebo odstraní.

## Instalace a odstranění widgetů

Plugin *Widgets* administrace importuje soubor; přes API je to `widgets_save` s `{ "html": "<file content>", "singleton": true }` (`singleton` widget vynechá, pokud už existuje), `widgets_list`, `widgets_read`, `widgets_detail` a `widgets_remove`. Vyžadují oprávnění `widgets` (viz [API administrace](/en/cms/the-admin-api/)). 43 oficiálních widgetů je v [repozitáři widgetů](/en/cms/the-widgets-repository/).
