# Pages, layouts, navigation, variables et redirections dans le CMS de Total.js

> Comment le CMS transforme un layout et une page en adresse publique : l’élément avec l’id CMS, les champs d’une page, les variables, les scripts de navigation écrits avec Tangular, les redirections, le sitemap et quelles pages sont visibles.

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

Le CMS conserve le HTML de chaque layout et de chaque page sous forme de fichier, et leurs données (adresse, titre, layout...) dans les métadonnées du site. Une requête vers le site public trouve une page par son adresse et la rend à l’intérieur de son layout.

## Layouts

Un **layout** est un document HTML complet. L’élément avec `id="CMS"` marque l’endroit où va le contenu de la page :

```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` prend `name`, `icon`, `color`, `html` et une liste de `scripts` ajoutés à chaque page du layout. Dans le HTML, `$NAME` est remplacé par la **variable** de ce nom (voir plus bas) et `@{year}` par l’année en cours.

## Pages

Une **page** a un `name`, un `layoutid` (obligatoire), une adresse `url` et, facultativement, `title`, `description`, `keywords`, `language`, `parentid`, `icon`, `color` et les indicateurs `disabled`, `auth`, `pinned` et `nocache`. Son HTML (enregistré avec `pages_save_html`) est ce qui va dans l’élément `id="CMS"`.

- Si vous laissez `url` vide, le CMS en fabrique une à partir du nom : `Hello World` devient `/hello-world/`, et sous une page parente l’adresse commence par celle du parent.
- Le site public sert une page quand son `url` est égale à l’adresse demandée, qu’elle n’est pas `disabled` et que son `language`, s’il est défini, est égal à la langue de la requête.
- La réponse reçoit `<title>` (le `title`, ou le `name`, suivi du nom du site pour toutes les pages sauf `/`), la description et les mots-clés, un script qui compte les visites (`/visitors.js`) et le style des widgets que la page utilise.
- Les pages `auth` ne sont servies qu’à un visiteur connecté. Le CMS demande à votre code qui est le visiteur : définissez `FUNC.auth = function($) { ... }` (par exemple dans un fichier de `definitions/`) et appelez `$.success(user)`. Sans cette fonction, tout le monde est anonyme et une page `auth` répond 404.
- Une page désactivée, une adresse inconnue et une page d’une autre langue répondent 404. Le sitemap `/sitemap.xml` liste les pages qui ne sont pas désactivées.

## Variables

Le plugin *Variables* conserve une liste de paires `NAME: value` (`Variables|save` avec `vars`). Tout `$NAME` d’un layout ou d’une page devient sa valeur quand la page est servie, ce qui est utile pour un numéro de téléphone, un nom d’entreprise ou un lien qui apparaît à de nombreux endroits. Un `$NAME` inconnu reste tel qu’il est écrit.

## Navigation

Une navigation est un menu décrit dans l’admin (un nom et un arbre de liens avec `name`, `url`, `title`, `icon`, `color`, `target`, `hidden`, `highlight` et `children`) et dessiné par votre layout avec un modèle écrit en Tangular. Mettez un script dans le 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>
```

Quand le layout est enregistré, une navigation appelée `main` est créée si elle n’existe pas ; modifiez ensuite ses liens dans le plugin *Navigation*. Dans le modèle, `value.children` est la liste des liens visibles et `value.url` l’adresse servie. Donnez un `name` au script ; avec seulement un `id`, le compilateur l’accepte mais l’enregistrement du layout ne répond pas.

Il existe aussi `<script type="text/breadcrumb">` pour le fil des pages parentes.

## Redirections

Une redirection a une `url`, une `target` et `permanent`. Le site public vérifie les redirections avant les pages : `/old/` a répondu avec la page de `/about/` quand sa cible était `/about/`.

## Cache

Les pages compilées sont mises en cache ; enregistrer une page, un layout, un widget ou une variable vide ce qui en dépend, et un service qui s’exécute toutes les deux minutes vide aussi les vues compilées.
