2016-10-20 8 views
0

同じフォームを使用する2つのアクション(新規および編集)があります。フォームは新しいエンティティ(MyBundle \ Entity \ Project)を作成するか、既存のエンティティを編集するものとします。各プロジェクトは1つのチーム(MyBundle \ Entity \ Team)に割り当てることができます.1チームは複数のプロジェクトを保持できます。Symfony2:フォームのビューデータはエンティティのインスタンスであると予想されますが、配列です

エンティティ/ Project.php:

/* ... */ 
/** 
    * @var Team 
    * 
    * @ORM\ManyToOne(targetEntity="Team", inversedBy="projects") 
    * @ORM\JoinColumn(name="team", referencedColumnName="id") 
    */ 
    private $team; 
/* ... */ 

エンティティ/ Team.php:

/* ... */ 
/** 
    * @var ArrayCollection 
    * 
    * @ORM\OneToMany(targetEntity="Project", mappedBy="team") 
    * @ORM\OrderBy({"title" = "ASC"}) 
    **/ 
    private $projects; 
/* ... */ 

コントローラー/ ProjectController.php:

public function newAction() 
    { 
     $project = new Project(); 
     $form = $this->createForm(
      new new ProjectType($project), 
      array(
       'action' => $this->generateUrl('mybundle_project_create'), 
      ) 
     ); 

     /* ... */ 
    } 

public function editAction($id, Request $request) 
    { 
     /** @var \Doctrine\ORM\EntityManager $em */ 
     $em = $this->getDoctrine()->getManager(); 
     $project = $em->getRepository('MyBundle:Project')->findOneById($id); 

     $form = $this->createForm(
      new ProjectType($project), 
      $project, 
      array(
       'action' => $this->generateUrl('mybundle_project_edit', array('id' => $project->getId())), 
      ) 
     ); 

フォーム/ ProjectType.php:

private $project; 

    public function __construct($project = null) 
    { 
     $this->project = $project; 
    } 

/** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      /* ... */ 
      ->add('team', 'entity', array(
       'class' => MyBundle:Team', 
       'property' => 'name', 
       'label' => 'Team', 
       'query_builder' => function (TeamRepository $er) { 
        return $er->createQueryBuilder('e') 
         ->orderBy('e.name', 'ASC'); 
       }, 
       'expanded' => false, 
       'multiple' => false, 
       'required' => false 
      )) 
      ->add('save', 'submit'); 
    } 

/** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(
      array(
       'data_class' => 'MyBundle\Entity\Project', 
      ) 
     ); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'mybundle_project'; 
    } 

私は編集フォームにアクセスしているときに、ドロップダウンで割り当てられたチームが正しく表示されます。私は、新しいプロジェクトを作成しようとしているときしかし、それは私を与える、次のエラーメッセージ:

フォームのビューデータがクラス MyBundle \エンティティ\プロジェクトのインスタンスであることが予想、しかし(nはさ)配列。 "data_class"オプションをnullに設定するか、 MyBundle \ Entity \ Projectのインスタンスに(n)配列を変換する ビュートランスフォーマーを追加することで、 このエラーを回避できます。

答えて

1

がProjectControllerのnewActionではなく、3の2つのパラメータを持つメソッドcreateFormを呼び出して、それが

$form = $this->createForm(
    new ProjectType($project), 
    $project, 
    array(
     'action' => $this->generateUrl('mybundle_project_create'), 
    ) 
); 

代わり

$form = $this->createForm(
    new ProjectType($this->getDoctrine()->getEntityManager(), $project), 
    array(
     'action' => $this->generateUrl('mybundle_project_create'), 
    ) 
); 
+0

これの仕事をしませんでした、同じエラーメッセージとしてでなければなりません前。編集した質問をご覧ください。 – cnmicha

+0

> 3の代わりに2つのパラメータを使用 @gamboa私は1つのパラメータ($ project)を見ることができます – cnmicha

+0

私の悪い、私は気づいてもあまりにも愚かでした。ありがとうございました! – cnmicha

関連する問題