Множественные (oneToMany) Entities образуют генерацию с symfony2 и загрузку файлов

У меня проблема с приложением Symfony2, которое я создаю. Проблема касается статьи (Новости), связанной с одной или несколькими картинками (Иллюстрация). Это кажется довольно простым. Но я укладываю на контроллер, который должен сохраняться в новостях, иллюстрации и загружать файл изображения.

Моя форма формы новостей:

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'; } } 

Моя фотография (и) тип формы:

 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'; } } 

Мое действие контроллера:

 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:formulaireNews.html.twig', 'form' => $form->createView(), 'name' => "add a news" ) ); } 

Ошибка, которую я получаю при выполнении:

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

Проблема здесь в том, что мой объект получает метод, называемый «getIllustrations ()», который логически возвращает арри Иллюстрации. Поэтому я не могу понять эту ошибку / вопрос. Я предполагаю, что моя «иллюстрация должна быть полем файла, а не полем выбора …

Любая идея о том, как я могу идти дальше? большое спасибо!

Я думаю, проблема заключается в том, что вы используете поле формы «entity» здесь:

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

и этот тип поля формы действует как выбор, и он используется для работы с элементами, созданными в базе данных. Вы можете увидеть это в http://symfony.com/doc/current/reference/forms/types/entity.html

Возможным решением может быть использование «прототипа», например, здесь http://symfony.com/doc/current/cookbook/form/form_collections.html#cookbook-form-collections-new-prototype

где вы могли бы:

 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, )); } 

Я надеюсь, что это будет полезно для вас.

С уважением.

Итак, код, о котором я говорил:

 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 )); }