Pular para o conteúdo
murad.guide

PHP

Capítulo 20

Conferir o livro de visitas e preparar a entrega

6 min de leitura 1.040 palavras 1 gravura

Neste capítulo você vai repetir os testes essenciais e separar arquivos de estudo de dados gerados.

Seu ponto de partida

Estude depois do capítulo 19. O exemplo deste capítulo é 20-conferencia-entrega, no pacote que acompanha o volume. Copie a pasta inicio para um diretório de prática e preserve o original. A raiz do exemplo é a referência concluída desta etapa. Sua cópia permite experimentar sem perder a referência.

Execute o PHP na raiz da sua cópia com php -S 127.0.0.1:8000 -t public. Abra http://127.0.0.1:8000/. Não abra PHP por duplo clique nem use o servidor de Python. Encerre com Ctrl+C antes de trocar de etapa.

Como praticar

Leia a explicação e digite ou confira o código indicado. Mude uma coisa. Antes de conferir, anote sua previsão. Salve, recarregue e compare. Se não acontecer o esperado, investigue o erro antes de avançar. Cada experiência parte dos valores da referência. Depois de conferir, desfaça somente a mudança desse experimento antes de começar a próxima lição. Você pode parar depois de uma lição e retomar mais tarde.

Confira um percurso completo

Use uma cópia nova da referência. Inicie o servidor com -t public. Abra a página vazia, envie dados inválidos e confira a recusa. Depois envie nome, e-mail fictício e mensagem válidos.

Repita com uma mensagem que tenha acento, aspas, sinais de HTML, tabulação e duas linhas. Confira o texto na lista e o registro JSON no disco. Recarregue e conte novamente os registros.

Não basta olhar uma página bonita. Um teste verifica uma ação e um resultado. Anote navegador, condição e o que aconteceu. Isso permite repetir um problema sem inventar uma explicação vaga.

Faça no seu exemplo

Use o roteiro de conferência ao final do capítulo e os arquivos completos desta etapa.

Mude uma coisa e preveja

Troque somente a mensagem da visita válida por duas linhas contendo e ação.

Anote o que você acha que vai acontecer antes de salvar e recarregar.

Recarregue e confira

A mensagem aparece completa como texto, um único registro é acrescentado e o recarregar por GET não duplica a visita.

Se não acontecer

Se falhar, identifique a etapa: leitura do POST, validação, JSON, escrita, redirecionamento ou saída. Compare o arquivo relacionado com a referência.

Teste acesso pelo teclado e pela tela estreita

Use Tab para chegar ao link Pular para o conteúdo e Enter para ativá-lo. O foco deve chegar à área principal. Os campos têm rótulos e cada controle mantém um contorno visível.

Estreite a janela e amplie a página para 200%. Leia mensagens de erro, nomes e visitas. Nenhum campo deve sair da área disponível; mensagens longas precisam quebrar linhas.

A validação deve funcionar tanto por teclado quanto por clique. O servidor cuida dos valores recebidos; a apresentação precisa tornar a resposta compreensível para quem usa outra forma de navegação.

Faça no seu exemplo

Abra o mesmo exemplo no navegador. Use apenas o teclado por um percurso.

Mude uma coisa e preveja

Aumente somente o zoom para 200% e repita o preenchimento fictício.

Anote o que você acha que vai acontecer antes de salvar e recarregar.

Recarregue e confira

Os rótulos, campos, mensagens e botão continuam utilizáveis. O foco permanece visível. Depois restaure 100%.

Se não acontecer

Se cortar conteúdo, confira largura dos campos e quebra das mensagens no CSS fornecido. Não esconda o transbordamento para encobrir o problema.

Extraia uma entrega limpa e confira outra vez

O pacote do volume contém README, capítulos, exemplos completos, imagens e manifesto. O website já existente permanece como consulta complementar. Ele não executa o livro de visitas.

Cada exemplo entregue começa sem visitas geradas pelos testes e sem arquivos de sessão. A pasta dados contém sua orientação e o arquivo JSONL só nasce na primeira escrita. Sessoes contém orientação e ganha arquivos temporários quando o PHP executa as últimas etapas.

