CRUD / Удаление объектов

Удаление объектов — это буква D в слове CRUD. Самая простая операция. В принципе есть 100500 способов ее реализовать. Но самый простой это сделать отдельный контроллер который будет отвечать за удаление и отправить на него post запрос через форму.

Только чтобы не удалить лишних на создавайте себе новых объектов специально под удаление, я вот три штуки сделал:

И добавим кнопочку для удаления

получится вот так:

Так как удалять имеет смысл по идентификатору, ибо он уникальный, то передать этот самый идентификатор можно двумя способами

Способ №1

В любом случае создаем контроллер для удаления:

<?php

// в кой то веки наследуемся не от TwigBaseController а от BaseController
class SpaceObjectDeleteController extends BaseController {
    public function post(array $context)
    {
        $id = $_POST['id']; // взяли id

        $sql =<<<EOL
DELETE FROM space_objects WHERE id = :id
EOL; // сформировали запрос
        
        // выполнили
        $query = $this->pdo->prepare($sql);
        $query->bindValue(":id", $id);
        $query->execute();
    }
}

подключим его в index.php

$router->add("/space-object/delete", SpaceObjectDeleteController::class);

теперь подвязываем к кнопочке

пробуем тыкать:

ошибка! Почему? Потому что мы же запрашиваем id вот так $id = $_POST['id']; но не передаем его с формы.

А чтобы передать надо инпут добавить. Давайте добавим:

тут кстати сразу один интересный момент, мы же можем сразу в инпуте в атрибуте value указать значение по умолчанию. Вот мы и указываем в нашем случае object.id, глянем как это выглядит

то есть с одной стороны мы проблему с отсутствием поля решили, а с другой стороны нафига они отображаются то…

К счастью, есть способ скрыть эти поля. Для этого у инпутов в атрибуте type надо указать hidden, вот так:

и тогда у нас как бы поле формально будет на форме. Но визуально его не будет видно:

попробуем тыкнуть:

такс, нас перекинуло на пустую страницу… но если вернуться обратно на главную, то объект действительно исчезнет:

Но естественно идея отправлять пользователя на пустую страницу так себе, поэтому существует такое понятие как редирект.

Это когда вы из контроллера, вместо ответа в виде текста возвращает запрос браузеру на переход на другую страницу сайта. Браузер его считывает и автоматически делает GET запрос на указанный в редиректе адрес.

Делается это так:

class SpaceObjectDeleteController extends BaseController {
    public function post(array $context)
    {
        // ...
        
        $query->execute();
        
        // устанавливаем заголовок Location, на новый путь, я хочу перейти на главную страницу поэтому пишу /
        header("Location: /");
        exit; // после  header("Location: ...") надо писать exit
    }

пробуем:

красота! =)

Способ №2

второй способ, чуть более моднявый. Заключается в том, что вы вместо того чтобы использовать input под id, передаете id в action формы.

То есть создаем новый маршрут в роутере:

в контроллере вместо $_POST используем $this->params

<?php

class SpaceObjectDeleteController extends BaseController {
    public function post(array $context)
    {
        $id = $this->params['id']; // заменил $_POST 

        // ...
        exit;
    }

ну и на форме, оставляем только кнопку и правленый action:

пробуем:

работает так же =)

6

Тут рассмотрим удаление объектов. Все так просто, что я даже задание придумать не могу 😢