# Páginas, layouts, navegação, variáveis e redirecionamentos no CMS do Total.js

> Como o CMS transforma um layout e uma página num endereço público: o elemento com id CMS, os campos de uma página, as variáveis, os scripts de navegação escritos com Tangular, os redirecionamentos, o sitemap e que páginas são visíveis.

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

O CMS guarda o HTML de cada layout e página como um ficheiro e os seus dados (endereço, título, layout...) nos metadados do site. Um pedido ao site público encontra uma página pelo seu endereço e renderiza-a dentro do seu layout.

## Layouts

Um **layout** é um documento HTML completo. O elemento com `id="CMS"` marca o lugar onde vai o conteúdo da 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` recebe `name`, `icon`, `color`, `html` e uma lista de `scripts` que são acrescentados a todas as páginas do layout. No HTML, `$NAME` é substituído pela **variável** com esse nome (veja abaixo) e `@{year}` pelo ano atual.

## Páginas

Uma **página** tem um `name`, um `layoutid` (obrigatório), um endereço `url` e, opcionalmente, `title`, `description`, `keywords`, `language`, `parentid`, `icon`, `color` e os indicadores `disabled`, `auth`, `pinned` e `nocache`. O seu HTML (guardado com `pages_save_html`) é o que vai dentro do elemento `id="CMS"`.

- Se deixar `url` vazio, o CMS cria uma a partir do nome: `Hello World` passa a `/hello-world/`, e debaixo de uma página pai o endereço começa pelo endereço do pai.
- O site público serve uma página quando o seu `url` é igual ao endereço pedido, não está `disabled` e o seu `language`, se definido, é igual ao idioma do pedido.
- A resposta recebe `<title>` (o `title`, ou o `name`, seguido do nome do site em todas as páginas exceto `/`), a descrição e as palavras-chave, um script que conta as visitas (`/visitors.js`) e o estilo dos widgets que a página usa.
- As páginas `auth` só são servidas a um visitante com sessão iniciada. O CMS pergunta ao seu código quem é o visitante: defina `FUNC.auth = function($) { ... }` (por exemplo num ficheiro de `definitions/`) e chame `$.success(user)`. Sem essa função todos são anónimos e uma página `auth` responde 404.
- Uma página desativada, um endereço desconhecido e uma página de outro idioma respondem 404. O sitemap `/sitemap.xml` lista as páginas que não estão desativadas.

## Variáveis

O plugin *Variables* guarda uma lista de pares `NAME: value` (`Variables|save` com `vars`). Qualquer `$NAME` num layout ou numa página passa a ser o seu valor quando a página é servida, o que serve para um telefone, o nome de uma empresa ou uma ligação que aparece em muitos sítios. Um `$NAME` desconhecido fica como está escrito.

## Navegação

Uma navegação é um menu descrito no admin (um nome e uma árvore de ligações com `name`, `url`, `title`, `icon`, `color`, `target`, `hidden`, `highlight` e `children`) e desenhado pelo seu layout com um modelo escrito em Tangular. Ponha um script no 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 o layout é guardado, é criada uma navegação chamada `main` se não existir; depois edite as suas ligações no plugin *Navegação*. No modelo, `value.children` é a lista de ligações visíveis e `value.url` o endereço que está a ser servido. Dê um `name` ao script; com apenas um `id` o compilador aceita-o, mas guardar o layout não responde.

Existe também `<script type="text/breadcrumb">` para o caminho das páginas pai.

## Redirecionamentos

Um redirecionamento tem um `url`, um `target` e `permanent`. O site público verifica os redirecionamentos antes das páginas: `/old/` respondeu com a página de `/about/` quando o seu destino era `/about/`.

## Cache

As páginas compiladas ficam em cache; guardar uma página, um layout, um widget ou uma variável limpa o que depende deles, e um serviço que corre a cada dois minutos limpa também as vistas compiladas.
