Quiero subir una imagen con Zend Framework versión 1.9.6. La subida en sí funciona bien, pero quiero un par de cosas así … y estoy completamente atascado.

  • Mensajes de Error por no subir una imagen no se mostrará.
  • Si un usuario no ingresa todos los campos obligatorios, pero ha subido una imagen a continuación quiero mostrar la imagen cargada en mi formulario. Ya sea como una imagen o como un enlace a la imagen. Sólo algunos formulario de retroalimentación para el usuario.
  • Quiero usar Zend_ Validate_ File_ IsImage. Pero no parece hacer nada.
  • Y por último; hay algunos automático de cambio de nombre de la funcionalidad?

Todas las ideas y sugerencias son muy bienvenidas. He estado luchando por dos días.

Estos son simplificado fragmentos de código:

miformulario.ini

method = "post"

elements.title.type = "text"
elements.title.options.label = "Title"
elements.title.options.attribs.size = 40
elements.title.options.required = true

elements.image.type = "file"
elements.image.options.label = "Image"
elements.image.options.validators.isimage.validator = "IsImage"

elements.submit.type = "submit"
elements.submit.options.label = "Save"

TestController

<?php
class Admin_TestController extends Zend_Controller_Action
{
  public function testAction ()
  {
    $config = new Zend_Config_Ini(MY_SECRET_PATH . 'myform.ini');
    $f = new Zend_Form($config);

    if ($this->_request->isPost())
    {
      $data = $this->_request->getPost();

      $imageElement = $f->getElement('image');
      $imageElement->receive();

      //$imageElement->getValue();

      if ($f->isValid($data))
      {
        //save data
        $this->_redirect('/admin');
      }

      else
      {
        $f->populate($data);
      }
    }

    $this->view->form = $f;
  }
}
?>

Mi punto de vista solo eco de la «forma» de la variable.

InformationsquelleAutor Erik | 2009-12-08

