私は学校管理者を作成する必要があります。教師が評価の結果を提出しなければならないときは、得点技能を評価する必要があります。フィールドを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
の子どもたちが拡張できるようにしたくないという事実を追加します、彼らは、サーバーによって固定する必要があり、クライアントによってフェッチされていません。
はScale' 'のコレクションを作成し、' addScalesを使用して 'Evaluation'に追加し、あなたの' foreach'を使用してみてください() 'を使用し、フォームのやり取りはまったく行いません。次に、あなたのエンティティに値を設定したら、あなたの 'EvaluationType'フォームを作成します。 – Artamiel
素晴らしい作品!モデルを水和させた後、実際にフォームを作成していたのです。 '$ this-> createForm'は2番目のパラメータで渡されたデータのコピーを作成しますか? – palra
この種の作業を扱うSymfonyには、さまざまな種類の 'DataTransformers 'があります。したがって、あなたはうまく書式設定されたフォームを得ることができます。 – Artamiel