Más con Symfony

5.1. Cómo funciona un widget y un validador

5.1.1. Funcionamiento interno de sfWidgetForm

Un objeto de la clase sfWidgetForm representa la implementación visual necesaria para modificar los datos relacionados. Una cadena de texto por ejemplo se puede editar con un cuadro de texto simple o con un editor WYSIWYG. Para permitir una mejor configuración, la clase sfWidgetForm tiene dos propiedades importantes: options y attributes.

  • options: se emplean para configurar el widget (por ejemplo la consulta a la base de datos cuando se crea una lista de elementos para mostrar en una lista desplegable)
  • attributes: atributos HTML que se añaden al elemento antes de mostrarlo

Además, la clase sfWidgetForm implementa dos métodos importantes:

  • configure(): define qué opciones son opcionales y cuales obligatorias. Aunque redefinir el constructor no es una buena práctica, el método configure() se puede redefinir sin problemas.
  • render(): genera el código HTML del widget. El primer argumento del método es obligatorio e indica el nombre del widget HTML. El segundo argumento es opcional e indica el valor.

Nota Un objeto sfWidgetForm no sabe nada acerca de su nombre o su valor. El componente sólo se encarga de mostrar el widget. El nombre y el valor los gestiona un objeto de tipo sfFormFieldSchema, que es lo que une los datos con los widgets.

5.1.2. Funcionamiento interno de sfValidatorBase

La clase sfValidatorBase es la clase de la que heredan todos los validadores. El método sfValidatorBase::clean() es el más importante de esta clase, ya que comprueba si el valor es válido en función de las opciones indicadas.

Internamente el método clean() realiza diferentes acciones:

  • en las cadenas de texto elimina el posible espacio en blanco inicial y final (si se especifica la opción trim)
  • comprueba si el valor es vacío
  • invoca el método doClean() del validador

El método doClean() es el método que incluye toda la lógica de validación. No es una buena práctica redefinir el método clean(), ya que es preferible incluir toda la lógica propia en el método doClean().

Un validador también se puede utilizar como un componente independiente para comprobar la integridad de los datos introducidos. El validador sfValidatorEmail comprueba por ejemplo si el email es válido:

$v = new sfValidatorEmail();

try
{
  $v->clean($request->getParameter("email"));
}
catch(sfValidatorError $e)
{
  $this->forward404();
}

Nota Cuando se asocia el formulario con los valores de la petición, el objeto sfForm guarda tanto los valores originales (sucios) como los validados (limpios). Los valores originales se utilizan al volver a mostrar el formulario, mientras que los valores validados se utilizan en la aplicación (por ejemplo para guardar el objeto).

5.1.3. El atributo options

Los objetos sfWidgetForm y sfValidatorBase también tienen otras opciones: algunas son opcionales y otras son obligatorias. Estas opciones se definen en el método configure() de cada clase mediante:

  • addOption($nombre, $valor): define una opción con un nombre y un valor inicial
  • addRequiredOption($nombre): define una opción obligatoria

Estos dos métodos son muy útiles porque aseguran que se pasan correctamente los valores de los que dependen los validadores y los widgets.