5 Comentarios

  1. 19

    Primero, poner esto en el inicio de tu script:

    error_reporting(E_ALL);//esto debería mostrar todos los errores de php

    Creo que los mensajes de error de la falta de la forma, ya que volver a rellenar el formulario antes de mostrarlo. Creo que borra los mensajes de error. Para arreglar eso, quitar esta parte:

    else
    {
       $f->populate($data);
    }

    Para mostrar la imagen cargada en el formulario, solo agregar un div a su plantilla de la vista, como este:

    <div style="float:right"><?=$this->image?></div>

    Si la imagen subida aceptar y, a continuación, rellenar $view->imagen con una etiqueta img.

    Como para la automática de volver a nombrar, no, no está construido, pero es muy fácil. Te voy a mostrar cómo a continuación.
    He aquí cómo puedo manejar mi imagen de carga:

    $form = new Zend_Form();
    $form->setEnctype(Zend_Form::ENCTYPE_MULTIPART);
    $image = new Zend_Form_Element_File('image');
    $image->setLabel('Upload an image:')
    ->setDestination($config->paths->upload)
    ->setRequired(true)
    ->setMaxFileSize(10240000) //limits the filesize on the client side
    ->setDescription('Click Browse and click on the image file you would like to upload');
    $image->addValidator('Count', false, 1);                //ensure only 1 file
    $image->addValidator('Size', false, 10240000);            //limit to 10 meg
    $image->addValidator('Extension', false, 'jpg,jpeg,png,gif');//only JPEG, PNG, and GIFs
    $form->addElement($image);
    $this->view->form = $form;
    if($this->getRequest()->isPost())
    {
    if(!$form->isValid($this->getRequest()->getParams()))
    {
    return $this->render('add');
    }
    if(!$form->image->receive())
    {
    $this->view->message = '<div class="popup-warning">Errors Receiving File.</div>';
    return $this->render('add');
    }
    if($form->image->isUploaded())
    {
    $values = $form->getValues();
    $source = $form->image->getFileName();
    //to re-name the image, all you need to do is save it with a new name, instead of the name they uploaded it with. Normally, I use the primary key of the database row where I'm storing the name of the image. For example, if it's an image of Person 1, I call it 1.jpg. The important thing is that you make sure the image name will be unique in whatever directory you save it to.
    $new_image_name = 'someNameYouInvent';
    //save image to database and filesystem here
    $image_saved = move_uploaded_file($source, '/www/yoursite/images/'.$new_image_name);
    if($image_saved)
    {
    $this->view->image = '<img src="/images/'.$new_image_name.'" />';
    $form->reset();//only do this if it saved ok and you want to re-display the fresh empty form
    }
    }
    }
  2. 2

    Primer lugar, eche un vistazo a la De Inicio Rápido tutorial. Nota cómo se tiene un ErrorController.php que mostrará los mensajes de error para usted. Tenga en cuenta también cómo la aplicación.ini ha estas líneas a causa de PHP para emitir mensajes de error, pero asegúrese de que usted está en el «desarrollo» medio ambiente para ver (que se establece en público/.htaccess).

    phpSettings.display_startup_errors = 1
    phpSettings.display_errors = 1

    Segundo, ZF tiene un cambio de nombre de filtro para la carga de archivos:

    $upload_elt = new Zend_Form_Element_File('upload');
    $upload_elt
    ->setRequired(true)
    ->setLabel('Select the file to upload:')
    ->setDestination($uploadDir)
    ->addValidator('Count', false, 1) //ensure only 1 file
    ->addValidator('Size', false, 2097152) //limit to 2MB
    ->addValidator('Extension', false, 'doc,txt')
    ->addValidator('MimeType', false, 
    array('application/msword',
    'text/plain'))
    ->addFilter('Rename', implode('_', 
    array($this->_user_id,
    $this->_upload_category,
    date('YmdHis'))))
    ->addValidator('NotExists', false, $uploadDir)
    ;

    Algunas de las cosas interesantes sobre:

    • marca de la carga según sea necesario (que tu .ini no parece hacer)
    • poner todos los archivos en un directorio especial
    • límite de tamaño de archivo y aceptable tipos mime
    • cambiar el nombre de subir a myuser_category_timestamp
    • no sobrescribir un archivo existente (poco probable, dado nuestro esquema de marca de hora, pero vamos a asegurarnos de todos modos)

    Así, lo anterior va en su forma. En el controlador/acción que recibe la carga, usted podría hacer esto:

    $original_filename = $form->upload->getFileName(null, false);
    if ($form->upload->receive()) {
    $model->saveUpload(
    $this->_identity, $form->upload->getFileName(null, false),
    $original_filename
    );
    }

    Nota cómo podemos capturar el $original_filename (si la necesita) antes de hacer receive(). Después de recibir(), hacemos getFileName() para obtener lo que hay que cambiar el nombre de filtro elegido como el nuevo nombre de archivo.

    Finalmente, en el modelo->saveUpload método se puede almacenar cualquier material a su base de datos.

  3. 0

    Asegúrese de que su punto de vista también las salidas de los mensajes de error que se generan en el controlador: carga de errores de validación de campo, validación de archivo. El cambio de nombre sería su trabajo, como los otros post de procesamiento, tales como la de la imagen-la magia de convertir.

  4. 0

    Al siguiente lo_fye del listado que he experimentado problemas con la costumbre de los decoradores.
    No tengo el Archivo predeterminado Decorador de set y consiguió la siguiente excepción:

    Warning: Exception caught by form: No file decorator found... unable to render file element Stack Trace:

    La Respuesta a esto es que uno de sus decrators debe implementar el vacío de la interfaz de Zend_Form_Decorator_Marker_File_interface

  5. 0

    También sucede a veces a error cuando se utiliza una petición ajax. Probarlo sin una petición ajax y no olvides el formulario multipart.

Dejar respuesta

Please enter your comment!
Please enter your name here