En mi anterior entrada, os conté como funcionan los post validators en Symfony. En esta ocasión os voy a contar como funcionan los pre validators. Un pre validator en un validador que se ejecuta justo antes de que Symfony lance los validadores individuales de todos los campos del formulario y los post validatos que os comenté en el anterior post.
Vamos a ver un sencillo ejemplo se uso de un pre validator. Supongamos el siguiente esquema:
producto:
nombre:
type: varchar(255)
required: true
marca:
type: varchar(255)
required: true
modelo:
type: varchar(255)
required: false
en_venta:
type: boolean
precio:
type: float
required: false
En el método configure de la clase del formulario, incluimos el siguiente código:
public function configure()
{
$this->validatorSchema->setPreValidator(new sfValidatorCallback(array("callback" => array($this, "preValidate"))));
}
Utilizamos un sfValidatorCallback como pre validator, el cual se ejecuta antes que los demás validadores. La función preValidate, lo que hace es preguntar si “en_venta” existe en el array $values, si es así, es porque el campo “en_venta” esta a true. Si “en_venta” esta true, se establece el campo “precio” como obligatorio.
public function preValidate($validator, $values)
{
if (isset($values["en_venta"]))
{
$this->getValidator("precio")->setOption("required", true);
}
}
Una vez ejecutado el pre validator, con el resultado, se ejecutan los validadores de los campos de forma normal.
Como podéis comprobar el uso de los pre validators son iguales que los post validador con la particularidad que en los pre validators podemos alterar las propiedades de los campos del formulario, modificando el comportamiento de los sucesivas validaciones.