Creazione e modifica dei post
È fantastico! Abbiamo un nuovo blog super cool, le persone discutono animatamente nei commenti e noi abbiamo finalmente un po' di tempo per programmare ulteriormente. Sebbene Adminer sia uno strumento eccellente, non è del tutto ideale per scrivere nuovi post sul blog. Probabilmente è il momento giusto per creare un semplice form per aggiungere nuovi post direttamente dall'applicazione. Facciamolo.
Iniziamo progettando l'interfaccia utente:
- Nella pagina iniziale aggiungeremo un link “Scrivi un nuovo post”.
- Questo link visualizzerà un form con un titolo e una textarea per il contenuto del post.
- Quando clicchiamo sul pulsante Salva, il post verrà salvato nel database.
Successivamente aggiungeremo anche il login e permetteremo l'aggiunta di post solo agli utenti loggati. Ma questo più tardi. Quale codice dobbiamo scrivere ora affinché tutto funzioni?
- Creeremo un nuovo presenter con un form per aggiungere post.
- Definiremo un callback che verrà eseguito dopo l'invio riuscito del form e che salverà il nuovo post nel database.
- Creeremo un nuovo template su cui sarà presente quel form.
- Aggiungeremo un link al form nel template della pagina principale.
Nuovo presenter
Chiameremo il nuovo presenter EditPresenter e lo salveremo in app/Presentation/Edit/EditPresenter.php. Ha anche bisogno di connettersi al database, quindi scriveremo di nuovo un costruttore che richiederà la connessione al database:
<?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, ) { } } Form per il salvataggio dei post
Abbiamo già spiegato i form e i componenti durante la creazione dei commenti. Se non è ancora chiaro, andate a rivedere la creazione di form e componenti, noi aspetteremo qui ;)
Ora aggiungiamo questo metodo al presenter EditPresenter:
protected function createComponentPostForm(): Form { $form = new Form; $form->addText('title', 'Titolo:') ->setRequired(); $form->addTextArea('content', 'Contenuto:') ->setRequired(); $form->addSubmit('send', 'Salva e pubblica'); $form->onSuccess[] = $this->postFormSucceeded(...); return $form; } Salvataggio di un nuovo post dal form
Continuiamo aggiungendo un metodo che elabori i dati dal form:
private function postFormSucceeded(array $data): void { $post = $this->database ->table('posts') ->insert($data); $this->flashMessage("Il post è stato pubblicato con successo.", 'success'); $this->redirect('Post:show', $post->id); } Solo un rapido riepilogo: questo metodo ottiene i dati dal form, li inserisce nel database, crea un messaggio per l'utente sull'avvenuto salvataggio del post e reindirizza alla pagina con il nuovo post, così vedremo subito come appare.
Pagina per la creazione di un nuovo post
Creiamo ora il template Edit/create.latte:
{block content} <h1>Nuovo post</h1> {control postForm} Tutto dovrebbe essere già chiaro. L'ultima riga renderizza il form che creeremo a breve.
Potremmo creare anche il metodo renderCreate() corrispondente nel presenter, ma non è necessario. Non abbiamo bisogno di ottenere dati dal database e passarli al template, quindi quel metodo sarebbe vuoto. In questi casi, il metodo render<View> può essere omesso.
Link per la creazione dei post
Probabilmente sapete già come aggiungere un link a EditPresenter e alla sua azione create. Provateci.
Basta aggiungere al file app/Presentation/Home/default.latte:
<a n:href="Edit:create">Scrivi un nuovo post</a> Modifica dei post
Ora aggiungeremo anche la possibilità di modificare un post. Sarà molto semplice. Abbiamo già pronto il form postForm e possiamo usarlo anche per la modifica.
Aggiungiamo una nuova pagina edit al presenter EditPresenter:
public function renderEdit(int $id): void { $post = $this->database ->table('posts') ->get($id); if (!$post) { $this->error('Post non trovato'); } $this->getComponent('postForm') ->setDefaults($post->toArray()); } E creiamo un altro template Edit/edit.latte:
{block content} <h1>Modifica post</h1> {control postForm} E modifichiamo il metodo postFormSucceeded, che sarà in grado sia di aggiungere un nuovo articolo (come fa ora) sia di modificare un articolo già esistente:
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('Il post è stato pubblicato con successo.', 'success'); $this->redirect('Post:show', $post->id); } Se il parametro id è disponibile, significa che modificheremo il post. In tal caso, verifichiamo che il post richiesto esista davvero e, in caso affermativo, lo aggiorniamo nel database. Se il parametro id non è disponibile, significa che dovrebbe essere aggiunto un nuovo post.
Ma da dove viene il parametro id? Si tratta del parametro che è stato inserito nel metodo renderEdit.
Ora possiamo aggiungere un link al template app/Presentation/Post/show.latte:
<a n:href="Edit:edit $post->id">Modifica post</a> Shrnutí
Il blog è ora funzionante, i visitatori commentano attivamente e non abbiamo più bisogno di Adminer per la pubblicazione. L'applicazione è completamente indipendente e chiunque può aggiungere un nuovo post. Aspetta un attimo, probabilmente non è del tutto corretto che chiunque – e intendo davvero chiunque abbia accesso a Internet – possa aggiungere nuovi post. È necessaria una qualche forma di sicurezza affinché solo un utente loggato possa aggiungere un nuovo post. Vedremo questo nel prossimo capitolo.