根据表单选择添加表单字段


Add form fields based on form choice

我需要根据用户输入动态地向表单添加字段。假设我有一个实体A,它有子实体B和C。最初,表单有一个选择字段,用户可以在其中选择类型B或C。如果用户选择B,字段B.x和B.y应该添加到表单中,如果用户选择C,字段C.x, C.y和C.z应该添加到表单中。

我可以使用PHP/Symfony做到这一点,还是我需要使用JavaScript来显示/隐藏字段?我正在阅读Symfony的动态表单修改教程,但我仍然不知道如何做到这一点。

最简单的解决方案是将表单分成两个页面。第一页只显示表单中不依赖于任何用户选择的部分。用户提交表单,然后显示第二个表单,其中包含基于第一个表单输入的表单字段。

您只需为第一页定义表单类型,然后为第二页的所有可能结果定义表单类型。如果动态表单修改比创建完全不同的表单更有意义,您还可以使用前面提到的动态表单修改。然后,在控制器中添加逻辑来决定呈现哪个表单。

也许它看起来像这样:

$entity = new Entity();
$form1 = $this->createForm(new EntityPageOneType(), $entity);
$form1->handleRequest($request);
if($form1->isSubmitted() && $form1->isValid()){
    if($entity->foo = 'bar'){
        $form2 = $this->createForm(new EntityPageTwoBarType(), $entity);
    }
    else{
        $form2 = $this->createForm(new EntityPageTwoOtherType(), $entity);
    }
    if($form2->isSubmitted() && $form2->isValid()){
         // persist data & redirect
    }
    return $this->render('template.twig', ['form' => $form2]);
}
else{
    return $this->render('template.twig', ['form' => $form1]);
}