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.