有没有办法在同一页面上嵌入两个表单(数据在两个不相关的实体上),并只用一个提交按钮提交表单?
我们的想法是仅在一个控制器Action中验证两个提交的表单。
实体1 和实体2 绝对没有任何共同之处。
|--------------------------
| Form 1 (Entity 1) |
|--------------------------
--------------- |
| Main Form |------------------
--------------- |
|--------------------------
| Form 2 (Entity 2) |
|--------------------------
有没有人知道这是否可能?
非常感谢。
答案 0 :(得分:2)
这是可能的。这样的事情应该有效:
$entity1 = new Entity1();
$entity2 = new Entity2();
$form = $this->createMainForm();
$form->setData(array(
'entity1' => $entity1,
'entity2' => $entity2,
));
if ($request->isMethod('POST')) {
$form->bindRequest($request);
if ($form->isValid()) {
// $entity1 and $entity2 should contain the post data
// and can be persisted or whatever it is you want to do
// ...
您还可以创建一个包含两个实体并为其创建表单的模型。使用$mainEntity->getEntity1();
来检索已封装的实体。
答案 1 :(得分:0)
Symfony 3.20
构建FormType时,在控制器中执行route&如下所示的行动,使用" if($ formRegister-> isSubmitted()&& $ formRegister-> getClickedButton(' form2')&& ...)"
class WelcomeController extends Controller
{
/**
* @Route("/welcome", name="welcome")
*/
public function welcomeAction(Request $request)
{
$uLogin = new User();
$formLogin = $this->createForm(LoginUserFormType::class, $uLogin);
$uRegister = new User();
$formRegister = $this->createForm(UserRegistrationFormType::class, $uRegister);
$authenticationUtils = $this->get('security.authentication_utils');
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
if ($request->isMethod('post')){
$formLogin->handleRequest($request);
$formRegister->handleRequest($request);
if($formLogin->isSubmitted() && $formLogin->getClickedButton('form1')){
return $this->redirectToRoute('login_success');
}
if ($formRegister->isSubmitted() && $formRegister->getClickedButton('form2') && $formRegister->isValid() ) {
$password = $this->get('security.password_encoder')
->encodePassword($uRegister, $uRegister ->getPlainPassword());
$uRegister ->setPassword($password);
$uRegister->setRole('ROLE_USER');
$em = $this ->getDoctrine() ->getManager();
$em -> persist($uRegister);
$em -> flush();
return $this->redirectToRoute('register_success');
}
}
return $this->render(
'form/welcome.html.twig',
array(
'form1' => $formLogin -> createView(),
'form2' => $formRegister -> createView(),
'last_username' => $lastUsername,
'error' => $error,
)
);
}
构建你的路由,就是这样: - )