2017-02-02 6 views
0

私はエンティティCriteriaを持っています。エンティティVote(関連付けられている)を持つことができます。 私は、基準のリストを表示し、各基準の前に1つの投票フォーム(ゼロではなく、多くではない)を表示して、各基準ごとに投票できるようにします。親フォームのoneToManyエンティティを1つだけ管理する方法

私はoneToManyアソシエーションを持っているので、私のCriteriaFormには、VoteTypeというCollectionTypeが必要です(私は思っていますか?)。私はVoteType持ってしてみました:

$builder->add('votesCritere', VoteCritereType::class); 

を私はエラーがあります:

The form's view data is expected to be an instance of class LabelBundle\Entity\VoteCritere, but is an instance of class Doctrine\ORM\PersistentCollection 

をだから私は、私はCollectionTypeはを持っていなければならないと思います。しかし、コレクションタイプがある場合は、ZEROフォームから開始します(My CriteriaにはまだVoteが含まれていないため)。私は判断基準に投票を追加に、各基準の前で唯一の(そして常に)1投票フォームを持つようにしたい

(私は、多数の形態をしたくない得票数を反映しています)

どうすればいいですか?

ありがとうございました!

+0

したがって、Criteriasのリストのみに基づいてチェックボックス(または、...)のリストが必要ですか?または投票に記入するいくつかのプロパティがありますか? –

+0

Criteriasは変更されません。各基準の投票のみ(必須ではありません)。投票には2つのラジオボタンとテキストエリアがあり、メモを記入します。 – wyllyjon

答えて

0

大声で考えてみましょう。票のコレクションタイプのエンティティバインドフォームを使用する場合は、すべての票をすべての条件にバインドします。

この場合、基準エンティティIDに基づいてフォームの配列をお勧めします。

投票フォームタイプの作成:コントローラで

class VoteType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('answer', ChoiceType::class, array(
       'choices' => array(
        'Yes' => true, 
        'No' => false, 
       ) 
      )) 
      ->add('note', TextareaType::class), 
      ->add('criteriaId', HiddenType::class), 
      ->add('vote', SubmitType::class); 
    ... 
    ... 
} 

- のcriteriasのトラバース取得(リポジトリの例方法にfindAll()メソッド)と基準のエンティティIDに基づいて名前のフォームの配列を作成します。

$ff = $this->get('form.factory'); 
foreach ($criterias as $criteria) { 
    $voteForms[] = $ff->createNamedBuilder(
     'vote_'.$criteria->getId(), 
     new VoteType, 
     array(
      'criteriaId' => $criteria->getId() 
     ) 
    ) 
    ->getForm() 
    ->createView(); 

} 

return $this->render(someView, array("voteForms" => $forms)); 

フォームが送信されると、hidden criteriaIdフィールドによって投票がどの基準に属するかを特定できます。

EDIT - を追加しました:ボタン一つですべてのフォームを送信する方法

'criteriaId' フィールドと '投票' VoteTypeに提出が不要になりました - そう:

class VoteType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('answer', ChoiceType::class, array(
       'choices' => array(
        'Yes' => true, 
        'No' => false, 
       ) 
      )) 
      ->add('note', TextareaType::class); 
    ... 
    ... 
} 

と中をコントローラーはVoteTypesメンバーのフォームを作成するだけです:

$fb = $this->createFormBuilder(); 
foreach ($criterias as $criteria) { 
    $fb->add('vote-criteria-'.$criteria->getId(), VoteType::class); 
} 
$fb->add('submit', SubmitType::class); 
$frm = $fb->getForm(); 

$frm->handleRequest($request); 

if ($frm->isSubmitted() && $frm->isValid()) { 
    // all criteria vote data 
    $frm->getData(); 
    ... 
} 

return $this->render(someView, array('form' => $frm->createView())); 
+0

ありがとう、Honza、良いアイデアのようです。しかし、できるならば、ワンクリックですべてのフォームを提出することを好むだろう(私もglobalVoteを持っているので、各基準に投票するにはglobalVoteを作らなければならない。何か案が ? – wyllyjon

+0

さて、あなたが私にしたいことが分かります。しかし、私は埋め込みフォームを使って全く同じことをしたと思います。したがって、私は、各Criteriaに対して複数のVoteを持つことができるので、CollectionTypeを追加することを期待しています。CollectionTypeを置くとフォームはありません(おそらく投票はまだありません)。 – wyllyjon

+0

エンティティにバインドされたフォームをお持ちの場合、それは常に実際のエンティティの状態に依存しますので、あなたのサイトでは、フォームの数は常に1つだけです。新しい投票エンティティをフォームのレンダリング前に条件に割り当てる必要がある場合は、フォームがレンダリングされていないよりも、条件がまだ投票を持たない場合は、それを理解できますか? –

関連する問題