通过POST发送jQuery.serialize表单,期待来自控制器的JSON响应

时间:2013-12-11 19:16:43

标签: php jquery ajax json cakephp-2.0

我想问你如何通过jQuery表单序列化发送ajax请求并从控制器接收JSON响应?我一直在尝试很多解决方案,但没有一个能为我工作。我对此有一点经验。

你能提供任何好的例子吗?谢谢!

  1. 通过AJAX发送序列化表格(POST)的帖子
  2. 在控制器功能中处理操作并在ajax中获取JSON响应 - >成功
  3. 我正在使用CakePHP 2.4.1


    我的ajax请求

           $.ajax({
           type: "post",
           url: location.pathname + "/edit",
           data: data,
           success: function(response) {
                $("#content").html(response); // i would like to recieve JSON response
                alert(response);              // here ;C
    
           },
           error: function(){        
                    alert("error");
           }
           });
    

    我在控制器中的部分功能

          public function admin_edit(){
            //................ some logic passed 
            if($this->request->is('ajax')){
            $this->layout = 'ajax';
            $this->autoRender = false;
            $this->set(compact('user'));
            $this->disableCache();
            foreach($this->request->data['User'] as $key => $value){
                if(empty($value)){
                    unset($this->request->data['User'][$key]);
                }
            }
            $this->User->id = $this->request->data['User']['id'];
            if($this->User->save($this->request->data)){
                $this->Session->setFlash('Użytkownik został zmodyfikowany');
                return $this->redirect(array('action' => 'index'));
            }
            $this->Session->setFlash('Nie zmodyfikowano użytkownika');
            }
          }
    

    我想接受的是来自控制器的JSON响应。 示例

      [{"id":"1", "username":"test", ... }]
    

2 个答案:

答案 0 :(得分:0)

JQuery.com

有一个例子

示例:发布到test.php页面并获取以json格式返回的内容

 <?php echo json_encode(array("name"=>"John","time"=>"2pm")); ?>

$.post( location.pathname + "/edit", data, function( data ) {
  console.log( data.name ); // John
  console.log( data.time ); // 2pm
}, "json");

所以插入你的ajax调用是这样的:

$.post( "test.php", data, function(response) {
            $("#content").html(response); 
            alert(response);              

       }, "json");

编辑:如果你没有得到正确的答案,请显示回复或返回json的php代码。它不在你提供的那个函数的任何地方。

答案 1 :(得分:0)

好吧,我认为让你感到困惑的是小东西,但混合在一起对于经验不足的人来说可能有点难以调试。我将发布一个应该适合您的基本示例,然后重复一遍。告诉我们是否还有其他错误(更容易检查特定错误而非视图/控制器可能错误)。

首先,在ajax调用中,更改console.log(response);以更好地调试

    //alert(response);
    console.log(response);
},
error: function(){        
    alert("error");
    console.log(response);
}
});

在控制器中

  public function admin_edit(){
    //................ some logic passed 
    if($this->request->is('ajax')){
        /* layout not necessary if you have autoRender = false */
        //$this->layout = 'ajax';
        /* actually, no need for this either with _serialize, but add it if you have unwanted html rendering problems */
        //$this->autoRender = false;

        $this->set(compact('user'));

        /* other code that doesn't really matter for the example ... */

        $this->User->id = $this->request->data['User']['id'];
        if($this->User->save($this->request->data)){
           /* NO!! */
           //$this->Session->setFlash('Użytkownik został zmodyfikowany');
           //return $this->redirect(array('action' => 'index'));

           $status = 'OK';
           $message = 'Użytkownik został zmodyfikowany';
           $this->set(compact('message', 'status'));
        }
        /* NO EITHER!! */
        //$this->Session->setFlash('Nie zmodyfikowano użytkownika');
           $status = 'NOT-OK';
           $message = 'Not sure what your flash says but let\'s assume it an error alert';
           $this->set(compact('message', 'status'));

        //serialize variables you have set for the "ghost" view
        $this->set('_serialize', array('user', 'message', 'status'));
    }
  }

我认为你的主要缺陷是返回重定向。这对于json来说是不可能的。你正在做的是给ajax调用html作为索引动作。这是没有意义的。如果你想让动作返回JSON,那么所有的情况都必须返回json,而不是html。所以,没有setFlash,没有redirect。我通常在这里做的是返回带有状态和消息的JSON数据(如上面的代码中所示)。然后,在ajax调用中,成功时,您解析JSON数据,读取状态,如果确定,您重定向(通过js),如果没有,则显示您收到的错误消息。

希望你清楚的事情。

[tiny edit]:json_encode也可以,但是在CakePHP中,做CakePHP(ians?)做什么(serialize)(因为你不需要回应变量)。