style formulario form example custom php file-upload symfony symfony-2.1

php - example - Symfony 2 | Excepción de formulario al modificar un objeto que tiene un campo de archivo(imagen)



symfony form style (3)

Estoy usando Symfony2. Tengo una publicación de entidad que tiene un título y un campo de imagen.

Mi problema: todo está bien cuando creo una publicación, tengo mi imagen, etc. Pero cuando quiero modificarla, tengo un problema con el campo "imagen" que es un archivo cargado, Symfony quiere un tipo de archivo y tiene una cadena (la ruta del archivo cargado):

The form''s view data is expected to be an instance of class Symfony/Component/HttpFoundation/File/File, but is a(n) string. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms a(n) string to an instance of Symfony/Component/HttpFoundation/File/File.

Estoy realmente atascado con este problema y realmente no sé cómo resolverlo, ¡cualquier ayuda sería muy apreciada! ¡Muchas gracias!

Aquí está mi PostType.php (que se usa en newAction () y modifiyAction ()) y que puede causar el problema ( Form / PostType.php ):

<?php namespace MyBundle/Form; use Symfony/Component/Form/AbstractType; use Symfony/Component/Form/FormBuilderInterface; use Symfony/Component/HttpFoundation/File/UploadedFile; use MyBundle/Entity/Post; class PostType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add(''title'') ->add(''picture'', ''file'');//there is a problem here when I call the modifyAction() that calls the PostType file. } public function getDefaultOptions(array $options) { return array( ''data_class'' => ''MyBundle/Entity/Post'', ); } public static function processImage(UploadedFile $uploaded_file, Post $post) { $path = ''pictures/blog/''; //getClientOriginalName() => Returns the original file name. $uploaded_file_info = pathinfo($uploaded_file->getClientOriginalName()); $file_name = "post_" . $post->getTitle() . "." . $uploaded_file_info[''extension''] ; $uploaded_file->move($path, $file_name); return $file_name; } public function getName() { return ''form_post''; } }

Aquí está mi entidad de publicación ( Entidad / Post.php ):

<?php namespace MyBundle/Entity; use Doctrine/ORM/Mapping as ORM; use Symfony/Component/Validator/Constraints as Assert; /** * MyBundle/Entity/Post * * @ORM/Table() * @ORM/Entity */ class Post { /** * @var integer $id * * @ORM/Column(name="id", type="integer") * @ORM/Id * @ORM/GeneratedValue(strategy="AUTO") */ private $id; /** * @ORM/Column(type="string", length=255, nullable=true) * @Assert/Image( * mimeTypesMessage = "Not valid.", * maxSize = "5M", * maxSizeMessage = "Too big." * ) */ private $picture; /** * @var string $title * * @ORM/Column(name="title", type="string", length=255) */ private $title; //getters and setters }

Aquí está mi newAction () ( Controller / PostController.php ) Todo funciona bien con esta función :

public function newAction() { $em = $this->getDoctrine()->getEntityManager(); $post = new Post(); $form = $this->createForm(new PostType, $post); $post->setPicture(""); $form->setData($post); if ($this->getRequest()->getMethod() == ''POST'') { $form->bindRequest($this->getRequest(), $post); if ($form->isValid()) { $uploaded_file = $form[''picture'']->getData(); if ($uploaded_file) { $picture = PostType::processImage($uploaded_file, $post); $post->setPicture(''pictures/blog/'' . $picture); } $em->persist($post); $em->flush(); $this->get(''session'')->setFlash(''succes'', ''Post added.''); return $this->redirect($this->generateUrl(''MyBundle_post_show'', array(''id'' => $post->getId()))); } } return $this->render(''MyBundle:Post:new.html.twig'', array(''form'' => $form->createView())); }

Aquí está mi modifyAction () ( Controller / PostController.php ): hay un problema con esta función

public function modifyAction($id) { $em = $this->getDoctrine()->getEntityManager(); $post = $em->getRepository(''MyBundle:Post'')->find($id); $form = $this->createForm(new PostType, $post);//THIS LINE CAUSES THE EXCEPTION if ($this->getRequest()->getMethod() == ''POST'') { $form->bindRequest($this->getRequest(), $post); if ($form->isValid()) { $uploaded_file = $form[''picture'']->getData(); if ($uploaded_file) { $picture = PostType::processImage($uploaded_file, $post); $post->setPicture(''pictures/blog/'' . $picture); } $em->persist($post); $em->flush(); $this->get(''session'')->setFlash(''succes'', ''Modifications saved.''); return $this->redirect($this->generateUrl(''MyBundle_post_show'', array(''id'' => $post->getId()))); } } return $this->render(''MyBundle:Post:modify.html.twig'', array(''form'' => $form->createView(), ''post'' => $post)); }


Por favor haga el siguiente cambio en su PostType.php .

public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add(''title'') ->add(''picture'', ''file'', array( ''data_class'' => ''Symfony/Component/HttpFoundation/File/File'', ''property_path'' => ''picture'' ) ); }


Te recomendaría que leas la documentación de carga de archivos con Symfony y Doctrine. Cómo manejar las cargas de archivos con Doctrine y una recomendación firme sobre la parte devoluciones de llamada del ciclo de vida.

En un resumen, usualmente en la forma usa la variable ''archivo'' (ver documentación), puede poner una etiqueta diferente a través de las opciones, luego en el campo ''imagen'', simplemente almacena el nombre del archivo, porque cuando lo necesita El archivo src al que puede llamar método getWebpath ().

->add(''file'', ''file'', array(''label'' => ''Post Picture'' ) );

llamar en tu plantilla de ramita

<img src="{{ asset(entity.webPath) }}" />


data_class el problema configurando data_class en null siguiente manera:

public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add(''title'') ->add(''picture'', ''file'', array(''data_class'' => null) ); }