# Pagina’s, layouts, navigatie, variabelen en doorverwijzingen in het Total.js CMS

> Hoe het CMS van een layout en een pagina een openbaar adres maakt: het element met id CMS, de velden van een pagina, variabelen, met Tangular geschreven navigatiescripts, doorverwijzingen, de sitemap en welke pagina’s zichtbaar zijn.

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

Het CMS bewaart de HTML van elke layout en pagina als bestand en hun gegevens (adres, titel, layout...) in de metagegevens van de site. Een verzoek aan de openbare site vindt een pagina op haar adres en rendert haar binnen haar layout.

## Layouts

Een **layout** is een volledig HTML-document. Het element met `id="CMS"` markeert de plek waar de inhoud van de pagina komt:

```html
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
</head>
<body>
	<header>$SITE</header>
	<div id="CMS"></div>
	<footer>@{year}</footer>
</body>
</html>
```

`Layouts/save` neemt `name`, `icon`, `color`, `html` en een lijst `scripts` die aan elke pagina van de layout worden toegevoegd. In de HTML wordt `$NAME` vervangen door de **variabele** met die naam (zie hieronder) en `@{year}` door het huidige jaar.

## Pagina’s

Een **pagina** heeft een `name`, een `layoutid` (verplicht), een adres `url` en optioneel `title`, `description`, `keywords`, `language`, `parentid`, `icon`, `color` en de vlaggen `disabled`, `auth`, `pinned` en `nocache`. Haar HTML (opgeslagen met `pages_save_html`) komt in het element `id="CMS"`.

- Als je `url` leeg laat, maakt het CMS er een van de naam: `Hello World` wordt `/hello-world/`, en onder een bovenliggende pagina begint het adres met het adres van de ouder.
- De openbare site serveert een pagina wanneer haar `url` gelijk is aan het gevraagde adres, ze niet `disabled` is en haar `language`, indien ingesteld, gelijk is aan de taal van het verzoek.
- Het antwoord krijgt `<title>` (de `title`, of de `name`, gevolgd door de naam van de site voor elke pagina behalve `/`), de beschrijving en de trefwoorden, een script dat de bezoeken telt (`/visitors.js`) en de stijl van de widgets die de pagina gebruikt.
- `auth`-pagina’s worden alleen aan een aangemelde bezoeker geserveerd. Het CMS vraagt je code wie de bezoeker is: definieer `FUNC.auth = function($) { ... }` (bijvoorbeeld in een bestand van `definitions/`) en roep `$.success(user)` aan. Zonder die functie is iedereen anoniem en antwoordt een `auth`-pagina 404.
- Een uitgeschakelde pagina, een onbekend adres en een pagina van een andere taal antwoorden 404. De sitemap `/sitemap.xml` toont de pagina’s die niet zijn uitgeschakeld.

## Variabelen

De plugin *Variables* bewaart een lijst met paren `NAME: value` (`Variables|save` met `vars`). Elke `$NAME` in een layout of pagina wordt zijn waarde wanneer de pagina wordt geserveerd, handig voor een telefoonnummer, een bedrijfsnaam of een link die op veel plaatsen voorkomt. Een onbekende `$NAME` blijft staan zoals geschreven.

## Navigatie

Een navigatie is een menu dat in het beheer wordt beschreven (een naam en een boom van links met `name`, `url`, `title`, `icon`, `color`, `target`, `hidden`, `highlight` en `children`) en door je layout wordt getekend met een sjabloon geschreven in Tangular. Zet een script in de layout:

```html
<nav>
	<script type="text/navigation" name="main">
		{{ foreach m in value.children }}
			<a href="{{ m.url }}"{{ if m.url === value.url }} class="on"{{ fi }}>{{ m.name }}</a>
		{{ end }}
	</script>
</nav>
```

Wanneer de layout wordt opgeslagen, wordt een navigatie genaamd `main` aangemaakt als die niet bestaat; bewerk daarna haar links in de plugin *Navigatie*. In het sjabloon is `value.children` de lijst met zichtbare links en `value.url` het adres dat wordt geserveerd. Geef het script een `name`; met alleen een `id` accepteert de compiler het, maar het opslaan van de layout geeft geen antwoord.

Er is ook `<script type="text/breadcrumb">` voor het pad van bovenliggende pagina’s.

## Doorverwijzingen

Een doorverwijzing heeft een `url`, een `target` en `permanent`. De openbare site controleert de doorverwijzingen vóór de pagina’s: `/old/` antwoordde met de pagina van `/about/` toen het doel `/about/` was.

## Cache

Gecompileerde pagina’s worden in de cache bewaard; het opslaan van een pagina, layout, widget of variabele wist wat ervan afhangt, en een service die elke twee minuten draait, wist ook de gecompileerde weergaven.
