Предыдущие части: Действие 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:
мы должны увидеть форму с предзаполненными полями:
Обратите внимание на URL в адресной строке браузера. Он тот же самый, на который мы должны отправлять форму. Просто, как обсуждалось ранее, сейчас отправки ещё не было, поэтому контроллер отдал нам представление с формой. А когда он получит данные, то перенаправит нас на другое представление (список записей). Изменим поля и попробуем сохранить:
И... (после исправления пары опечаток с прошлого раза) всё работает. Запись обновилась и мы были перенаправлены на список:
Добавление новой записи
Чтобы добавить новую запись, надо всего лишь отправить данные с id=0 или вообще без него. Но есть проблема: функция update() в контроллере ищет модель с указанным id, и если не находит, то убивает скрипт. С id=0 модель, конечно, не найдётся. Нужно изменить логику.
Если мы не получили id из GET-запроса, либо он равен 0, мы должны не читать модель из базы, а создать новую модель с пустыми полями. Для этого напишем функцию create_model():
Создаётся массив с пустыми полями, но дату заполняем сразу текущей датой и временем.
Далее, изменяем в функции update() кусок, отвечающий за поиск модели по id:
Далее, SQL-команды вставки новой записи и обновления существующей записи отличаются, поэтому нужно написать два варианта:
С контроллером закончили. В страницу со списком записей (views/index.php) также добавим ссылку "Новая запись":
<a href="/controllers/note.php?action=update">Новая запись</a>
И готово. Теперь мы можем создавать новые записи и редактировать существующие.
Читайте дальше: Финал CRUD и SQL-инъекции