Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Формы

Форму в 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().

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.