# Widgetar i Total.js CMS: använd dem på en sida och skriv egna

> Hur en widget visas i HTML för en sida (attributet data-cms och dess JSON), delarna i en widgetfil, platshållaren CLASS, att rendera en widget på servern med exports.render och att installera widgetar via API:et.

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

En **widget** är ett block som du placerar på en sida: en rubrik, en varning, ett galleri. Den bär sin egen stil, ett formulär för att konfigurera den i editorn och, valfritt, kod som renderar den på servern. En widget är en HTML-fil, som en komponent i [Flow](/en/flow/write-a-component/), och CMS lagrar den i sin metadata.

## En widget i en sida

I HTML för en sida är en widget en `div` med två attribut:

```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` är `<widget id>__<configuration>`, där konfigurationen är ett JSON-objekt skrivet med `encodeURIComponent`. Editorn skriver det; du kan skriva det själv när du genererar sidor.
- `data-cms-id` är instansens identifierare i sidan.

När sidan serveras tar CMS bort attributet `data-cms`, behåller HTML inuti och lägger till stilen för varje widget på sidan i head. Om widgeten inte är installerad släpps dess block.

## Delarna i en widgetfil

| Del | Vad den är till för |
|---|---|
| `<script total>` | metadata och serverkod: `exports.id`, `name`, `author`, `version`, `preview` (en bild eller en data-URI), `config` (standardvärdena) och valfritt `dependencies`, `install`, `uninstall` och `render` |
| `<style>` | widgetens CSS |
| `<body>` | widgetens design som editorn visar den; element med klassen `CMS_edit` är de redigerbara; de andra `CMS_*`-klasserna (`CMS_repeat`, `CMS_remove`, `CMS_unwrap`...) är markörer för editorn, och kompilatorn tar bort dem innan sidan serveras |
| `<settings>` | formuläret som redigerar `config` i editorn (jComponent-fält vars sökväg börjar med `?.`) och ett `<script>` med `exports.save(config, el)` som ändrar designen när konfigurationen ändras |
| `<template>` | en valfri mall för widgeten |
| `<readme>` | widgetens hjälp |

`CLASS` i stilen, inställningarna, mallen och designen ersätts av en klass som tillhör widgeten (`w-` följt av dess id), så att två widgetar aldrig delar en regel: i widgeten `alert` blir `.CLASS-color1` `.w-alert-color1`.

`exports.dependencies` accepterar en lista eller en kommaseparerad sträng: en adress som slutar på `.js` blir en `<script src>` och en som slutar på `.css` en `<link rel="stylesheet">`, tillagda i sidans head.

## Rendera på servern

En widget utan `exports.render` rensas bara och serveras som den är. Med `render` kan den bygga sin HTML utifrån konfigurationen:

```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` är instansens konfiguration, `opt.html` HTML som fanns inuti blocket, och `opt.id`, `opt.uid` och `opt.body` beskriver det. `next(html, replace)` ger HTML att servera; med `true` som andra argument ersätter den hela blocket. Vi sparade den här filen i ett lokalt CMS och en sida med `data-cms="hello__..."` och `{"text":"mundo"}` kom ut som `<p class="w-hello">Hello MUNDO</p>`, med `.w-hello{color:#07c}` i head. Den officiella widgeten `picture` använder samma funktion för att lägga till `loading="lazy"` på sin bild, och `code` för att skriva ut koden från sina inställningar.

`exports.install` och `exports.uninstall` körs med CMS databas när widgeten läggs till, ändras eller tas bort.

## Installera och ta bort widgetar

Pluginet *Widgets* i administrationen importerar en fil; via API:et är det `widgets_save` med `{ "html": "<file content>", "singleton": true }` (`singleton` hoppar över widgeten om den redan finns), `widgets_list`, `widgets_read`, `widgets_detail` och `widgets_remove`. De kräver behörigheten `widgets` (se [administrations-API:et](/en/cms/the-admin-api/)). De 43 officiella widgetarna finns i [widgetförrådet](/en/cms/the-widgets-repository/).
