Upload de archivos con Zend Form.

Upload de archivos con Zend Form.
Upload de archivos con Zend Form.

Mi idea era subir un archivo dentro de un formulario, renombrar ese archivo con un id conseguido en esa misma operacion con el siguiente formato logo_{$id}.jpg . El problema es que cuando agregaba el setDestination del form me copiaba el archivo con su nombre original en la carpeta de destino. No conseguia renombrarlo.

Vi muchisimos ejemplos pero al parecer con la nueva version no andan ninguno, porque los que probe no me sirvieron de forma literal (es decir copy/paste ) .

Asi que tuve que ponerme a leer un poco :( . Despues de ver como funcionaba Zend_Form_Element_File. Trate de implementar la forma mas logica. La cual no me anduvo. Me acorde que cuando usas isValid de un Zend_Form, este ejecuta los filtros y las validaciones correspondientes. Pero encontre dentro de la documentacion la solucion a mi primer problema, el metodo setValueDisabled( true ) evita que se ejecute el filtro del elemento, asi puedo aplicar mi filtro para renombrar mi archivo despues de validarlo.

Mi segundo problema es que cuando implemente esto, no me guardaba el archivo en donde habia establecido. Para entender esto un poco Zend_Form_Element_File usa Zend_File_Tranfer que es el encargado de manipular el archivo. Lo que siguio fue traerme el adapter de Zend_File_Transfer de mi elemento, agregar los filtros y ejecutar el upload. Y listo tenia mi archivo subido ‘in the ZF way’.

Este es el formulario

  1.  
  2. <?php
  3. class Application_Form_Company extends Zend_Form
  4. {
  5.  
  6.     public function init()
  7.     {
  8.  
  9.         $this->setAttrib(‘enctype’, ‘multipart/form-data’);
  10.  
  11.         $this->addElement(‘text’, ‘name’, array(
  12.             ‘required’   => true,
  13.             ‘validators’ => array(
  14.             ),
  15.             ‘class’ => ’sf’
  16.         ));
  17.         $this->addElement(‘file’, ‘logo’, array(
  18.             ‘class’ => ’sf’
  19.         ));
  20.         $this->logo->addValidator( ‘Extension’, false, ‘jpg,png,gif,jpeg’ );
  21.         $this->logo->addValidator( ‘Size’, false, ‘10024000′ );
  22.         $this->logo
  23.             ->setDestination( APPLICATION_PATH . ‘/../public/empresas/imgs/’ )
  24.             ->setValueDisabled( true );
  25.  
  26.         $this->addElement(‘text’, ‘website’, array(
  27.             ‘required’   => true,
  28.             ‘class’ => ’sf’
  29.         ));
  30.  
  31.         $this->addElement(‘text’, ‘telephone’, array(
  32.             ‘required’   => true,
  33.             ‘class’ => ’sf’
  34.         ));
  35.  
  36.         $this->addElement(‘textarea’, ‘information’, array(
  37.             ‘required’   => true,
  38.             ‘class’ => ’sf’
  39.         ));
  40.  
  41.         $this->setDecorators(
  42.             array(
  43.                 array(
  44.                     ‘ViewScript’,
  45.                     array( ‘viewScript’ => ‘company/form.phtml’ )
  46.                 )
  47.             )
  48.         );
  49.     }
  50. }
  51.  

Asi quedo mi action

  1.  
  2. <?php
  3.         …
  4.         $form = new Application_Form_Company();
  5.         if ( $this->getRequest()->isPost() ) {
  6.             $file = $form->logo;
  7.             if( $form->isValid($this->getRequest()->getParams()) ) {
  8.                 $bind = $form->getValues();
  9.                 $company = new Application_Model_Company();
  10.            
  11.                 if( $company->exists( $bind[‘name’] ) ) {
  12.                     $form->name->addErrorMessage( "La empresa ya existe" );
  13.                 } else {
  14.                     try {
  15.                         $id = $company->save( $bind );
  16.                     }catch( Exception $e ) {
  17.                         $this->_helper->flashMessenger()
  18.                             ->addMessage( ‘Hubo un problema, revise los datos’ );
  19.                     }
  20.            
  21.                     // Traemos el adapter de Zend_File_Transfer
  22.                     $upload = $form->logo->getTransferAdapter();
  23.  
  24.                     // Lo ideal es que el path lo trajeramos de un archivo de configuracion.
  25.                     $upload->addFilter(‘Rename’, array(
  26.                         ‘target’ => APPLICATION_PATH . ‘/../public/empresas/imgs/logo_’. $id .‘ .jpg’,
  27.                         ‘overwrite’ => true
  28.                     ));
  29.                     var_dump( $upload->receive() );
  30.                     …
  31.