Een Post verwijderen - DELETE

Waarschijnlijk heb je bij het testen wat posts toegevoegd. Die je misschien niet wilt tonen op je pagina. Deze zou je graag willen kunnen verwijderen. We gaan deze functionaliteit maken door een verwijder button toe te voegen bij elke 'post'. Normaal gesproken doe je dit op een admin pagina of zoiets.

Onder elke post voegen we een verwijder button toe.

Om te weten welke post verwijderd moet gaan worden. Is het belangrijk dat de id van de post wordt meegestuurd bij het klikken op de button. Verwijderen is een actie op de database dus dit moet gedaan worden met een method="post".
Let op dat we ook een csrf-token moeten meesturen, omdat we action="post" gebruiken.

Er zijn twee manieren om een id mee te sturen.

Optie 1
Je stuurt de id mee in een hidden input veld.

<form method="post" action="/posts-destroy">
    <?=csrf()?>
    <input type="hidden" name="id" value="<?= $post['id'] ?>">
    <input type="submit" value="Verwijder"  class="...">
</form>

De route in je router zal er dan als volgt uit zien.

$route->post('posts-destroy', "controllers/posts-destroy.php");

Optie 2
Je stuurt de id mee in de url van je action

<form method="post" action="/posts-destroy/<?= $post['id'] ?>">
    <?=csrf()?>
    <input type="submit" value="Verwijder"  class="...">
</form>

De route in je router zal er dan als volgt uitzien.

$route->post('posts-destroy/{id}', "controllers/posts-destroy.php");

In de route wordt dan gedefinieerd dat na de slash het id volgt.

Met beide opties kan je in de controller posts-destroy.php het meegestuurde id gebruiken

$request->id
// of met
$_POST['id']

 

 

Opgave J5.1 - Verwijderen

 

Pas views/posts.view.php aan zodat de button erbij komt

...
<?php foreach ($posts as $post): ?>
    <div class="border border-1 rounded p-4 bg-gray-50 my-2">
        <h2 class="font-bold"><?= $post['title']; ?></h2>
        <?= $post['content'] ?>
        <form method="post" action="/posts-destroy/<?= $post['id'] ?>">
            <?=csrf()?>
            <input type="submit" value="Verwijder" name="delete"
                   class="bg-red-600 text-white rounded px-2 py-1 hover:bg-red-300 cursor-pointer">
        </form>
    </div>
<?php endforeach; ?>
...

En voeg de juiste route toe

/app/views/posts.view.php
/app/router.php

 

Opgave J5.2 - Verwijderen (controller)

 

Nu gaan we een controller aanmaken die de post verwijderd

 

Uitwerking

/app/controllers/posts-destroy.php

 

Opgave J5.3 - Bevestiging vragen

Wat we hebben gemaakt werkt. Maar graag zou je na het klikken op een verwijder button eerst een bevestiging van de gebruiker willen hebben.

In het framewerk is daarvoor de logica al aanwezig.

Om dit voor elkaar te krijgen kan je de verwijder button vervangen door de delete-button view.

<?php foreach ($posts as $post): ?>
    <div class="border border-1 rounded p-4 bg-gray-50 my-2">
        <h2 class="font-bold"><?= $post['title']; ?></h2>
        <?= $post['content'] ?>
        <?php
        //Opgave J5.3 - Bevestigingsdialoog voor het verwijderen van een post
        view("parts/delete-button", [
            'titel' => 'Post verwijderen',
            'content' => 'Weet je zeker dat je deze post wilt verwijderen?',
            'action' => '/posts-destroy/' . $post['id'],
        ]); ?>
    </div>

De view delete-button heeft drie parameters nodig

Vervang de verwijder button door de delete-button view.

Uitwerking

/app/views/posts.view.php