3

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

我考虑过设置 form 属性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 )

}

然后,如果有人使用登录表单,它会将它们发送到例如 /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 )
}

所以我想知道您是否对如何实现这一目标有更好的想法?

4

4 回答 4

2

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

在你的 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 表单。

于 2013-07-18T14:26:26.300 回答
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())

是什么让我头疼。

于 2015-02-19T14:12:00.567 回答
0

Dennefyren 接受的答案是一个死链接。我找到了谷歌缓存页面:

“对于多个表单,解决的问题是提交多个表单,根据提交的表单保留不同的实体和属性集。

所以这里是为多种形式提供技巧的格式。我使用了 createNamedBuilder 方法,该方法获取 A 类实体的类型表单。它还接收我们想要标记的表单的名称作为参数。所以我们在下面的代码中定义了两种形式,每一种都包含不同实体的两个不同属性,尽管它们可能相同。然后我们确保接收到的 POSTed 信息写入一个条件,我们可以从该条件中单独处理每个表单,并根据提交的表单区分每个相应的实体。最后,我们看到我们将两个变量传递给树枝引擎,用于两种不同的形式。”

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 ,它又具有一个名为 has 的方法,该方法检查对象中的给定键。

在树枝模板中,显然我们将分别调用每个表单的代码,例如:”

{{ form_row(form1.foo) }}
...
{{ form_row(form2.bar) }}
于 2020-04-03T19:38:13.347 回答
0

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

在同一页面上多次生成相同的表单类型 Symfony2

于 2015-08-21T11:25:22.140 回答