Symfony 表单和 Ajax

Posted

技术标签:

【中文标题】Symfony 表单和 Ajax【英文标题】:Symfony form & Ajax 【发布时间】:2021-04-06 20:52:36 【问题描述】:

我正在开发 Symfony 4.4。

要刷新表格,用户可以通过输入选择三个选项:

进行中 完成 全部

然后他们必须按下验证按钮。

我想通过自动刷新表格来改进这个页面的使用。

目前在我的模型上,我有 AJX,它允许我检索条目的值:

   <script>
    $(document).on('change', '#campagnes_tel_isAttending', function () 
        $('#flash').remove();
        let $field = $(this)
        let $preselect = $('#campagnes_tel_isAttending')
        let $form = $field.closest('form')
        let data = 
        data[$field.attr('name')] = $field.val()
        console.log(data)
        // On soumet les données
        // $.post($form.attr('action'), data).then(function (data) 
        //     // On récupère le nouveau <select>
        //     $('#planningsms_client_label').val($(data).find('#planningsms_client option:selected').text());
        //     let $input = $(data).find(target)
        //     // On remplace notre <select> actuel
        //     $(target).replaceWith($input)
        // )
    );
</script>

我现在卡住了,因为我无法弄清楚如何将信息返回到我的控制器,从而允许我使用输入值修改 PreSelect 变量并更改 SQL 查询的结构。

创建路线?在 Ajax POST 中调用路由? 在我的控制器中使用此路由?

我认为或多或少是这样,但另一方面我不知道如何实现它。

编辑:

它已经前进了一点。

我设法恢复了控制器中输入更改的数据。

另一方面,我尝试调用允许我使用所选过滤器进行新 SQL 查询的函数,但这似乎不起作用。

阿贾克斯:

    <script>
        $(document).on('change', '#campagnes_tel_isAttending', function () 
            $('#flash').remove();
            let $field = $(this)
            let $preselect = $('#campagnes_tel_isAttending')
            let $form = $field.closest('form')
            let data = 
            data['isAttending'] = $field.val()
            console.log(data)
            $.ajax(
                type: "POST",
                url: "/campagnestel/ajax",
                data: data,
                dataType: "json",
                success: function(response) 
                    console.log(response);
                
            );
        );
    </script>

在我的控制器中运行:

    /**
     * @Route("/ajax", methods="GET", "POST")
     */
    public function testAjax(Request $request)
    
        if (!$request->isXmlHttpRequest()) 
            return new JsonResponse(array(
                'status' => 'Error',
                'message' => 'Error'),
                400);
        

        if(isset($request->request)) 
            $preSelect = $request->request->get('isAttending');

            return $this->queryFollowingFilter($preSelect);
        

//        return $this->queryFollowingFilter($preSelect);
        return  new JsonResponse(array(
        'status' => 'OK'),
        200);

    

错误:

The controller must return a "Symfony\Component\HttpFoundation\Response" object but it returned an array

【问题讨论】:

【参考方案1】:

如错误消息所述:

控制器必须返回一个“Symfony\Component\HttpFoundation\Response”对象

JsonResponse 满足该要求并满足您的需求。试试这个:

    if($request->request->has('isAttending')) 
        $preSelect = $request->request->get('isAttending');

        return new JsonResponse(
          $this->queryFollowingFilter($preSelect),
          200
        );
    

【讨论】:

谢谢!它可以工作,另一方面,我的控制台中有数据,但刷新页面时无法显示它们。抱歉,我真的是从 Ajax 开始的。

以上是关于Symfony 表单和 Ajax的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 表单和 Ajax

枚举和 Symfony 表单的教义集合

如何使用 Symfony 表单和数据转换器实现测试隔离?

Symfony2 防止多个表单提交

Symfony2 表单和 <input> 模式属性

symfony2 构建表单实体 oneToMany