Чат PHP-разработчиков
Редактирование статей на сайте на PHP

Редактируем статьи в блоге на PHP

Сегодня мы создадим еще один компонент нашего блога – систему редактирования статей.

В одном из прошлых уроков мы уже добавляли роутинг для редактирования статей:

src/routes.php

Код доступен только после покупки курса ООП в PHP.

Он останется прежним. Переходим к экшену. Сейчас он выглядит вот так:

src/MyProject/Controllers/ArticlesController.php

Код доступен только после покупки курса ООП в PHP.

Нам требуется его переписать, чтобы статья обновлялась данными из POST-запроса. Делаем:

Код доступен только после покупки курса ООП в PHP.

Теперь давайте добавим соответсвующий шаблон.

templates/articles/edit.php

Код доступен только после покупки курса ООП в PHP.

А теперь добавим соответствующий метод в модели:

src/MyProject/Models/Articles/Article.php

Код доступен только после покупки курса ООП в PHP.

Заходим теперь на страничку редактирования статьи:
http://myproject.loc/articles/14/edit

Редактирование статьи

Вводим какой-нибудь новый текст и заголовок.
Изменяем статью

Нажимаем на кнопку обновления и вуаля – статья обновлена.
Обновленная статья

Домашнее задание
  1. При попытке обновления статьи НЕ админом – бросайте исключение ForbiddenException, как в прошлом уроке.
  2. Добавьте ссылку на странице показа статьи с текстом «Редактировать», которая будет вести на страницу редактирования этой статьи.
  3. Сделайте так, чтобы эта ссылка показывалась только если пользователь залогинен и он админ.
Онлайн обучение PHP
Путь с полного нуля до джуниора!
Начать бесплатно
Читайте также
Курс программирования на PHP
Подготовка до уровня устройства на работу!
Начать бесплатно
Комментарии (6)


Kirill.K

ArticlesController/edit:

if(!$this->user->isAdmin()) {
            throw new Forbidden('Для редактирования статьи нужно обладать правами администратора');
        }

Templates/articles/view:

<?php if(isset($_COOKIE['token']) and $user->isAdmin()): ?>
    <p><a href="http://myproject.loc/articles/<?= $article->getId() ?>/edit">Редактировать статью</a></p>
<? endif; ?>
ivashkevich
isset($_COOKIE['token'])

Этого достаточно, чтобы знать, что пользователь залогинен? А если в этой куке ерунда какая-нибудь бессмысленная записана? Тогда $user будет null, и при попытке вызвать у него метод произойдет ошибка.

Kirill.K

Хм... тогда, наверное, так:

<?php if($_COOKIE['token'] === $user->getId() . ':' . $user->getAuthToken() and $user->isAdmin()): ?>
    <p><a href="http://myproject.loc/articles/<?= $article->getId() ?>/edit">Редактировать статью</a></p>
<? endif; ?>

Громоздко, конечно, как то получается...

ivashkevich

Да нет, все проще. Если пользователь не авторизован, то в $user будет null.
Достаточно проверить:

if ($user !== null && $user->isAdmin())
ilyaOrlov

Проверил свой код несколько раз. Всё так, как вы написали. Но при редактировании, если передавать какое-то поле пустым, то вылетает ошибка о том, что $article->getId() становится null в шаблоне edit.php. Решил проблему передачей вместе с ошибкой еще и массива $article.

$this->view->renderHtml('articles/edit.php', ['error' => $e->getMessage(), 'article' => $article]);

Тогда все работает. В чем проблема, не подскажите?

ivashkevich

Была ошибка, исправил. Спасибо. В шаблоне использовалась $article, я почему-то подумал, что если произойдет ошибка, то в шаблоне мы статью не будем выводить.

Самый понятный курс PHP
Онлайн-уроки в удобное время!
Начать бесплатно
Популярное за сутки
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Сейчас читают
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Новые статьи
Логические задачи с собеседований