En ocasiones puede ser útil desactivar temporalmente la validación de algunos elementos del formulario. Podemos hacer esto con la característica llamada validación por grupos (validation groups).
Por defecto, todos los elementos del formulario se validan. La validación por grupos permite desactivar la validación de determinados campos.
Por ejemplo, supongamos que implementamos un formulario llamado PaymentForm
que permite seleccionar un método de pago (tarjeta de crédito, transferencia
bancaria y efectivo). Si el usuario selecciona tarjeta de crédito necesitamos
que ingrese el número de tarjeta de crédito, si el usuario selecciona
transferencia bancaria debemos permitir que escriba el número de cuenta y,
finalmente, si se selecciona efectivo no es necesario agregar información.
Para este formulario debemos mostrar y ocultar dinámicamente algunos campos dependiendo de la selección que haga el usuario, esto lo haremos en el navegador web con JavaScript.
¿Como podemos validar un formulario como este en nuestra acción de controlador?
El problema es que algunos campos dependen de otros. El campo card_number
se necesita solo cuando el payment_method
es una «tarjeta de crédito» de lo
contrario es opcional. Pasa lo mismo con el campo bank_account
, se necesita
solo cuando el payment_method
es una «transferencia bancaria».
Podemos gestionar este caso de manera elegante con un grupo de validación.
La clase Form
provee el método setValidationGroup()
que acepta una lista
de los campos que queremos validar y el resto de campos se suprimen y no se
validan.
// First, we will validate the "payment_method" field.
$form->setValidationGroup(['payment_method']);
if ($form->isValid())
{
$data = $form->getData();
$paymentMethod = $data['payment_method'];
// Next, validate the dependent fields
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();
// Do something with the data
// ...
}
}
Podemos ver este ejemplo en acción en la aplicación web de ejemplo Form Demo que se distribuye junto a este libro. Solo necesitamos escribir la URL «http://localhost/payment» en nuestro navegador.