У меня проблема с приложением 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 )); }