避免在CakePHP上为每个AJAX函数创建一个视图

时间:2012-12-10 14:49:00

标签: cakephp cakephp-2.0 cakephp-2.2 cakephp-2.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版本,请使用此.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 ,行 89 ]代码上下文{ {1}}                   $data = array();                   foreach ($serialize as $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行   require - APP \ webroot \ index.php,第92行   [main] - ROOT \ index.php,第42行{“1”:null}

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

我的网址和.json文件中的Router::parseExtensions('json');行没有routes.php扩展名,因此@dhofstet's answer对我不起作用。

我的解决方案是添加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');
}

答案 2 :(得分:-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');
}

See docs