2016-06-24 7 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'); 
    } 
} 

Я хочу добавить динамическое дополнение ScaleType детей до EvaluationType::scales Форма ребенка для данной коллекции Skill s.

Вот что я пытался до сих пор в моем действии контроллера:

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 поле на рендеринг, выглядит, когда я добавить детей до $form['scales'] он перезаписывает предыдущих детей.

Я полагаю, что я делаю это совершенно неправильно. Как я могу это достичь?

Я также указываю, что я не могу создать Evaluation, а затем, на другой странице, создать все Scale s. Это нужно сделать на том же контроллере/странице.

Edit: Я добавлю то, что я не хочу детей scales быть расширяемым, они должны быть установлены на сервере, а не быть неправдоподобным клиентом.

+0

Попробуйте использовать 'foreach', чтобы создать коллекцию' Scale' и добавить его в 'Evaluation' с помощью' addScales() ', например, без взаимодействия формы. Затем, когда вы заполнили свою сущность, создайте форму «EvaluationType». – Artamiel

+0

Отлично работает! Что действительно создавало форму после увлажнения модели. Создает ли '$ this-> createForm' копию данных, переданных во втором параметре? – palra

+0

Существуют различные типы «DataTransformers» в Symfony, которые обрабатывают такую ​​работу, поэтому вы можете получить форматированную форму. – 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 
    ]); 
}