Создание и редактирование записей

Создание и редактирование записей

Как замечательно. У вас есть очень крутой блог, люди спорят в комментариях, и вы нашли больше времени для программирования. Хотя нам нравится Adminer, не так уж удобно писать в нем записи в блогах. Пришло время добавить простую форму для добавления новых сообщений непосредственно из нашего приложения. Давайте сделаем это.

Давайте начнем с проектирования пользовательского интерфейса:

  1. На домашней странице добавим ссылку «Написать новое сообщение».
  2. По нажатию появится форма с заголовком и текстовым полем для контента.
  3. Когда вы нажмете кнопку «Сохранить», сообщение сохраниться.

Позже мы также добавим аутентификацию и разрешим только зарегистрированным пользователям добавлять новые записи. Но давайте сделаем это позже. Какой код нам нужно написать, чтобы он работал?

  1. Добавить ссылку в шаблон главной страницы (app/presenters/templates/Homepage/default.latte)
  2. Создайте новую страницу (шаблон), которая отобразит форму
  3. Определить форму добавления нового сообщения
  4. Определите обработчик, который будет выполнен, когда форма будет отправлена, чтобы сохранить сообщение.

Ссылка для новых записей

Вы уже должны знать, как добавить новую ссылку. Так что попробуйте сами.

Если вы не уверены, добавьте этот код где-нибудь в app/presenters/templates/Homepage/default.latte:

<a n:href="Post:create">Новая запись</a>

Страница для создания новой записи

Ссылка, которую мы только что создали, указывает на PostPresenter и его действие create. Мы можем добавить новый метод renderCreate, но на самом деле это не является необходимым. Нам не нужно извлекать данные из базы данных и помещать их в шаблон, поэтому метод будет пустым. В таком случае он вообще может не существовать.

Если вы хотите, у вас может быть пустой метод; Возможно, у него будет некоторый код позже. Это зависит от вас.

Давайте просто создадим шаблон (app/presenters/templates/Post/create.latte):

{block content}
 <h1>Новая запись</h1>

{control postForm}

Сейчас все очевидно. Последняя строка для отображения формы, которую мы собираемся создать.

Форма для сохранения записей

Мы говорили уже про формы и компоненты когда добавляли поддержку комментариев. Если вы запутались в этой теме, посмотрите как работают компоненты и формы, затем вернемся обратно 😉

Теперь добавьте этот метод в PostPresenter:

protected function createComponentPostForm()
 {
 $form = new Form;
 $form->addText('title', 'Заголовок:')
 ->setRequired();
 $form->addTextArea('content', 'Содержимое:')
 ->setRequired();

$form->addSubmit('send', 'Сохранить и опубликовать');
 $form->onSuccess[] = [$this, 'postFormSucceeded'];

return $form;
 }

Сохранение новой записи из формы

Продолжайте, добавив метод обработчика.

public function postFormSucceeded($form, $values)
 {
 $post = $this->database->table('posts')->insert($values);

$this->flashMessage("Запись опубликована", 'success');
 $this->redirect('show', $post->id);
 }

Краткое объяснение: извлекаются значения из формы, вставляются в базу данных, создается сообщение для пользователя о том, что запись была успешно сохранена, и перенаправляется на страницу, на которой публикуется эта публикация, чтобы вы могли видеть, как она выглядит.

Редактирование записей

Давайте также добавим возможность редактировать существующие записи. Это довольно просто — у нас уже есть postForm, и мы также можем использовать его для редактирования. Мы добавим новую страницу edit и обновим обработчик формы, который сможет либо добавить новую запись (как сейчас), либо изменить существующую.

Добавьте метод в PostPresenter:

public function actionEdit($postId)
 {
 $post = $this->database->table('posts')->get($postId);
 if (!$post) {
 $this->error('Запись не найдена');
 }
 $this['postForm']->setDefaults($post->toArray());
 }

Обратите внимание, что этот метод называется actionEdit (а не renderEdit, как вы могли ожидать). Методы Render используются для передачи данных в шаблон. Действия, с другой стороны, могут делать гораздо больше, они должны проверить, если страница может отображаться с помощью текущего посетителя или пользователя, и они должны делать большую часть тяжелой работы, которая не принадлежит формировать обработчик. Разумеется, передача данных в шаблон также будет работать в методах действий, но рекомендуется не делать этого из-за разделения обязанностей. Ваш код просто более синоптический, когда вы разделяете код на методы визуализации и действия.

Теперь создадим шаблон (app/presenters/templates/Post/edit.latte):

{block content}
 <h1>Изменить запись</h1>

{control postForm}

Давайте также расширим обработчик формы:

public function postFormSucceeded($form, $values)
 {
 $postId = $this->getParameter('postId');

if ($postId) {
 $post = $this->database->table('posts')->get($postId);
 $post->update($values);
 } else {
 $post = $this->database->table('posts')->insert($values);
 }

$this->flashMessage('Запись опубликована', 'success');
 $this->redirect('show', $post->id);
 }

Когда передается параметр postId, значит запись редактируется. В этом случае мы будем проверять, что запись действительно существует, и если это так, мы обновим ее в базе данных. Если параметр postId не передан, значит нужно добавить новую запись.

Но откуда взялся параметр postId? Это параметр, передаваемый методу actionEdit. Добавьте ссылку в шаблоне app/presenters/templates/Post/show.latte:

<a n:href="edit $post->id">Изменить эту запись</a>

Итоги

Блог работает, люди быстро комментируют, и мы больше не используем Adminer для добавления новых записей. Он полностью независим, и даже обычные люди могут размещать записи в нем. Но подождите, наверное, это не нормально, что любой, я имею в виду, действительно любого в Интернете, может опубликовать запись в вашем блоге. Требуется некоторая форма проверки подлинности, чтобы можно было публиковать только зарегистрированным пользователям. Мы добавим ее в следующей главе.

Яндекс.Метрика