A free and open-source book on ZF3 for beginners

Translation into this language is not yet finished. You can help this project by translating the chapters and contributing your changes.

11.2. Usar validación por grupos

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.


Top