拖曳登记表FosUserBundle Symfony

时间:2017-08-01 09:17:07

标签: symfony fosuserbundle

我使用symfony 2.8和FOSUserBundle,我在数据库的同一个表中有两种类型的用户,我喜欢在同一个注册页面中区分注册表单,如下所示: img *

我不能在同一页面中使用两个表单实例的问题,我该怎么办?

1 个答案:

答案 0 :(得分:2)

我将采用的方式是覆盖FOSUserBundle,然后扩展RegistrationController,可能the corresponding template

registerAction中,您可以重复使用the original的某些部分,但是在创建表单的位置,您可以创建两个不同的部分,可能是这样的:

/** @var $formFactory FactoryInterface */
$clientFormFactory = $this->get('client_registration.form.factory');
$clientForm = $clientFormFactory->createForm();
$clientForm->setData($client);

/** @var $formFactory FactoryInterface */
$correspondentFormFactory = $this->get('correspondent_registration.form.factory');
$correspondentForm = $correspondentFormFactory->createForm();
$correspondentForm->setData($correspondent);

$clientForm->handleRequest($request);
$correspondentForm->handleRequest($request);

if ($clientForm->isSubmitted() && $clientForm->isValid()) {
    // ...
} elseif ($correspondentForm->isSubmitted() && $correspondentForm->isValid()) {
    // ...
}

return $this->render(
    '@FOSUser/Registration/register.html.twig',
    [
        'clientForm' => $clientForm->createView(),
        'correspondentForm' => $correspondentForm->createView(),
    ]
);

if条件中的部分可能看起来与原始控制器类似。您可能对每种用户类型都有不同的UserManager,您必须切换,但除此之外基本上是:调度事件前,保存用户,调度事件后,重定向。因为FOSUserBundle的其他部分依赖于它们,所以重新调度这两个事件是很重要的,例如:发送注册电子邮件。

在模板中,您只需在其标签中呈现两个表单。你可能不得不使用表单id,但这应该是直截了当的。