【问题标题】:Validating symfony2 form with ajax使用 ajax 验证 symfony2 表单
【发布时间】:2015-05-23 17:15:30
【问题描述】:

这是我使用 Symfony2 的第一个项目,我正在尝试使用 ajax 持久化一个实体。下面是一些示例代码:

路由

...
version_ajax_create:
path:     /ajax-create
defaults: { _controller: "CustomNameBundle:Version:ajax" }
methods:  POST
...

控制器

public function ajaxAction()
    {
        $request = $this->get('request');
        $em      = $this->getDoctrine()->getManager();
        $entity  = new Version();

        // Get data from ajax
        $project_id = $request->request->get('project_id', 'null');
        // Get project and pass it to the entity
        $project = $em->getRepository('CustomNameBundle:Project')->find(array(
            'id' => $project_id
        ));

        $entity->setProject($project);

        $form = $this->createCreateForm($entity);
        $form->handleRequest($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($entity);
            $em->flush();

            $response = array('success' => true);
        } else {
            $response = array('success' => false);
        }

        return new JsonResponse($response);
    }

查看

  $('#add_new_version').on('click', function(e) {
        e.preventDefault();
        $.ajax({
            type: 'POST',
            url: '{{ path('version_ajax_create') }}',
            dataType: 'json',
            data: { 'project_id': '{{ entity.id }}' }
        })
        .done(function(data) {
            alert('success!')
            console.log(data);
        })
        .fail(function(data) {
            alert('fail!')
            console.log(data);
        });
    });

版本实体本身具有 id(自动生成)、创建和修改日期(带有生命周期回调)和一个关联的项目 id(多对 1 关系)。

我正在尝试创建一个仅传递项目 ID 的新版本。

我认为问题出在这一行

$form->handleRequest($request);

它需要一个序列化的 $request 而不仅仅是一个 JSON obj。

如果我禁用表单验证并直接保存实体,它将成功保存,但我不确定这是否是一个好习惯。

任何帮助或建议如何在这种情况下进行?

【问题讨论】:

    标签: php jquery ajax symfony entity


    【解决方案1】:

    嗯,如果我没听错的话,你应该可以使用:

    $project_id = $request->request->get('project_id', 'null');
    $form->submit(['form_name' => ['project_id' => $project_id ]]);
    
    if ( $form->isValid() ){
    
    }
    

    我不确定你说的是什么:

    它需要一个序列化的 $request 而不仅仅是一个 JSON obj。

    我知道AngularJS 使用JSON 将数据传输到服务器,但是我不知道jQuery 也这样做。是吗?

    【讨论】:

    • Project id 是表单中的一个字段。我尝试了您的代码,但它也不起作用...实际上我认为我创建和提交表单的概念不正确(并且可能由于 symfony2 在表单中创建的隐藏输入而导致验证失败)。我删除了表单内容和验证,并添加了一个 try-catch 语句来检查实体是否成功持久化。我确信这不是一个好的做法,任何其他想法都将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多