3

我试图避免为我在控制器上使用的每个 AJAX 函数创建一个视图。(因为我不以任何方式操作结果数据,并且在大多数情况下只是一个布尔值)

我在我的控制器上使用 RequestHandler 组件:

var $components = array('RequestHandler');

我添加了这个routes.php

Router::parseExtensions('json');

我正在尝试使此功能起作用,但我得到了一个null值:

public function test(){
    $this->layout = 'ajax';

    $result = '1';
    $this->set('_serialize', $result);
}

要访问json该功能的版本,我使用此 URL 完成.json以避免加载任何视图:

http://localhost/cakephp/demoController/test.json

我一直在遵循 CakePHP 文档中的步骤:http: //book.cakephp.org/2.0/en/views/json-and-xml-views.html#json-and-xml-views

我究竟做错了什么?为什么我没有得到预期的结果,而是得到一个null

另外,如果我尝试序列化一些数组,比如这个:

$result = array('demo' => '1');
$this->set('_serialize', $result);

我收到此通知:

注意(8):未定义索引:1 [ CORE\Cake\View\JsonView.php , line 89 ]代码上下文                $data = array();                 foreach ($serialize as $key) {                     $data[$key] = $this->viewVars[$key];$view = null $layout = null $serialize = array( 'demo' => '1' ) $data = array() $key = '1'JsonView::render() - CORE\Cake\View\JsonView.php,第 89 行 Controller::render() - CORE\Cake\Controller\Controller.php,第 957 行 Dispatcher:: _invoke() - CORE\Cake\Routing\Dispatcher.php,第 193 行 Dispatcher::dispatch() - CORE\Cake\Routing\Dispatcher.php,第 161 行需要 - APP\webroot\index.php,第 92 行 [main] - ROOT\index.php,第 42 行{“1”:null}

4

4 回答 4

4

据我了解文档,您必须指定一个视图变量,然后在使用_serialize密钥时引用该变量。这意味着您的代码段将如下所示:

$result = '1';
$this->set('theResult', $result);
$this->set('_serialize', array('theResult'));
于 2012-12-10T16:22:13.127 回答
1

我没有.jsonURL 中的扩展名和Router::parseExtensions('json');我的routes.php文件中的行,所以@dhofstet 的答案对我不起作用。

我的解决方案是添加renderAs()调用:

public $components = array('RequestHandler');

public function my_ajax_action() {
    // do something
    $result = '1';
    $this->set('result', $result);
    $this->set('_serialize', array('result'));
    $this->RequestHandler->renderAs($this, 'json');
}
于 2015-07-11T20:06:23.543 回答
-1

您可以创建一个元素并渲染它。

function test() {
    $this->autoRender = false;

    $result = array('demo' => '1');

    $this->set(compact('result'));
    $this->set('_serialize', array('result'));
    $this->render(DS.'Elements'.DS.'element_name');
}

查看文档

于 2012-12-10T14:53:50.563 回答
-3

最简单的方法是这样。对我来说效果很好。

public function fun() {
    $this->autoRender = false;
    $this->request->onlyAllow('ajax');

    $result = array('data1' => 'hello', 'data2' => 'world');

    return json_encode($result);
}
于 2015-04-22T05:23:34.157 回答