Найти в Дзене
ZDG

Разрабатываем сайт #8: Заполнение формы из модели

Предыдущие части: Действие Update, CRUD, Форма редактирования, PHP и база данных, Идентификаторы, Работаем с таблицами, Создаём базу данных, Установка MySQL

Читайте также: Как работает веб-сайт, Бэкэнд на PHP, Введение в язык PHP

В предыдущей части мы сделали обновление данных записи.

Сегодня сделаем форму для заполнения данных, которая и будет посылать эти данные на сервер.

Она у нас уже была сделана в выпуске Форма редактирования, но для добавления новой записи. Форма для обновления существующей записи такая же, но её поля должны быть заранее заполнены существующими данными.

Чтобы в HTML заполнить текстовое поле <input type="text">, нужно добавить ему атрибут value:

<input type="text" value="My Text">

В этом случае мы увидим на экране поле, которое уже заранее заполнено текстом "My Text".

Второй вид поля, <textarea>, предназначен для ввода больших текстов. А большой текст в атрибут не запишешь. Поэтому содержимое поля находится между открывающим тэгом <textarea> и закрывающим тэгом </textarea>:

<textarea>My Text</textarea>

Между этими тэгами мы можем вписать сколько угодно текста.

Вставка значения из модели

Напомню, что модель у нас – объект, содержащий запись из таблицы базы данных. Чтобы показать форму с текущими данными из модели, мы должны вписать их в соответствующие места, используя PHP:

<input type="text" name="title" value="<?=$model['title']"?>>

<textarea name="content"><?=$model['content']?></textarea>

Что ж, переделаем форму. Это будет представление, которое мы расположим в views/form.php:

Пройдёмся по изменениям. Во-первых, некоторые тэги я разбил на несколько строк, чтобы их атрибуты не сливались в одну длинную строку. Да, вы можете вставлять пробелы и переносы строк внутри тэга, если только они не находятся сразу после "<", "</".

У формы нет заголовка HTML, потому что она вставляется в контейнер main.php, как и другие представления в этом проекте. Устройство контейнера и вложенных в него представлений мы разбирали в предыдущей части.

Модель в данном случае называется $data, так как передаётся через одноимённый параметр функции render() контроллера note.php.

Также изменился атрибут action тэга <form>. Мы отправляем данные формы на контроллер note.php, передавая в URL action=update и, что самое главное, id=..., то есть идентификатор существующей записи.

Теперь, если нажать на ссылку редактирования существующей записи с id=1:

-2

мы должны увидеть форму с предзаполненными полями:

-3

Обратите внимание на URL в адресной строке браузера. Он тот же самый, на который мы должны отправлять форму. Просто, как обсуждалось ранее, сейчас отправки ещё не было, поэтому контроллер отдал нам представление с формой. А когда он получит данные, то перенаправит нас на другое представление (список записей). Изменим поля и попробуем сохранить:

-4

И... (после исправления пары опечаток с прошлого раза) всё работает. Запись обновилась и мы были перенаправлены на список:

-5

Добавление новой записи

Чтобы добавить новую запись, надо всего лишь отправить данные с id=0 или вообще без него. Но есть проблема: функция update() в контроллере ищет модель с указанным id, и если не находит, то убивает скрипт. С id=0 модель, конечно, не найдётся. Нужно изменить логику.

Если мы не получили id из GET-запроса, либо он равен 0, мы должны не читать модель из базы, а создать новую модель с пустыми полями. Для этого напишем функцию create_model():

-6

Создаётся массив с пустыми полями, но дату заполняем сразу текущей датой и временем.

Далее, изменяем в функции update() кусок, отвечающий за поиск модели по id:

-7

Далее, SQL-команды вставки новой записи и обновления существующей записи отличаются, поэтому нужно написать два варианта:

-8

С контроллером закончили. В страницу со списком записей (views/index.php) также добавим ссылку "Новая запись":

<a href="/controllers/note.php?action=update">Новая запись</a>

-9

И готово. Теперь мы можем создавать новые записи и редактировать существующие.

Читайте дальше: Финал CRUD и SQL-инъекции