# Strony, layouty, nawigacja, zmienne i przekierowania w CMS Total.js

> Jak CMS zamienia layout i stronę w publiczny adres: element z id CMS, pola strony, zmienne, skrypty nawigacji pisane w Tangular, przekierowania, mapa witryny i to, które strony są widoczne.

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

CMS przechowuje HTML każdego layoutu i strony jako plik, a ich dane (adres, tytuł, layout...) w metadanych witryny. Żądanie do witryny publicznej znajduje stronę po adresie i renderuje ją wewnątrz jej layoutu.

## Layouty

**Layout** to pełny dokument HTML. Element z `id="CMS"` oznacza miejsce, w którym trafia treść strony:

```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` przyjmuje `name`, `icon`, `color`, `html` i listę `scripts`, które są dodawane do każdej strony layoutu. W HTML `$NAME` jest zastępowane **zmienną** o tej nazwie (zobacz niżej), a `@{year}` bieżącym rokiem.

## Strony

**Strona** ma `name`, `layoutid` (wymagane), adres `url` i opcjonalnie `title`, `description`, `keywords`, `language`, `parentid`, `icon`, `color` oraz flagi `disabled`, `auth`, `pinned` i `nocache`. Jej HTML (zapisany przez `pages_save_html`) trafia do elementu `id="CMS"`.

- Jeśli zostawisz `url` puste, CMS utworzy go z nazwy: `Hello World` zamienia się w `/hello-world/`, a pod stroną nadrzędną adres zaczyna się od adresu rodzica.
- Witryna publiczna serwuje stronę, gdy jej `url` jest równy żądanemu adresowi, nie jest `disabled`, a jej `language`, jeśli ustawiony, jest równy językowi żądania.
- Odpowiedź dostaje `<title>` (`title` lub `name`, a po nim nazwę witryny dla każdej strony oprócz `/`), opis i słowa kluczowe, skrypt zliczający odwiedziny (`/visitors.js`) oraz styl widżetów używanych przez stronę.
- Strony `auth` są serwowane tylko zalogowanemu odwiedzającemu. CMS pyta Twój kod, kim jest odwiedzający: zdefiniuj `FUNC.auth = function($) { ... }` (na przykład w pliku w `definitions/`) i wywołaj `$.success(user)`. Bez tej funkcji wszyscy są anonimowi, a strona `auth` odpowiada 404.
- Wyłączona strona, nieznany adres i strona w innym języku odpowiadają 404. Mapa witryny `/sitemap.xml` wymienia strony, które nie są wyłączone.

## Zmienne

Wtyczka *Variables* przechowuje listę par `NAME: value` (`Variables|save` z `vars`). Każde `$NAME` w layoucie lub stronie staje się swoją wartością, gdy strona jest serwowana, co przydaje się dla telefonu, nazwy firmy lub odnośnika występującego w wielu miejscach. Nieznane `$NAME` pozostaje tak, jak zapisano.

## Nawigacja

Nawigacja to menu opisane w administracji (nazwa i drzewo odnośników z `name`, `url`, `title`, `icon`, `color`, `target`, `hidden`, `highlight` i `children`) i rysowane przez Twój layout szablonem napisanym w Tangular. Umieść skrypt w layoucie:

```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>
```

Po zapisaniu layoutu tworzona jest nawigacja o nazwie `main`, jeśli nie istnieje; następnie edytuj jej odnośniki we wtyczce *Nawigacja*. W szablonie `value.children` to lista widocznych odnośników, a `value.url` serwowany adres. Nadaj skryptowi `name`; z samym `id` kompilator go akceptuje, ale zapis layoutu nie odpowiada.

Istnieje też `<script type="text/breadcrumb">` dla ścieżki stron nadrzędnych.

## Przekierowania

Przekierowanie ma `url`, `target` i `permanent`. Witryna publiczna sprawdza przekierowania przed stronami: `/old/` odpowiedziało stroną `/about/`, gdy jego celem było `/about/`.

## Pamięć podręczna

Skompilowane strony są przechowywane w pamięci podręcznej; zapis strony, layoutu, widżetu lub zmiennej czyści to, co od nich zależy, a usługa uruchamiana co dwie minuty czyści też skompilowane widoki.
