Формы
Форму в CakePHP строит помощник Form. Ему передают запись, и он сам выбирает тип поля по типу столбца, подставляет текущие значения, показывает ошибки проверки и добавляет токен защиты.
Шаблон формы
Создайте файл templates/Articles/add.php:
<h1>Новая статья</h1>
<?= $this->Form->create($article) ?>
<?= $this->Form->control('title') ?>
<?= $this->Form->button('Сохранить') ?>
<?= $this->Form->end() ?>create() открывает тег формы, control() выводит подпись, поле и место для ошибки, end() закрывает форму.
Действие
// src/Controller/ArticlesController.php
public function add()
{
$article = $this->Articles->newEmptyEntity();
if ($this->request->is('post')) {
$article = $this->Articles->patchEntity($article, $this->request->getData());
if ($this->Articles->save($article)) {
return $this->redirect(['action' => 'index']);
}
}
$this->set(compact('article'));
}Одно действие и показывает форму, и принимает её. Откройте /articles/add, введите заголовок и нажмите кнопку — вы попадёте в список с новой статьёй. Если отправить пустую форму, сохранение не пройдёт, запись с ошибками вернётся в шаблон, и под полем появится «Введите заголовок.».
Больше полей
<fieldset>
<?= $this->Form->control('title', ['label' => 'Заголовок']) ?>
<?= $this->Form->control('body', ['label' => 'Текст', 'rows' => 8]) ?>
<?= $this->Form->control('published', ['label' => 'Опубликовать']) ?>
</fieldset>Для столбца text получится textarea, для boolean — флажок. Второй аргумент задаёт подпись и атрибуты поля.
Настройки поля
| Настройка | Что делает |
|---|---|
'label' => 'Заголовок' | Текст подписи |
'type' => 'email' | Тип поля: email, password, number, date |
'options' => ['a' => 'А', 'b' => 'Б'] | Выпадающий список |
'empty' => 'Выберите…' | Пустой пункт списка |
'required' => false | Убирает атрибут обязательного поля |
Изменение записи
public function edit(int $id)
{
$article = $this->Articles->get($id);
if ($this->request->is(['patch', 'post', 'put'])) {
$this->Articles->patchEntity($article, $this->request->getData());
if ($this->Articles->save($article)) {
return $this->redirect(['action' => 'index']);
}
}
$this->set(compact('article'));
}Шаблон templates/Articles/edit.php содержит ту же форму. Получив существующую запись, Form->create() заполнит поля её значениями. По адресу /articles/edit/1 откроется форма первой статьи.
Кнопка удаления
Удаление должно отправляться методом POST. Помощник создаёт для ссылки скрытую форму:
<p>
<?= $this->Form->postLink(
'Удалить',
['action' => 'delete', $article->id],
['confirm' => 'Удалить статью?'],
) ?>
</p>Перед отправкой браузер спросит подтверждение. Действие delete() получает запись через get($id), вызывает $this->Articles->delete($article) и перенаправляет на список.
Защита от CSRF
CSRF — атака, при которой чужой сайт отправляет форму от имени посетителя. В новом проекте защита уже включена в src/Application.php: Form->create() добавляет в форму скрытое поле с токеном, и запрос без него отклоняется.
Частая ошибка
Форму, написанную обычными тегами <form> и <input>, CakePHP отклонит с ошибкой о токене CSRF: скрытого поля в ней нет. Пользуйтесь помощником Form и не забывайте Form->end().