我想问你如何通过jQuery表单序列化发送ajax请求并从控制器接收JSON响应?我一直在尝试很多解决方案,但没有一个能为我工作。我对此有一点经验。
你能提供任何好的例子吗?谢谢!
我正在使用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", ... }]
答案 0 :(得分:0)
示例:发布到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)(因为你不需要回应变量)。