Não inclua .trabalho, cópias internas, relatórios, dados reais ou sessões de um navegador no ZIP. Extraia o pacote numa pasta nova, inicie o exemplo final e confira o percurso. Essa abertura verifica que ele não depende da pasta de preparação.

Faça no seu exemplo

Leia o README do volume e confira o conteúdo extraído. No exemplo final execute na raiz:

php -S 127.0.0.1:8000 -t public

Mude uma coisa e preveja

Extraia uma cópia em outra pasta e faça uma única visita fictícia.

Anote o que você acha que vai acontecer antes de salvar e recarregar.

Recarregue e confira

O exemplo deve funcionar nesse novo caminho. Dados nascem só nessa cópia. O endereço /dados/entradas.jsonl continua sem entregar registros. Encerre o servidor ao terminar.

Se não acontecer

Se depender de um caminho absoluto da máquina de preparação, troque por DIR e caminhos relativos como na referência. Não entregue arquivos de sessão para resolver uma falha de inicialização.

Trecho do resultado de referência do capítulo 20

A captura mostra um trecho da referência concluída. Abra e percorra o exemplo para conferir o restante. Experimentos temporários podem produzir outra aparência; restaure os valores indicados antes de comparar.

Atividades para fazer antes das respostas

Use uma nova cópia do exemplo. Tente aplicar o que aprendeu antes de consultar os comentários.

  1. Liste os resultados de vazio, inválido e válido.

  2. Confira uma mensagem com sinais e duas linhas.

  3. Explique quais arquivos não entram no ZIP.

Respostas comentadas

Compare sua explicação e o que realmente aconteceu. Outra solução pode funcionar se cumprir o objetivo e preservar o acesso ao conteúdo.

  1. A primeira abertura mostra lista vazia; dados inválidos não gravam; válidos produzem uma visita e um GET de confirmação.

  2. JSON preserva a mensagem e escapar a mostra literalmente, com linhas apresentadas pelo CSS.

  3. Preparação .trabalho, dados reais, arquivos de sessão de testes e backups internos não acompanham a entrega.

Quando seguir

Você abre a cópia extraída, executa o percurso e encerra seu servidor local. Se ainda precisa de ajuda, repita a experiência pequena antes de avançar.

Consulta opcional

Não é preciso ler os links externos para executar os arquivos fornecidos. Eles servem para consultar detalhes quando você quiser.

O arquivo completo

Referência do exemplo 20-conferencia-entrega, reproduzida aqui para que você possa conferir sem sair da página.

public/estilos.css

* { box-sizing: border-box; }
body { margin: 0; background: #f4f7fb; color: #203246;
  font: 1.05rem/1.65 Arial, sans-serif; }
header, main, footer { max-width: 48rem; margin-inline: auto; padding: 1.5rem; }
header { padding-top: 2.5rem; }
h1 { font-size: clamp(1.8rem, 5vw, 2.7rem); line-height: 1.2; }
main { background: #fff; border-radius: .8rem; }
article { border-top: 1px solid #cad4df; padding-block: 1rem; }
a { color: #124e77; text-underline-offset: .2em; }
nav { display: flex; flex-wrap: wrap; gap: 1rem; }
label { display: block; font-weight: bold; }
input:not([type=hidden]), textarea { width: 100%; max-width: 34rem;
  border: 2px solid #718095; border-radius: .35rem; padding: .7rem;
  font: inherit; color: inherit; background: #fff; }
button { font: inherit; background: #124e77; color: white;
  border: 0; border-radius: .35rem; padding: .75rem 1.2rem; cursor: pointer; }
button:hover { background: #103b59; }
.mensagem { white-space: pre-wrap; overflow-wrap: anywhere; }
.erros { color: #8b142c; }
.ok { color: #175c30; font-weight: bold; }
:focus-visible { outline: 3px solid #b04d00; outline-offset: 3px; }
.pular { position: absolute; left: -10000px; }
.pular:focus { position: static; display: block; padding: 1rem; background: white; }
@media (max-width: 35rem) { header,main,footer { padding: 1rem; } }