2010-08-01 82 views
0

美好的一天!AJAX调用和JSON数据

我正在学习创建AJAX调用PHP脚本。

基本上,我想找到处理AJAX调用的最佳解决方案。在this问题中,您可以找到我的客户端代码部分。

基本上,我想验证我的知识,如果我错了,得到任何提示如何使它正确的方式。

所以...我使用KohanaPHP框架(但也要学习ZendFramework)。我用以下代码创建了一个测试控制器:

public function __construct() 
{ 
    if (request::is_ajax()) { 
     $this->auto_render = FALSE; 
     header('content-type: application/json'); 
    } 
} 

public function index() 
{ 
    $result['success'] = 1; 

    $test_model = new Test_Model; 
    $items = $test_model->get_test_rows(); 
    foreach($items as $item): 
     $rows[] = $item; 
    endforeach;  
    $result['rows'] = json_encode($rows); 

    if (request::is_ajax()) { 
     echo json_encode($result); 
    } 
} 

现在我收到了几个与此代码相关的问题。让我问他们。

1)在上面提到的线程中,我被告知不必使用$.parseJSON();函数,我可以使用data.rows[0]name来代替。不幸的是,它不起作用。对于这不是一个大问题,我可以使用$.parseJSON();,但我想知道我的PHP代码中是否有错误?

2)我试图学习良好的做法和技术,我尽量不违反MVC规则。我有一个MVC相关的问题。是否可以在控制器中使用echo()?您可能会注意到我正在使用它来返回JSON编码的数据。

+1

什么是is_asjax函数?对我来说,根据它是否接收到Ajax调用,您的页面返回不同的结果似乎有点可疑。相反,请考虑一个名为“格式”的变量,其值为“json”,“xml”等。 – 2010-08-01 14:50:08

回答

1

回答问题(2):是的,在控制器中通常是echo的错误形式。我甚至会说,构建任何类型的字符串都是不好的形式。

然而,在所有这一切正在输出是JSON的情况下,我认为它只是更容易,更简洁,只是echo json_encode($results);如果你真的想成为一个MVC纯粹的,你总是可以创建一个什么也不做,但echo json(...);文件。

1

1)jQuery.ajax函数足够聪明,可以解析您的JSON响应,只要您告诉它您要返回一个JSON封装对象。下面是你的后端的Kohana可以告诉你的前端的jQuery它们在JSON说话,在你的控制器:

$this->request->headers['Content-Type'] = 'application/json'; 

2)没有什么不好的,使用echo但因为使用的是Kohana的,返回响应的推荐方法浏览器客户端,从控制器内,是:

$this->request->response = json_encode($result); 
+0

不幸的是,当我使用'$ this-> request-> response = json_encode($ result);'脚本不会返回任何东西。显然,我在KO文档中找不到任何东西。 – Tom 2010-08-01 15:54:02

+0

对不起,'$ this-> request-> response'用于Kohana 3.x ..而你正在使用Kohana 2.x,它仍然使用'echo'输出.. – Lukman 2010-08-02 09:17:50

+0

不需要抱歉。我运行了一项研究,并在KO3文档中找到它。无论如何,我现在更愿意继续使用2.3.4版本,因为KO3将会被我多次改动(根据版本2.x更新日志)。不管怎样,谢谢。 – Tom 2010-08-02 20:21:53

0

在您的代码:

$result['rows'] = json_encode($rows); 

if (request::is_ajax()) { 
    echo json_encode($result); 
} 

我想说这应该是:

$result['rows'] = $rows; 

if (request::is_ajax()) { 
    echo json_encode($result); 
} 

我不知道is_ajax的用途是什么,但这可能是一个不必要的检查。但是可能发生的情况是您对行进行了编码,然后编码了整个结果集。所以当解析和你做parseJSON时,你必须再次为数组的行索引做到这一点。

+0

是的,在我发布这个问题后我注意到了这一点;) – Tom 2010-08-01 15:58:41

+0

我在处理需要处理直接和ajax请求的控制器时使用了simliar模式。根据请求是否为ajax选择输出方式对于保持DRY逻辑非常有用。 – 2010-08-01 16:16:06