Тут рассмотрим удаление объектов. Все так просто, что я даже задание придумать не могу 😢
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
:
пробуем:
работает так же =)