Мне нужно создать менеджера школы. Когда учитель должен представить результаты оценки, он должен оценить полученные навыки с помощью оценки.Динамически добавлять поля в 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
быть расширяемым, они должны быть установлены на сервере, а не быть неправдоподобным клиентом.
Попробуйте использовать 'foreach', чтобы создать коллекцию' Scale' и добавить его в 'Evaluation' с помощью' addScales() ', например, без взаимодействия формы. Затем, когда вы заполнили свою сущность, создайте форму «EvaluationType». – Artamiel
Отлично работает! Что действительно создавало форму после увлажнения модели. Создает ли '$ this-> createForm' копию данных, переданных во втором параметре? – palra
Существуют различные типы «DataTransformers» в Symfony, которые обрабатывают такую работу, поэтому вы можете получить форматированную форму. – Artamiel