【问题标题】:Add form fields based on form choice根据表单选择添加表单字段
【发布时间】:2015-10-12 15:27:08
【问题描述】:

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

我可以使用 PHP/Symfony 执行此操作,还是需要使用 JavaScript 来显示/隐藏字段?我正在阅读有关 Symfony 的 Dynamic Form Modification 教程,但我仍然不知道如何做到这一点。

【问题讨论】:

  • 简短回答:AJAX 提交部分表单,然后使用表单事件。取决于你如何使用 symfony 表单(作为服务或不作为服务):PRE_SET_DATA event 或 POST_SUBMIT

标签: javascript php forms symfony


【解决方案1】:

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

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

也许它看起来像这样:

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

【讨论】:

    猜你喜欢
    • 2016-08-25
    • 2013-09-09
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多