4

我在视图中有这个脚本:

<script type="text/javascript">
$(document).ready(function() {
    $("#addbrand").click(function() {
        $.ajax({
            url : '../brands/add',
            data : {
                name : "test",
                shortname : "tst"
            },
            dataType : 'json',
            success : function(html, textStatus) {
                alert('Success ' + textStatus + html);
            },
            error : function(xhr, textStatus, errorThrown) {
                alert('An error occurred! ' + errorThrown);
            }
        });
    });
});</script>

在添加控制器中,我有以下几行:

... else if($this->request->is('ajax')){
        if ($this->Brand->save($this->request->query)) {
            // How to send feedback!?
        }else{
            // How to send feedback!?
        }
        $this->autoRender = false;
        exit();
    }

当我单击 addbrand 时,Ajax 操作成功运行,并且我可以在数据库中看到添加的行,但我不知道如何向用户发送错误或成功消息。我已经阅读了几篇教程,但没有一篇是关于 cakephp2.0 的,而一切都在 2.x 中发生了变化。我也读过JSON 和 XML 视图,但不幸的是我什么都不懂!!!我需要发送一个状态码。如果状态正常,那么我应该发送一个字符串数组(实际上是品牌名称),如果状态不正常,我应该发送一个字符串来解释操作未成功完成的原因。如果有人可以帮助我,我将不胜感激。谢谢


更新:

我更改了代码。我使用了 CakeResponse(),现在我的操作是这样的:

if($this->RequestHandler->isAjax()){
        if ($this->Brand->save($this->request->query)) {
            return new CakeResponse(array('body'=> json_encode(array('val'=>'test ok')),'status'=>200));
        }else{
            return new CakeResponse(array('body'=> json_encode(array('val'=>'test not ok')),'status'=>500));
        }
    }

使用 CakeResponse 我可以很好地处理 Jquery 中可能出现的响应。

$("#addbrand").click(function() {
        $.ajax({
            url : '../brands/add',
            data : {
                name : "test",
                shortname : "tst"
            },
            dataType : 'json',
            success : function(data) {
              alert("The brand has been saved");
            },
            error : function(data) {
              alert("Eorror occured");
            },
            complete : function(data) {
                alert($.parseJSON(data.responseText).val);
            }
        });
    });

尽管在我看来现在一切正常,并且我可以通过 Ajax 在客户端和服务器之间以 JSON 格式发送多个变量,但我需要知道它是否是在 CakePHP 中发送 Ajax 响应的标准方式?有没有其他更简单的方法可以做到这一点?

4

2 回答 2

7

以下代码行完全return new CakeResponse(array('body'=> json_encode(array('val'=>'test ok')),'status'=>200));符合我的问题:

$this->set('val','test ok');
$this->set('_serialize',array('val'));
$this->response->statusCode(200);

请记住,您需要做两件重要的事情:

  1. 添加Router::parseExtensions('json');到 App/Config/routs.php。
  2. 添加var $components = array("RequestHandler");到您的控制器。

我认为这种方式更好,因为您不需要返回任何东西。在以前的解决方案中,我们必须返回 cakeresponse 对象,而这对动作的性质感到不安。

于 2012-09-18T12:11:56.060 回答
2

您应该使用带有路由扩展的JSON 视图:首先您需要设置路由扩展。这通常通过以下方式完成:

Router::parseExtensions('json'); // In App/Config/routes.php

这将使路由器能够处理“json”扩展并知道如何处理请求,例如:www.example.com/people/index.json

if($this->RequestHandler->isAjax()){
    if ($this->Brand->save($this->request->query)) {
        //Logic for success
    } else {
       //Logic for save failure
    }
}

此时,您可以选择使用带有序列化键的数据视图或使用带有视图文件的数据视图(从 CakeBook 复制):

<?php
// Controller code
class PostsController extends AppController {
    public function index() {
        $this->set(compact('posts', 'comments'));
    }
}

// View code - app/View/Posts/json/index.ctp
foreach ($posts as &$post) {
    unset($post['Post']['generated_html']);
}
echo json_encode(compact('posts', 'comments'));

请注意,视图位于 .../Views/Posts/ json /... 您可以在路由器中有多个扩展,因此您可以返回和处理各种内容 - 毕竟这只是数据表示。

干杯!

于 2012-09-19T07:14:55.247 回答