简体   繁体   English

使用ajax在Symfony 3中提交多个表单?

[英]Using ajax to submit multiples form(s) in Symfony 3?

I'm trying to create a dynamic 2-step form using Jquery where in "step 1", I want to submit the form data without refreshing my page so that I can hide my html division containing my form and show the other representing my step 2 using Jquery. 我正在尝试使用Jquery创建一个动态的两步表单,其中在“步骤1”中,我想提交表单数据而不刷新页面,以便隐藏包含表单的html分区,并显示另一个代表我的步骤的表单2使用Jquery。

The problem is that I'm using a collection of forms in my controller action like this: 问题是我在这样的控制器操作中使用了一组表单:

public function indexAction(Request $request)
{

$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository('ATPlatformBundle:NoteDeFrais');


$form = $this->get('form.factory')->createBuilder(FormType::class)
->add('ndf', CollectionType::class,array(
'entry_type'   => NoteDeFraisType::class,
'label'        => false,
'allow_add'    => true,
'allow_delete' => true,
))
->getForm(); 

And I'm getting the forms data submitted from like this: 我正在从这样提交表单数据:

if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()
&& isset($_POST['next_button'])) {

$notesDeFrais = $form['ndf']->getData();

foreach ($notesDeFrais as $ndf) {
$ndf->setUser($user);
$em->persist($ndf);
}

$em->flush();

}

elseif (isset($_POST['validate_button'])) {

foreach ($listNdf as $ndf) {
$ndf->setSubmitted(true);
}
$em->flush();
}

So what I wanted to know is how to send my data via an ajax request and how to get them from my action. 所以我想知道的是如何通过ajax请求发送数据以及如何从操作中获取数据。 So far I tried to proceed like this but it (logically) doesn't work. 到目前为止,我试图像这样继续进行,但是(在逻辑上)不起作用。

$("div#bloc_validation").css("display", "none");

$("#next_button").click(function(){

$(".form_ndf").each(function(){

$.post("{{ path('platform_homepage') }}",
{ndf: $(this).serialize()}, //My issue is here
function(){
alert('SUCCESS!');
}
);
});

$("div#form_bloc ").css("display", "none");
$("div#bloc_validation").css("display", "block");
});

Do you have any ideas ? 你有什么想法 ? Thanks in advance 提前致谢

The most basic approach is this: 最基本的方法是这样的:

add a javascripts block in your twig file with the content as below. 在您的树枝文件中添加一个javascripts块,其内容如下。 Change appbundle_blog in the first line inside the .ready() function in the name of your form . 在.ready()函数内的第一行中,以表单的名称更改appbundle_blog (Inspect your html to find it). (检查您的html来找到它)。

{% extends 'base.html.twig' %}

{% block body %}
    {{ form_start(edit_form) }}
        {{ form_widget(edit_form) }}
        <input type="submit" value="Save Changes" />
    {{ form_end(edit_form) }}
{% endblock %}

{% block javascripts %}
    <script
        src="https://code.jquery.com/jquery-3.3.1.min.js"
        integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
        crossorigin="anonymous">
    </script>
    <script>
        $(document).ready( function() {
          var form = $('form[name=appbundle_blog]');

          form.submit( function(e) {
            e.preventDefault();
            $.ajax( {
              type: "POST",
              url: form.attr( 'action' ),
              data: form.serialize(),
              success: function( response ) {
                console.log( response );
              }
            });
          });
        });
    </script>
{% endblock %}

If the form has been submitted you have to answer to an AJAX request. 如果已提交表单,则必须回答AJAX请求。 Therefore you could render another template.. 因此,您可以渲染另一个模板。

/**
 * Displays a form to edit an existing blog entity.
 *
 * @Route("/{id}/edit", name="blog_edit")
 * @Method({"GET", "POST"})
 */
public function editAction(Request $request, Blog $blog)
{
    $editForm = $this->createForm('AppBundle\Form\BlogType', $blog);
    $editForm->handleRequest($request);

    if ($editForm->isSubmitted() && $editForm->isValid()) {
        $this->getDoctrine()->getManager()->flush();

        /* render some new content */
        return $this->render('blog/ajax.html.twig', array(
            'blog' => $blog,
        ));
    }

    return $this->render('blog/edit.html.twig', array(
        'blog' => $blog,
        'edit_form' => $editForm->createView(),
    ));

Or answer in JSON: 或用JSON回答:

use Symfony\Component\HttpFoundation\JsonResponse;

/**
 * Displays a form to edit an existing blog entity.
 *
 * @Route("/{id}/edit", name="blog_edit")
 * @Method({"GET", "POST"})
 */
public function editAction(Request $request, Blog $blog)
{
    $editForm = $this->createForm('AppBundle\Form\BlogType', $blog);
    $editForm->handleRequest($request);

    if ($editForm->isSubmitted() && $editForm->isValid()) {
        $this->getDoctrine()->getManager()->flush();

        return new JsonResponse(array(
            'status' => 'success',
            // ...
        ));
    }

    return $this->render('blog/edit.html.twig', array(
        'blog' => $blog,
        'edit_form' => $editForm->createView(),
    ));
}

If you want you can even test if the request is an AJAX request or not: 如果您愿意,甚至可以测试该请求是否为AJAX请求:

if($request->isXmlHttpRequest()) {
    // yes it is AJAX
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM