# Páginas, layouts, navegación, variables y redirecciones en el CMS de Total.js

> Cómo convierte el CMS un layout y una página en una dirección pública: el elemento con id CMS, los campos de una página, las variables, los scripts de navegación escritos con Tangular, las redirecciones, el sitemap y qué páginas son visibles.

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

El CMS guarda el HTML de cada layout y de cada página como un archivo y sus datos (dirección, título, layout...) en los metadatos del sitio. Una petición al sitio público busca una página por su dirección y la renderiza dentro de su layout.

## Layouts

Un **layout** es un documento HTML completo. El elemento con `id="CMS"` marca el lugar donde va el contenido de la página:

```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` recibe `name`, `icon`, `color`, `html` y una lista de `scripts` que se añaden a todas las páginas del layout. En el HTML, `$NAME` se sustituye por la **variable** de ese nombre (ver más abajo) y `@{year}` por el año actual.

## Páginas

Una **página** tiene un `name`, un `layoutid` (obligatorio), una dirección `url` y, opcionalmente, `title`, `description`, `keywords`, `language`, `parentid`, `icon`, `color` y las banderas `disabled`, `auth`, `pinned` y `nocache`. Su HTML (guardado con `pages_save_html`) es lo que va dentro del elemento `id="CMS"`.

- Si dejas `url` vacío, el CMS la genera a partir del nombre: `Hello World` pasa a ser `/hello-world/`, y bajo una página padre la dirección empieza por la dirección del padre.
- El sitio público sirve una página cuando su `url` es igual a la dirección pedida, no está `disabled` y su `language`, si está definido, es igual al idioma de la petición.
- La respuesta lleva `<title>` (el `title`, o el `name`, seguido del nombre del sitio en todas las páginas salvo `/`), la descripción y las palabras clave, un script que cuenta las visitas (`/visitors.js`) y el estilo de los widgets que usa la página.
- Las páginas `auth` solo se sirven a un visitante con sesión. El CMS pregunta a tu código quién es el visitante: define `FUNC.auth = function($) { ... }` (por ejemplo en un archivo de `definitions/`) y llama a `$.success(user)`. Sin esa función todos son anónimos y una página `auth` responde 404.
- Una página desactivada, una dirección desconocida y una página de otro idioma responden 404. El sitemap `/sitemap.xml` lista las páginas que no están desactivadas.

## Variables

El plugin *Variables* guarda una lista de pares `NAME: value` (`Variables|save` con `vars`). Cualquier `$NAME` de un layout o de una página se convierte en su valor cuando se sirve la página, lo que sirve para un teléfono, el nombre de una empresa o un enlace que aparece en muchos sitios. Un `$NAME` desconocido se queda como está escrito.

## Navegación

Una navegación es un menú descrito en el admin (un nombre y un árbol de enlaces con `name`, `url`, `title`, `icon`, `color`, `target`, `hidden`, `highlight` y `children`) y dibujado por tu layout con una plantilla escrita con Tangular. Pon un script en el 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>
```

Al guardar el layout se crea una navegación llamada `main` si no existe; después edita sus enlaces en el plugin *Navegación*. En la plantilla, `value.children` es la lista de enlaces visibles y `value.url` la dirección que se está sirviendo. Dale al script un `name`; con solo un `id` el compilador lo acepta, pero al guardar el layout no hay respuesta.

También existe `<script type="text/breadcrumb">` para la ruta de páginas padre.

## Redirecciones

Una redirección tiene una `url`, un `target` y `permanent`. El sitio público comprueba las redirecciones antes que las páginas: `/old/` respondió con la página de `/about/` cuando su destino era `/about/`.

## Caché

Las páginas compiladas se guardan en caché; al guardar una página, un layout, un widget o una variable se limpia lo que depende de ello, y un servicio que se ejecuta cada dos minutos también limpia las vistas compiladas.
