2014-05-04 57 views
2

我在與我正在構建的Symfony2應用程序有關的問題。該問題涉及與一個或多個圖片(插圖)相關的文章(新聞)。看起來很簡單。但我在控制器上堆疊,應該堅持新聞,插圖和上傳圖片文件。使用symfony2和文件上傳生成多個(oneToMany)實體代碼

我的新聞形式類型:

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

我的圖片(S)表格類型:

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()」的方法,它從邏輯上返回插圖的一個arrey。所以我無法理解這個錯誤/問題。我認爲我的「插圖應該是一個文件中的字段,而不是一個選擇字段...

我如何才能走得更遠任何想法?THX很多!

回答

0

我認爲問題是,你正在使用的「實體」表單域在這裏:

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

我希望這對您有用。

親切的問候。

+0

非常感謝,這固定我的問題。所以,我仍然有一點點錯誤。但它可以通過使用答案的代碼來解決 – MPE

0

所以,我說的是代碼:

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 
      )); 
    } 
相關問題