Upload de archivos en embed forms con Symfony 1.2

Realizando un proyecto usando Symfony 1.2.2 surgió la necesidad de tener un form en el cual se sube una imagen, y embebido en ese form otro form, el cual sube otro archivo.  Sin embargo al usar este formulario, resulta que el archivo que se encontraba en el formulario embebido no funcionaba correctamente. Afortunadamente, luego de mucha investigación encontré el motivo del problema.

Luego de probar todas las ideas que se me iban ocurriendo sin éxito, decidí ahondar un poco en el código e Symfony para ver que estaba pasando.

Como sabemos aquellos que llevamos un tiempo programando en PHP, el formato del array $_FILES dista muchísimo de ser el más cómodo para trabajar, por lo tanto, symfony, cuando procesa los archivos de un formulario llama al método estático sfForm::convertFileInformation el cual tiene por objetivo convertir el array de archivos en algo más utilizable. Lamentablemente la salida de este método, cuando se tienen archivos tanto en el formulario principal como embebido no es el correcto y ocasiona el problema que estaba experimentando.

Cuando ya estaba dispuesto a parchear el framework decidí buscar en internet si alguien había encontrado una solución y a mi problema, y afortunadamente encontré en el Trac del proyecto Symfony alguien que reportó el mismo error que yo tenía (ticket #5075)  proponiendo una solución que funciona de maravillas para mi.

Es suficiente con llamar al sfForm::bind de la siguiente manera para que se procese correctamente el array de archivos

$this->form->bind($request->getParameter('media_file'), swToolbox::convertFileInformation($request->getFiles('media_file')));

De esta manera se preprocesa el array enviado pero de forma correcta, para que el resto del framework funcione. Dado que esta solución anda muy bien, y se incluye el framework 1.2.2 por default, no entiendo el motivo por el cual no fue actualizado el código de sfForm para ya contemplar esta solución.

En todo caso, este pequeño bug me llevó varias horas detectarlo y solucionarlo, pero resultó ser más fácil de lo que esperaba.


2 Responses to “Upload de archivos en embed forms con Symfony 1.2”

  1. Hola!
    Mira tengo el mismo problema. Estuve probando el código ese que comentaste.
    Donde habría que agregar esa línea? Dentro del método configure() del formulario que embebe el otro form?

    Tendrías algún ejemplo del uso de este código porque no lo entiendo del todo. Soy bastante nuevo con symfony y estoy intentando hacer un sistema de prueba que contiene una galería de fotos desde el backend. Este tema de la galería me tiene bastante trabado. Que me recomendas?

    Desde ya muchas gracias!

  2. No estoy seguro si dentro del configure() se podría poner, hace mucho que no utilizo symfony (he estado programando en otros lenguajes ultimamente) por lo que estoy medio oxidado.

    Lo que si estoy seguro es que yo agregé esa linea en el action que maneja el formulario, justo antes de validarlo.

    Copio a continuaciń una pequeña parte del código de mi proyecto, algo modificada para evitar problemas.

    /**
    * Este es el action que muestra y procesa la respuesta del formulario
    * El formulario principal se llama "comentario" y el formulario embebido
    * tiene por nombre "documento".
    */
    public function executeComentario(sfWebRequest $request){

    $this->form = new ComentarioForm();
    if($request->isMethod('post'))
    {
    $this->form->bind($request->getParameter('comentario'), swToolbox::convertFileInformation($request->getFiles('comentario')));
    if($this->form->isValid())
    {
    $comentario = new Comentario();

    // Cargo los datos desde el array
    $comentario->fromArray($this->form->getValues());

    // Upload del archivo del formulario principal.
    // UploadArchivo es una funcion simplemente guarda la imagen en disco y actualiza el objeto $comentario
    $this->uploadArchivo($comentario, $this->form->getValue('imagen'));
    $comentario->save();

    // Upload del archivo en el formulario embebido
    // Difernete funcion, pero más o menos hacemos lo mismo que con la imagen.
    $documento = $this->form->getValue('documento');
    if($documento['fichero']) $this->adjuntarDocumento($comentario, $documento['fichero'], $request);

    // siempre luego de un post, hacer un redirect.
    // De esta manera, si el usuario preciona f5, el formulario no se envia dos veces.
    $this->redirect("comentario/gracias";
    }
    }
    }

    El único consejo que te puedo dar, es que tal vez deberías dejar el tema de Forms embebidos para cuando estes un poco mas acostumbrado a Symfony. Si eres muy nuevo en este framework, esta es una característica, por lo general, no imprescindible, aunque si muy útil y beneficiosa.

    En todo caso sigue intentándolo que todo el conocimiento es bueno 🙂

Discussion Area - Leave a Comment