# Definições, artigos, ficheiros e visitantes do CMS do Total.js e onde fica guardado tudo

> As definições do CMS do Total.js, o gestor de artigos, como os ficheiros enviados são servidos e redimensionados, as estatísticas de visitantes e o painel, a integração com o OpenPlatform e o modelo de dados do site.

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

## Definições

O plugin *Settings* (`settings_read`, `settings_save`; permissão `settings`) edita a configuração que o CMS guarda nos metadados do site e carrega em `CONF` a cada arranque:

| Chave | Significado |
|---|---|
| `name` | o nome do site, usado no `<title>` de todas as páginas exceto `/` e no nome do ficheiro da cópia de segurança |
| `url` | o endereço público do site; o CMS também o atualiza a partir do host dos pedidos do admin |
| `smtp` | as definições SMTP como texto JSON (`server`, `from`, `user`, `password`, `port`); `settings_test` testa-as |
| `icon` | um ícone para o site |
| `$tms`, `secret_tms` | publica os eventos por TMS, e o segredo dessa ligação |
| `op_reqtoken`, `op_restoken` | os tokens de uma aplicação [OpenPlatform](/en/openplatform/how-an-app-connects/); quando ambos estão definidos, o início de sessão no admin é substituído pelo do OpenPlatform |
| `totalapi` | uma chave para os serviços da API do Total.js |

Os plugins podem acrescentar mais chaves, que aparecem no mesmo formulário. Os valores que vivem no ficheiro `config` (`$api`, `cdn`, `salt` e, se o acrescentar, `token`) não se editam aqui.

## Artigos

O plugin *Posts* é um pequeno gestor de artigos, guardados num ficheiro NoSQL próprio dentro do armazenamento. Um artigo tem `name`, `category`, `picture`, `summary`, `body`, `reference`, `icon`, `color`, `hidden` e `date`; o admin lista-os do mais recente para o mais antigo (100 por página) e `posts_categories` devolve as categorias em uso. Os artigos são dados para o seu próprio código: o renderizador público do CMS (`controllers/default.js`) não os imprime, por isso um widget ou uma rota sua tem de os ler e desenhar.

## Ficheiros

O plugin *Files* guarda os envios no armazenamento de ficheiros e marca-os como públicos. `GET /download/<id>.<ext>` serve um ficheiro público (só os públicos; os restantes respondem 404). Para imagens, `?s=<percent>` devolve um JPEG mais pequeno (o valor tem de estar entre 10 e 80, com qualidade 80), e `?download=1` força a transferência. As rotas de envio e os seus limites estão em [a API do admin](/en/cms/the-admin-api/).

## Visitantes e o painel

O módulo `modules/visitors.js` conta as visitas das páginas públicas através do script `/visitors.js` que cada página inclui: visitantes únicos, visualizações, navegadores, referentes, tráfego de pesquisa, social e direto, móvel e computador, horas do dia e as pessoas online (um visitante está online durante 20 minutos sem atividade). O plugin *Dashboard* desenha esses números a partir de `dashboard_stats`, `dashboard_online`, `dashboard_browsers`, `dashboard_referers` e `dashboard_pages`.

## OpenPlatform

Quando `op_reqtoken` e `op_restoken` estão definidos, o CMS inicia a sessão das pessoas através do [OpenPlatform](/en/openplatform/what-is-openplatform/) (módulo `modules/openplatform.js`) e cada plugin acrescenta a sua permissão à lista que o OpenPlatform mostra ao atribuir grupos: `pages`, `layouts`, `widgets`, `navigation`, `posts`, `files`, `redirects`, `variables`, `settings` e `admin`. Lembre-se da regra do OpenPlatform: uma aplicação só é visível para os grupos que lhe atribuir.

## O modelo de dados

`MAIN.db` guarda os metadados do site (`pages`, `layouts`, `widgets`, `redirects`, `vars`, `nav`, `config` e `storage`) e é gravado como um único documento JSON chamado `meta` no armazenamento de ficheiros. O HTML de cada página e layout é um ficheiro desse armazenamento cujo nome é o id da página ou do layout. `FUNC.load()` lê os metadados no arranque, compila os widgets (executando a sua função `install`) e reconstrói as caches; `FUNC.save()` volta a escrevê-los. Por isso uma cópia de segurança do armazenamento é uma cópia de segurança do site.
