【问题标题】:Symfony 2 multiple form in same page SubmitionSymfony 2在同一页面提交多个表单
【发布时间】:2014-12-03 12:07:57
【问题描述】:

我尝试在同一页面上进行简单的登录注册。

  • 一种登记表
  • 一个用于登录的表单。

我设法在我想要的页面上呈现 2 个表单,但如果我尝试提交注册表单,它会给我一个消息,指出另一个表单不能为空。

在我尝试合并页面之前,我的注册工作没有任何问题,我的登录不是(只是创建了表单)我的代码:

AccountController.php 渲染到模板的文件。

RegistrationType.phpLoginType.php中实现了表单创建

<?php
namespace Spyros\MapBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Spyros\MapBundle\Form\Type\RegistrationType;
use Spyros\MapBundle\Form\Type\LoginType;
use Spyros\MapBundle\Form\Model\Registration;
use Spyros\MapBundle\Form\Model\Login;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class AccountController extends Controller
{
    public function registerAction()
    {
        $registration = new Registration();
        $form1 = $this->createForm(new RegistrationType() , $registration, array(
            'action' => $this->generateUrl('account_create') ,
        ));

        $login = new Login();
        $form2 = $this->createForm(new LoginType() , $login, array(
            'action' => $this->generateUrl('account_create') ,
        ));

        return $this->render('SpyrosMapBundle:Account:register.html.twig', array(
            'form1' => $form1->createView() ,
            'form2' => $form2->createView()
        ));

    }

    public function createAction(Request $request)
    {

        $em = $this->getDoctrine()->getManager();

        $form1 = $this->createForm(new RegistrationType() , new Registration());

        $form1 > handleRequest($request);

        if ($form1->isValid())
        {
            $registration = $form1->getData();

            $em->persist($registration->getUser());
            $em->flush();
            echo "<p>hi</p>";
        }
        return $this->render('SpyrosMapBundle:Account:register.html.twig', array(
            'form1' => $form1->createView()
        ));

    }

}

register.html.twig:

{% extends 'SpyrosMapBundle::rightform.html.twig' %}
{% form_theme form1 'bootstrap_3_layout.html.twig' %}
{% form_theme form2 'bootstrap_3_layout.html.twig' %}
{% block body %}
<body>
   <section class="container">
      <section class="row">
         <section class="col col-lg-9">
            {{ form_start(form2 , {'attr': {'class': 'form-inline'}} )}}
            {{ form_row(form2.user.email)}}
            {{ form_row(form2.user.plainPassword)}}
            <div id="inline">
               {{ form_row(form2.Login) }}
            </div>
         </section>
         <section class="col col-lg-3">
            {{ form(form1) }}
         </section>
      </section>
   </section>
</body>
{% endblock %}

我的视图页面:

我如何在没有 form2 的情况下提交我的注册表单 (form1) 给我一条消息以填写其字段。

【问题讨论】:

  • 不要对每个表单使用相同的 action="",而是为每个表单创建一个专用控制器,并确保两者都不会尝试处理另一个。
  • 如果我为每个表单制作 2 个专用控制器,我将如何在同一页面中租用它们?
  • 你是什么意思?您希望能够同时填写和发送这两个表格吗?
  • 我不想同时提交它们,只希望看到两个表单并能够提交其中一个。专用控制器将仅用于提交?不创造?

标签: php symfony symfony-forms symfony-2.6


【解决方案1】:

我假设是您的浏览器在抱怨空白字段? Symfony 2 表单中不太有趣的事情之一是,默认情况下,所有字段都是必需的。这是通过在输入元素本身上设置必需属性来实现的。然后浏览器处理该属性。

解决此问题的几种方法。创建元素时设置 required = false :

     $builder->add('name','text', array(
        'required' => false,  /***** Make it optional *****/
        'label'    => 'Your Name',
        'trim'     => true,
        'constraints' => array(
            new NotBlankConstraint($constraintOptions),
        ),
        'attr' => array('size' => 30),
    ));

您也可以在创建表单时将其传递给表单选项,因此默认情况下所有内容都是可选的。

您还可以在 twig 模板中向表单元素本身添加一个简单的 novalidate 属性。

顺便说一句,正如@Spiro 建议的那样,如果您使用的是内置安全系统,那么您需要将每个表单提交到不同的 url。否则安全系统会拦截你的创建用户请求。

http://symfony.com/doc/current/reference/forms/types/form.html#required

【讨论】:

  • 谢谢我的朋友 :) 先尝试工作,但我会做安全系统的第二个原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 2012-12-15
相关资源
最近更新 更多