Symfony2在一个页面上有多个表单

时间:2012-07-31 14:31:16

标签: php symfony

所以我想创建一个带有登录(登录)表单的页面和一个带有Symfony2的注册(注册)表单。我想知道实现这个目标的最佳方法是什么?

我考虑过设置表单属性action="/pathToMyFormProcess"但我遇到了一个问题:我想在该操作中显示相同的模板(HTML页面)。但是,“/ pathToMyFormProcess”将在具有不同模板的许多不同操作中被调用。就像每个页面上包含或呈现的登录表单一样。我可以为每个模板创建一个新的路径和动作。但正如这个例子所示,这将是非常令人沮丧的:

我的注册行动将是:

public function signupAction() {

    $loginForm = $this->get('loginform'); // Get the login form
    $signUpForm = $this->get('signupform'); // Get the signup form

    $loadData = ... /* Loading data needed for this page (could be last visitors, 
   countries, some information from database that should be displayed on the page) */

    return // SIGNUPTEMPLATE - array ( forms and data )

}

然后,如果有人使用了loginform,它会将它们发送到例如/ signup / login,例如SignupController中的动作loginAction。

public function signupAction() {

    $loginForm = $this->get('loginform'); // Get the login form
    $handler = $this->get('loginhandler'); // Get the handler

    $process = $handler->process(); // Process the request, try to log in basicly.
    if($process) {
      return // redirect or something - no problem
    }

    // Loading again, writing exact same code as signupAction()
    $signUpForm = $this->get('signupform'); // Get the signup form

    $loadData = ...

    return // SIGNUPTEMPLATE - array ( forms and data )
}

所以我想知道你是否对如何实现这个有更好的想法?

5 个答案:

答案 0 :(得分:12)

我自己找到了更好的练习。对于任何感兴趣的人:

http://www.craftitonline.com/2011/06/symfony2-multiple-forms-different-from-embedded-forms/

答案 1 :(得分:1)

您可以做的另一件事是在页面中呈现表单,例如:

在layout.html.twig

{{ render(controller('SiteBundle:Login:login')) }}

然后在您的loginAction中呈现您的登录表单。

return $this->render('SiteBundle:Default:login-box.html.twig', array(
        'last_username' => $lastUsername,
        'error'         => $error,
        'csrf_token' => $csrfToken,
    ));

最后你的login-box.html.twig有你的html格式。

答案 2 :(得分:0)

注意分支中的不同。 我发现没有任何理由,SYMFONY的新版本会出现一些奇怪的变化。示例分支2.6

public FormBuilderInterface createNamedBuilder(string|int $name, string|FormTypeInterface $type = 'form', mixed $data = null, array $options = array())

但在分支2.0

public FormBuilder createNamedBuilder(string|FormTypeInterface $type, string $name, mixed $data = null, array $options = array())

导致我头痛的原因。

答案 3 :(得分:0)

请参阅本主题中对该问题的回答,它描述了如何创建单个表单类型并使用它来生成具有不同ID的相同表单(但保留该ID基于底层实体的ID)N次:

Generate same form type on same page multiple times Symfony2

答案 4 :(得分:0)

Dennefyren接受的答案是一个固定的链接。我找到了Google缓存的页面:

“使用多种表单,解决的问题是提交多种表单,这些表单根据提交的表单保留了不同的实体和属性集。

因此,这是多种格式的窍门。我利用createNamedBuilder方法为类A的实体获取类型表单。它还接收我们要为其标记的表单名称作为参数。因此,我们在下面的代码中定义了两种形式,每种形式都包含不同实体的两个不同属性,尽管它们可能是相同的。然后,确保我们收到了写有条件的POST信息,从那里我们可以分别处理每个表单并保留每个相应实体(根据提交的表单进行区分)。最后,我们看到将两个变量传递给树枝引擎两个变量。”

public function multiformAction()
{
    $form1 = $this->get('form.factory')->createNamedBuilder($formTypeA, 'form1name')
        ->add('foo', 'text')
        ->getForm();

    $form2 = $this->get('form.factory')->createNamedBuilder($formTypeB, 'form2name')
        ->add('bar', 'text')
        ->getForm();

    if('POST' === $request->getMethod()) {

        if ($request->request->has('form1name') {
            // handle the first form
        }

        if ($request->request->has('form2name') {
            // handle the second form
        }
    }

    return array(
        'form1' => $form1->createView(),
        'form2' => $form2->createView()
    );  
}

“还请注意,$ request变量是sf2请求对象。该对象也具有一个称为request的属性。此属性的类型是ParameterBag,它又具有一种名为的方法,该方法检查对象内的给定键

显然,在树枝模板中,我们将分别为每种形式调用代码,例如:“

{{ form_row(form1.foo) }}
...
{{ form_row(form2.bar) }}