2016-06-24 3 views
0

私は学校管理者を作成する必要があります。教師が評価の結果を提出しなければならないときは、得点技能を評価する必要があります。フィールドをCollectionTypeに動的に追加する

Evaluation ------ ------ OneToMany Scale ------ ------ ManyToOne Skill

EvaluationType

class EvaluationType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('scales', CollectionType::class, [ 
       'entry_type' => ScaleType::class 
      ]); 
    } 
} 

ScaleType

class ScaleType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('value'); 
    } 
} 

指定したコレクションの子をEvaluationType::scalesの子にしてSkillを送信します。ここで

は、私は私のコントローラのアクションで、これまでに試したものです:

public function newEvaluation(Classroom $classroom, Subject $subject, Period $period) 
{ 
    $evaluation = new Evaluation(); 
    $evaluation->setClassroom($classroom); 
    $evaluation->setSubject($subject); 
    $evaluation->setPeriod($period); 

    $form = $this->createForm(EvaluationType::class, $evaluation); 
    $skills =$this->getDoctrine()->getRepository('AppBundle:Skill')->findAll(); 
    foreach($skills as $skill) { 
     $scale = new Scale(); 
     $scale->setEvaluation($evaluation); 
     $scale->setSkill($skill); 
     $form['scales']->add($this->createForm(ScaleType::class, $scale, [ 
      'auto_initialize' => false 
     ])); 
    } 

    return $this->render('classrooms/newEvaluation.html.twig', [ 
     'form' => $form->createView(), 
     'classroom' => $classroom, 
     'subject' => $subject 
    ]); 
} 

問題は、私が追加したとき、私は唯一のレンダリングにscalesフィールドには、1つのサブフォームを取得、のように見えるということです子は$form['scales']になり、前の子を上書きします。

私はそれが完全に間違っていると思います。それをどうすれば実現できますか?

私はEvaluationを最初に作成してから別のページにすべてScaleを作成できないということも指摘しています。それは同じコントローラ/ページで行う必要があります。

編集:私はscalesの子どもたちが拡張できるようにしたくないという事実を追加します、彼らは、サーバーによって固定する必要があり、クライアントによってフェッチされていません。

+0

はScale' 'のコレクションを作成し、' addScalesを使用して 'Evaluation'に追加し、あなたの' foreach'を使用してみてください() 'を使用し、フォームのやり取りはまったく行いません。次に、あなたのエンティティに値を設定したら、あなたの 'EvaluationType'フォームを作成します。 – Artamiel

+0

素晴らしい作品!モデルを水和させた後、実際にフォームを作成していたのです。 '$ this-> createForm'は2番目のパラメータで渡されたデータのコピーを作成しますか? – palra

+0

この種の作業を扱うSymfonyには、さまざまな種類の 'DataTransformers 'があります。したがって、あなたはうまく書式設定されたフォームを得ることができます。 – Artamiel

答えて

0

はArtamielのおかげで、ここに私の新しいコントローラのアクションがあり、それを解決:

public function newEvaluation(Classroom $classroom, Subject $subject, Period $period) 
{ 
    $evaluation = new Evaluation(); 
    $evaluation->setClassroom($classroom); 
    $evaluation->setSubject($subject); 
    $evaluation->setPeriod($period); 

    $skills = $this->getDoctrine()->getRepository('AppBundle:Skill')->findAll(); 
    foreach ($skills as $skill) { 
     $scale = new Scale(); 
     $scale->setSkill($skill); 
     $scale->setEvaluation($evaluation); 
    } 

    $form = $this->createForm(EvaluationType::class, $evaluation); 

    return $this->render('classrooms/newEvaluation.html.twig', [ 
     'form' => $form->createView(), 
     'classroom' => $classroom, 
     'subject' => $subject 
    ]); 
} 
関連する問題