Иногда может быть полезно временно отключить валидацию некоторых элементов формы. Вы можете сделать это с помощью такой особенности, как группы валидации (validation groups).
По умолчанию, все элементы формы проходят валидацию. Группа валидации позволяет отключить валидацию некоторых полей.
Для примера, представим, что вам нужно реализовать форму под названием PaymentForm
, которая позволяет выбирать метод оплаты из нескольких альтернатив
(кредитная карта, банковский перевод и наличные). Если пользователь выбирает кредитную карту, вам также будет нужно дать ему возможность
ввести номер кредитной карты; если пользователь выбирает банковский перевод, вам будет нужно отобразить поле ввода номера банковского счета;
и наконец, в случае выбора наличных ничего показывать дополнительно не нужно.
Для данной формы вам понадобится динамически показывать и скрывать зависимые поля формы в браузере клиента с помощью JavaScript.
Как мы будем валидировать такую форму в действии контроллера? Проблема в том, что некоторые поля зависят от других полей. Поле card_number
требуется
только, когда в поле payment_method
выбрана "кредитная карта", в противном случае оно опционально. То же можно сказать и про поле bank_account
- оно требуется
только когда в поле payment_method
выбран "банковский перевод".
Мы можем элегантно справиться с данной проблемой с использованием группы валидации. Класс Form
предоставляет метод setValidationGroup()
,
который принимает список полей, которые нужно валидировать; все остальные поля подавляются и не проходят валидацию.
// Сначала проверим только поле "payment_method"
$form->setValidationGroup(['payment_method']);
if ($form->isValid())
{
$data = $form->getData();
$paymentMethod = $data['payment_method'];
// Затем проверим и зависимые поля
if ($paymentMethod=='credit_card') {
$form->setValidationGroup(['payment_method', 'card_number']);
} else if ($paymentMethod=='bank_account') {
$form->setValidationGroup(['payment_method', 'bank_account']);
}
if ($form->isValid()) {
$data = $form->getData();
// Сделаем что-нибудь с данными формы
// ...
}
}
Вы можете увидеть данный пример в действии в приложении Form Demo, которое поставляется с данной книгой. Просто введите "http://localhost/payment" URL в адресную строку браузера.