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.

10.6. El contenedor InputFilter y los archivos subidos

Como podemos recordar, los filtros y validadores que están asociados a un modelo de formulario se guardan generalmente en el contenedor InputFilter que consiste de entradas (una entrada se representa generalmente con la clase Input que pertenece al espacio de nombres Zend\InputFilter). Con los campos comunes de un formulario, los filtros se ejecutan antes que los validadores y los validadores se ejecutan después de los filtros.

Sin embargo, con los archivos subidos existen algunas importantes diferencias:

  1. Para guardar las reglas de validación se debe usar la clase especial FileInput en lugar de la clase Input.
  2. Los validadores se aplican antes que los filtros.

10.6.1. FileInput

Para almacenar las reglas de validación para los archivos que se suben debemos usar la clase FileInput en lugar de la acostumbrada clase Input.

En nuestro método privado addInputFilter() del modelo de formulario, agregamos las reglas de validación para la entrada del archivo de la siguiente manera:

    $inputFilter->add([
        'type'     => 'Zend\InputFilter\FileInput',
        'name'     => 'file',  // Element's name.
        'required' => true,    // Whether the field is required.
        'filters'  => [        // Filters.
            // Put filter info here.
        ],
        'validators' => [      // Validators.
            // Put validator info here.
        ]
    ]);

Arriba, colocamos la llave «type» (línea 2) con el nombre de la clase Zend\InputFilter\FileInput como valor. El resto de llaves es análogo a las que usamos antes cuando agregamos reglas de validación para el modelo de formulario.

El comportamiento de la clase FileInput es diferente del comportamiento de la clase Input en los siguientes aspectos:

  1. Ella espera que los datos que se le pasan como entrada estén en el formato del arreglo $_FILES (un arreglo con las llaves tmp_name, error, type, etc).

  2. Un validador Zend\Validator\File\Upload se inserta automáticamente en la cadena de validación de entradas antes de todos los otros validadores.

  3. Los validadores insertados en la cadena de validación de entradas se ejecutan antes que los filtros insertados en la cadena de filtros. Este comportamiento es opuesto al de la clase Input.

10.6.2. Ejecutar los Validadores antes que los Filtros

Para los campos usuales de un formulario, los filtros se ejecutan generalmente antes que los validadores y los validadores se ejecutan después que los filtros. Sin embargo, para los archivos que se han subido este orden se invierte.

Para los archivos subidos, los validadores se ejecutan antes que los filtros. Este comportamiento es inverso al comportamiento usual.

Cuando trabajamos con archivos que se han subido, primero necesitamos revisar que los datos que se extraen del arreglo super-global $_FILES son correctos, para luego hacer cualquier cosa con los archivos (mover el archivo a una carpeta, renombrarlo, etc.). Por esto, los validadores de archivo se deben ejecutar primero y los filtros en segundo lugar.

Para ver como se ejecuta este proceso recordemos el flujo de trabajo típico para un formulario:

Cuando usamos la clase para entradas FileInput el flujo de trabajo es el mismo. Sin embargo es importante entender lo que sucede en cada uno de estos pasos.

Nótese que con la clase para entradas FileInput los filtros asociados solo se ejecutan si se llama al método getData().

Cuando usamos ambas clases para entradas, Input y FileInput, en nuestro filtro de entradas de formulario (que es el caso común), los filtros aún se ejecutan primero para las entradas comunes pero los validadores se ejecutan primero para las entradas de archivo.


Top