Entidades múltiples (oneToMany) de generación con symfony2 y carga de archivos

Estoy en un problema relacionado con una aplicación Symfony2 que estoy creando. El problema se refiere a un artículo (Noticias) vinculado a una o varias imágenes (Ilustración). Parece bastante simple. Pero estoy astackndo en el controlador que debería persistir las noticias, la ilustración y subir el archivo de imagen.

Mi tipo de formulario de noticias:

namespace Fcbg\NewsBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; class NewsType extends AbstractType { public function buildForm( FormBuilderInterface $builder, array $options ) { $builder ->add('date', 'date') ->add('titre', 'text') ->add('contenu', 'textarea') ->add('publication', 'checkbox', array('required' => false)) ->add('type', 'entity', array( 'class' => 'FcbgNewsBundle:Illustration', 'property' => 'value', 'multiple' => true )); } public function getName() { return 'News'; } } 

Mi foto (s) tipo de formulario:

 namespace Fcbg\NewsBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class IllustrationType extends AbstractType { public function buildForm( FormBuilderInterface $builder, array $options ) { $builder ->add('file', 'file'); } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Fcbg\NewsBundle\Entity\Illustration', 'cascade_validation' => true, )); } public function getName() { return 'News'; } } 

Mi acción de controlador:

 public function addAction() { //link works properly I think $news = new News(); $illustration = new Illustration(); $illustration->setNews($news); $news->addIllustration($illustration); $form = $this->createForm(new NewsType(), $news); $request = $this->get('request'); if ($request->getMethod() == 'POST') { $form->bind($request); if ($form->isValid()) { $doctrine = $this->getDoctrine(); $newsManager = $doctrine->getManager(); $newsManager->persist($news); $newsManager->persist($illustration); $newsManager->flush(); return $this->redirect(...); } } return $this->render('base.html.twig', array( 'content' => 'FcbgNewsBundle:Default:formulairNews.html.twig', 'form' => $form->createView(), 'name' => "add a news" ) ); } 

El error que obtengo en la ejecución:

 Entities passed to the choice field must be managed. Maybe persist them in the entity manager? 

El problema aquí es que mi entidad obtiene un método llamado “getIllustrations ()” que devuelve lógicamente un arrey de Illustration. Entonces no puedo entender este error / pregunta. Supongo que mi “ilustración debe ser un campo de archivo y no un campo de elección …

¿Alguna idea sobre cómo puedo ir más allá? ¡muchas gracias!

Creo que el problema es que estás usando el campo de formulario ‘entidad’ aquí:

 ->add('type', 'entity', array( 'class' => 'FcbgNewsBundle:Illustration', 'property' => 'value', 'multiple' => true )); 

y este tipo de campo de formulario actúa como una opción y se usa para trabajar con elementos creados en la base de datos. Puedes ver esto en http://symfony.com/doc/current/reference/forms/types/entity.html

Una posible solución podría ser usar el “prototipo” como aquí http://symfony.com/doc/current/cookbook/form/form_collections.html#cookbook-form-collections-new-prototype

donde podrías tener:

 public function buildForm( FormBuilderInterface $builder, array $options ) { $builder ->add('date', 'date') ->add('titre', 'text') ->add('contenu', 'textarea') ->add('publication', 'checkbox', array('required' => false)) ->add('type', 'collection', array( 'type' => new IllustrationType(), 'allow_add' => true, )); } 

Espero que esto sea útil para ti.

Saludos cordiales.

Entonces, el código del que estaba hablando:

 public function buildForm( FormBuilderInterface $builder, array $options ) { $builder ->add('date', 'date') ->add('titre', 'text') ->add('contenu', 'textarea') ->add('publication', 'checkbox', array('required' => false)) ->add('illustrations', 'collection', array( 'type' => new IllustrationType(), 'allow_add' => true )); }