Criando e editando postagens
Isso é ótimo! Temos um novo blog super legal, as pessoas estão discutindo intensamente nos comentários e finalmente temos um pouco de tempo para programar mais. Embora o Adminer seja uma ótima ferramenta, não é totalmente ideal para escrever novas postagens no blog. Provavelmente é a hora certa de criar um formulário simples para adicionar novas postagens diretamente do aplicativo. Vamos lá.
Comecemos projetando a interface do usuário:
- Na página inicial, adicionaremos um link “Escrever nova postagem”.
- Este link exibirá um formulário com um título e uma área de texto para o conteúdo da postagem.
- Quando clicarmos no botão Salvar, a postagem será salva no banco de dados.
Mais tarde, também adicionaremos login e permitiremos a adição de postagens apenas para usuários logados. Mas isso depois. Que código precisamos escrever agora para que tudo funcione?
- Criaremos um novo presenter com um formulário para adicionar postagens.
- Definiremos um callback que será executado após o envio bem-sucedido do formulário e que salvará a nova postagem no banco de dados.
- Criaremos um novo template no qual o formulário estará.
- Adicionaremos um link para o formulário no template da página principal.
Novo presenter
Chamaremos o novo presenter de EditPresenter e o salvaremos em app/Presentation/Edit/EditPresenter.php. Ele também precisa se conectar ao banco de dados, então escreveremos novamente um construtor que exigirá a conexão com o banco de dados:
<?php namespace App\Presentation\Edit; use Nette; use Nette\Application\UI\Form; final class EditPresenter extends Nette\Application\UI\Presenter { public function __construct( private Nette\Database\Explorer $database, ) { } } Formulário para salvar postagens
Já explicamos formulários e componentes ao criar comentários. Se ainda não estiver claro, vá revisar a criação de formulários e componentes, nós esperaremos aqui ;)
Agora adicione este método ao presenter EditPresenter:
protected function createComponentPostForm(): Form { $form = new Form; $form->addText('title', 'Título:') ->setRequired(); $form->addTextArea('content', 'Conteúdo:') ->setRequired(); $form->addSubmit('send', 'Salvar e publicar'); $form->onSuccess[] = $this->postFormSucceeded(...); return $form; } Salvando nova postagem do formulário
Continuamos adicionando um método que processará os dados do formulário:
private function postFormSucceeded(array $data): void { $post = $this->database ->table('posts') ->insert($data); $this->flashMessage("A postagem foi publicada com sucesso.", 'success'); $this->redirect('Post:show', $post->id); } Apenas uma rápida recapitulação: este método obtém os dados do formulário, insere-os no banco de dados, cria uma mensagem para o usuário sobre o salvamento bem-sucedido da postagem e redireciona para a página com a nova postagem, para que possamos ver imediatamente como ela ficou.
Página para criar nova postagem
Vamos criar agora o template Edit/create.latte:
{block content} <h1>Nova postagem</h1> {control postForm} Tudo já deve estar claro. A última linha renderiza o formulário que acabamos de criar.
Poderíamos criar também o método renderCreate correspondente, mas não é necessário. Não precisamos obter nenhum dado do banco de dados e passá-lo para o template, então esse método estaria vazio. Nesses casos, o método não precisa existir.
Link para criar postagens
Você provavelmente já sabe como adicionar um link para o EditPresenter e sua ação create. Experimente.
Basta adicionar ao arquivo app/Presentation/Home/default.latte:
<a n:href="Edit:create">Escrever nova postagem</a> Edição de postagens
Agora também adicionaremos a opção de editar uma postagem. Será muito simples. Já temos o formulário postForm pronto e podemos usá-lo também para edição.
Adicionaremos uma nova página edit ao presenter EditPresenter:
public function renderEdit(int $id): void { $post = $this->database ->table('posts') ->get($id); if (!$post) { $this->error('Post not found'); } $this->getComponent('postForm') ->setDefaults($post->toArray()); } E criaremos outro template Edit/edit.latte:
{block content} <h1>Editar postagem</h1> {control postForm} E modificaremos o método postFormSucceeded, que será capaz tanto de adicionar um novo artigo (como faz agora) quanto de editar um artigo já existente:
private function postFormSucceeded(array $data): void { $id = $this->getParameter('id'); if ($id) { $post = $this->database ->table('posts') ->get($id); $post->update($data); } else { $post = $this->database ->table('posts') ->insert($data); } $this->flashMessage('A postagem foi publicada com sucesso.', 'success'); $this->redirect('Post:show', $post->id); } Se o parâmetro id estiver disponível, significa que vamos editar a postagem. Nesse caso, verificaremos se a postagem solicitada realmente existe e, se sim, a atualizaremos no banco de dados. Se o parâmetro id não estiver disponível, significa que uma nova postagem deve ser adicionada.
Mas de onde vem o parâmetro id? É o parâmetro que foi passado para o método renderEdit.
Agora podemos adicionar um link ao template app/Presentation/Post/show.latte:
<a n:href="Edit:edit $post->id">Editar postagem</a> Resumo
O blog agora está funcional, os visitantes estão comentando ativamente e não precisamos mais do Adminer para publicar. O aplicativo é totalmente independente e qualquer pessoa pode adicionar uma nova postagem. Espere um momento, isso provavelmente não está totalmente certo, que qualquer pessoa – e quero dizer realmente qualquer pessoa com acesso à internet – possa adicionar novas postagens. É necessária alguma segurança para que apenas um usuário logado possa adicionar uma nova postagem. Veremos isso no próximo capítulo.