Conceitos

Roteamento

Pastas como endereços, rotas dinâmicas, idiomas e subdomínios.

A estrutura de pastas de ext/uri/ é a estrutura de URLs do site. Uma pasta é um endereço; o index.tpl dela o responde.

Cada rota é uma tela em branco: o que o template produz é a resposta. Pode ser a página padrão via [#html#], um documento HTML seu, JSON, XML, um arquivo ou qualquer outra coisa. Veja O que uma rota devolve.

Rotas estáticas

ext/uri/index.tpl                 /
ext/uri/about/index.tpl           /about
ext/uri/en/contact/index.tpl      /en/contact
ext/uri/feed.xml/index.tpl        /feed.xml

Uma rota estática não precisa de mais nada: nem registro, nem route.inc. O nome da pasta pode conter um ponto, então uma rota pode responder num endereço como /feed.xml ou /llms.txt.

Uma pasta de rota normalmente contém:

Arquivo Papel
index.tpl Roda primeiro. Define variáveis da página e gera a resposta, normalmente com [#html#]
main.tpl O corpo da página dentro da shell
header.tpl, footer.tpl Cabeçalho e rodapé dentro da shell
index.js Script só desta rota, carregado pela shell
outros arquivos .tpl Templates usados só por esta rota, como um cartão

Uma subpasta é sempre uma nova rota. Um arquivo .tpl solto ao lado do index.tpl é um template só dessa rota, chamado pelo nome.

Rotas dinâmicas

Um nome de pasta entre parênteses corresponde a qualquer segmento único:

ext/uri/projects/(slug)/index.tpl     /projects/harbour-atlas
ext/uri/(lang)/news/(slug)/           /en/news/opening-day

Uma rota dinâmica tem um route.inc que decide se a requisição é dela:

<?php
$parts = router_match(__FILE__);
if ($parts === false) return;

$slug = $parts[0];
if (!preg_match('/^[a-z0-9-]{1,120}$/', $slug)) return;

load_library('data');
load_library('util');
$records = data_read_index('projects', 'title_slug', md5_uuid($slug));
if (empty($records)) return;

set_variable_dot('project', reset($records));
router_accept();
Função Faz
router_match(__FILE__) Devolve os valores dos segmentos dinâmicos, ou false quando o endereço não corresponde
router_accept() Aceita a requisição; o index.tpl da rota é executado
router_deny() Recusa; a próxima rota é tentada. Retornar sem aceitar tem o mesmo efeito

Não confie em nenhum valor vindo do endereço. Verifique a sintaxe exata que você aceita, o tamanho e o intervalo antes de usá-lo numa busca, num caminho de arquivo ou num cálculo. Mantenha o route.inc em corresponder, verificar e definir uma ou duas variáveis; a lógica de negócio pertence a uma biblioteca.

As rotas dinâmicas são registradas no recurso .routes, para que o roteador saiba quais pastas consultar. Depois de adicionar ou renomear uma, rode:

./nimbly routes:sync

Uma rota estática nunca tem route.inc. A lógica de uma página estática vai num shortcode chamado a partir do index.tpl dela.

Idiomas no endereço

Um site multilíngue normalmente dá a cada idioma seu próprio prefixo, /en/ e /nl/, como pastas em ext/uri/. Cada idioma pode ter sua própria estrutura, ou compartilhar templates. Para ligar uma página à equivalente em outro idioma, coloque um i18n-url.json ao lado do index.tpl dela:

{
  "nl": "nl/projecten/[#get project.title_slug lang=nl#]/",
  "en": "en/projects/[#get project.title_slug lang=en#]/"
}

O [#language-switch#] gera, a partir desses mapeamentos, links para todos os idiomas do site. Veja Conteúdo multilíngue.

Subdomínios

Um subdomínio faz parte do site, não é uma instalação separada. As rotas dele ficam numa pasta com o nome dele:

ext/uri/(subdomain-docs)/index.tpl          docs.example.com/
ext/uri/(subdomain-docs)/guide/index.tpl    docs.example.com/guide

Aponte o subdomínio para a mesma raiz de documentos; não há mais nada para configurar. Num subdomínio, a pasta dele é procurada primeiro, e tudo o que ela não tem, como o admin, a API e o login, vem do site. Templates, recursos e usuários são compartilhados, e o login também. [#subdomain-url docs#] e [#subdomain-url#] criam links entre o subdomínio e o site principal. Localmente, docs.localhost chega à mesma pasta. Uma página do site principal que também é acessada pelo subdomínio mantém o site principal como endereço canônico. Num site servido a partir de uma subpasta, como um host de staging compartilhado, defina SUBDOMAIN_HOST no .env para que os links de subdomínio levem ao subdomínio real.

Scripts de rota

Um index.js na pasta de uma rota é carregado pela shell da página só nessa rota. Use-o para o comportamento próprio de uma página, para que ele fique fora do bundle compartilhado.

Ver esta página em Markdown