所以我想用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,它将通过SignupController中的loginAction操作将其发送到例如/ signup / login。
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 )
}
所以,我想知道您是否对实现此目标有更好的想法?
您可以做的另一件事是在页面中呈现表单,例如:
在您的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格式。
提防分支机构的差异。我发现更新版本的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())
导致我头痛的原因。
[请参阅本主题中我对该问题的回答,它描述如何创建单个表单类型并使用它生成具有不同ID(但根据基础实体的ID保留该ID)N次的相同表单:
Generate same form type on same page multiple times Symfony2
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,它又具有一个名为has的方法,该方法检查对象内的给定键。
显然在树枝模板中,我们将分别为每种形式调用代码,例如:“
{{ form_row(form1.foo) }}
...
{{ form_row(form2.bar) }}