# Pagine, layout, navigazione, variabili e reindirizzamenti nel CMS di Total.js

> Come il CMS trasforma un layout e una pagina in un indirizzo pubblico: l’elemento con id CMS, i campi di una pagina, le variabili, gli script di navigazione scritti con Tangular, i reindirizzamenti, la sitemap e quali pagine sono visibili.

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

Il CMS conserva l’HTML di ogni layout e pagina come file e i loro dati (indirizzo, titolo, layout...) nei metadati del sito. Una richiesta al sito pubblico trova una pagina dal suo indirizzo e la renderizza dentro il suo layout.

## Layout

Un **layout** è un documento HTML completo. L’elemento con `id="CMS"` segna il punto in cui va il contenuto della pagina:

```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` riceve `name`, `icon`, `color`, `html` e un elenco di `scripts` che vengono aggiunti a ogni pagina del layout. Nell’HTML, `$NAME` è sostituito dalla **variabile** con quel nome (vedi sotto) e `@{year}` dall’anno corrente.

## Pagine

Una **pagina** ha un `name`, un `layoutid` (obbligatorio), un indirizzo `url` e, facoltativi, `title`, `description`, `keywords`, `language`, `parentid`, `icon`, `color` e i flag `disabled`, `auth`, `pinned` e `nocache`. Il suo HTML (salvato con `pages_save_html`) è ciò che va dentro l’elemento `id="CMS"`.

- Se lasci `url` vuoto, il CMS ne crea uno dal nome: `Hello World` diventa `/hello-world/`, e sotto una pagina padre l’indirizzo inizia con quello del padre.
- Il sito pubblico serve una pagina quando il suo `url` è uguale all’indirizzo richiesto, non è `disabled` e il suo `language`, se impostato, è uguale alla lingua della richiesta.
- La risposta riceve `<title>` (il `title`, o il `name`, seguito dal nome del sito per ogni pagina tranne `/`), la descrizione e le parole chiave, uno script che conta le visite (`/visitors.js`) e lo stile dei widget usati dalla pagina.
- Le pagine `auth` sono servite solo a un visitatore con accesso. Il CMS chiede al tuo codice chi è il visitatore: definisci `FUNC.auth = function($) { ... }` (per esempio in un file di `definitions/`) e chiama `$.success(user)`. Senza quella funzione tutti sono anonimi e una pagina `auth` risponde 404.
- Una pagina disattivata, un indirizzo sconosciuto e una pagina di un’altra lingua rispondono 404. La sitemap `/sitemap.xml` elenca le pagine che non sono disattivate.

## Variabili

Il plugin *Variables* conserva un elenco di coppie `NAME: value` (`Variables|save` con `vars`). Ogni `$NAME` in un layout o in una pagina diventa il suo valore quando la pagina viene servita, utile per un telefono, il nome di un’azienda o un link che compare in molti punti. Un `$NAME` sconosciuto resta com’è scritto.

## Navigazione

Una navigazione è un menu descritto nell’admin (un nome e un albero di link con `name`, `url`, `title`, `icon`, `color`, `target`, `hidden`, `highlight` e `children`) e disegnato dal tuo layout con un modello scritto in Tangular. Metti uno script nel 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>
```

Quando il layout viene salvato, viene creata una navigazione chiamata `main` se non esiste; poi modifica i suoi link nel plugin *Navigazione*. Nel modello, `value.children` è l’elenco dei link visibili e `value.url` l’indirizzo servito. Dai allo script un `name`; con il solo `id` il compilatore lo accetta ma il salvataggio del layout non risponde.

Esiste anche `<script type="text/breadcrumb">` per il percorso delle pagine padre.

## Reindirizzamenti

Un reindirizzamento ha un `url`, un `target` e `permanent`. Il sito pubblico controlla i reindirizzamenti prima delle pagine: `/old/` ha risposto con la pagina di `/about/` quando la sua destinazione era `/about/`.

## Cache

Le pagine compilate sono messe in cache; salvare una pagina, un layout, un widget o una variabile svuota ciò che ne dipende, e un servizio che gira ogni due minuti svuota anche le viste compilate.
