【问题标题】:Dynamically add fields to CollectionType动态添加字段到 CollectionType
【发布时间】:2016-06-24 20:38:29
【问题描述】:

我必须创建一个学校经理。当老师必须提交评估结果时,他必须通过评分来评估给定的技能。

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

评估类型

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
            ]);
    }
}

比例类型

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

我想为给定的Skills 集合动态地将ScaleType 子代添加到EvaluationType::scales 表单子代中。

这是我迄今为止在控制器操作中尝试过的:

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,然后在另一个页面上创建所有Scales。它需要在同一个控制器/页面中完成。

编辑:我将添加一个事实,即我不希望scales 的子级可扩展,它们必须由服务器修复,而不是由客户端获取.

【问题讨论】:

  • 尝试使用您的foreach 创建Scale 的集合,并使用addScales() 将其添加到您的Evaluation,例如,根本没有任何表单交互。然后,当您填充您的实体后,创建您的 EvaluationType 表单。
  • 效果很好!它真正做的是在水合模型后创建表格。 $this->createForm 是否会复制第二个参数中传递的数据?
  • Symfony 中有各种DataTransformers 来处理这类工作,因此您可以获得格式良好的表单。

标签: php symfony symfony2-forms


【解决方案1】:

解决了,感谢 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
    ]);
}

【讨论】:

    猜你喜欢
    • 2011-09-02
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2011-11-08
    相关资源
    最近更新 更多