Los formularios de Symfony 1.4

13.6. Validadores lógicos

13.6.1. sfValidatorAnd

sfValidatorAnd considera válido el valor original solamente si pasa correctamente una lista de validadores.

El constructor de sfValidatorAnd toma como primer argumento una lista de validadores:

$v = new sfValidatorAnd(
  array(
    new sfValidatorString(array('max' => 255)),
    new sfValidatorEmail(),
  ),
  array('halt_on_error' => true),
  array('invalid' => 'El valor indicado debe ser un email de menos de 255 caracteres de longitud.')
);

Por defecto el validador guarda en un array todos los mensajes de error lanzados por los validadores incluidos. También puede mostrar un único mensaje de error si se indica una cadena de texto para el error de tipo invalid, tal y como se muestra en el ejemplo anterior.

Opción Error Descripción
halt_on_error - Indica si la validación se debe detener después del primer error o si debe continuar (por defecto vale false)

El orden de los validadores es muy importante cuando se establece a true la opción halt_on_error.

La lista de validadores incluidos también se puede gestionar con los métodos getValidators() y addValidator().

13.6.2. sfValidatorOr

sfValidatorOr considera válido el valor original si pasa correctamente al menos uno de los validadores indicados.

El constructor de sfValidatorOr toma como primer argumento una lista de validadores:

$v = new sfValidatorOr(
  array(
    new sfValidatorRegex(array('pattern' => '/\.com$/')),
    new sfValidatorEmail(),
  ),
  array(),
  array('invalid' => 'El valor indicado debe ser o un dominio .com o una dirección de email.')
);

Por defecto el validador guarda en un array todos los mensajes de error lanzados por los validadores incluidos. También puede mostrar un único mensaje de error si se indica una cadena de texto para el error de tipo invalid, tal y como se muestra en el ejemplo anterior.

La lista de validadores incluidos también se puede gestionar con los métodos getValidators() y addValidator().

13.6.3. sfValidatorSchema

Schema validator: Yes

sfValidatorSchema consiste en un validador compuesto por varios campos. Cada campo se forma mediante un nombre y un validador:

$v = new sfValidatorSchema(array(
  'nombre' => new sfValidatorString(),
  'pais'   => new sfValidatorI18nChoiceCountry(),
));

Nota Los formularios se definen mediante un esquema de validadores de la clase sfValidatorSchema.

Este validador sólo acepta como argumento un array, por lo que lanza una excepción de tipo InvalidArgumentException en cualquier otro caso.

Además, a este tipo de validador también se le puede asignar un pre-validador (que se ejecuta antes que cualquier otro validador) y un post-validador (que se ejecuta sobre los valores limpios después de todos los demás validadores).

Tanto el pre-validador como el post-validador, son esquemas de validadores a los que se les pasan todos los valores. Para establecer este tipo de validadores, se emplean los métodos setPreValidator() y setPostValidator():

$v->setPostValidator(
  new sfValidatorCompare('password1', '==', 'password2')
);
Opción Error Descripción
allow_extra_fields extra_fields Si vale false, el validador muestra un error cuando el usuario envía más campos que los que tenía el formulario original (por defecto vale false)
filter_extra_fields - Si vale true, el validador elimina los campos adicionales del array de valores limpios (por defecto vale true)
Error Variables Valor por defecto (se muestra en inglés)
extra_fields %field% Unexpected extra form field named "%field%".
post_max_size The form submission cannot be processed. It probably means that you have uploaded a file that is too big.

sfValidatorSchema permite acceder a sus validadores utilizando la notación de los arrays:

$vs = new sfValidatorSchema(array('nombre' => new sfValidatorString()));

$validadorNombre = $vs['nombre'];

unset($vs['nombre']);

La notación de los arrays también se puede emplear para acceder a los esquemas de validadores anidados:

$vs['autor']['nombre']->setMessage('invalid', 'El nombre no es válido.');

Si el tamaño de los datos enviados en el formulario excede del valor de la opción post_max_size del archivo de configuración php.ini, se lanza un error de tipo post_max_size.

13.6.4. sfValidatorSchemaCompare

sfValidatorSchemaCompare permite comparar dos de los valores incluidos en el array de valores originales:

$v = new sfValidatorCompare('password1', '==', 'password2');
Opción Error Descripción
left_field - El nombre del primer campo que se compara
operator - El operador utilizado en la comparación
right_field - El nombre del segundo campo que se compara
throw_global_error - Indica si se lanza un error global (por defecto vale false) o si se lanza un error asociado con el primer campo que se compara

Los operadores disponibles para realizar comparaciones son los siguientes:

  • sfValidatorSchemaCompare::EQUAL o también ==
  • sfValidatorSchemaCompare::NOT_EQUAL o también !=
  • sfValidatorSchemaCompare::LESS_THAN o también <
  • sfValidatorSchemaCompare::LESS_THAN_EQUAL o también <=
  • sfValidatorSchemaCompare::GREATER_THAN o también >
  • sfValidatorSchemaCompare::GREATER_THAN_EQUAL o también >=

Por defecto, el validador lanza un error de tipo global. Sin embargo, si la opción throw_global_error vale true, se lanza un error relacionado con el primer campo comparado.

El mensaje del error de tipo invalid puede utilizar las siguientes variables: %left_field%, %right_field% y %operator%.

13.6.5. sfValidatorSchemaFilter

sfValidatorSchemaFilter convierte un validador normal en un esquema de validadores. En ocasiones es útil en el post-validador:

$v = new sfValidatorSchema();
$v->setPostValidator(
  new sfValidatorSchemaFilter('email', new sfValidatorEmail())
);