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



我试图避免为我在控制器上使用的每个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-和xml视图

我做错了什么?为什么我没有得到预期的结果,反而得到了null

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

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

我收到这个通知:

注意(8):未定义索引:1[CORE\Cake\View\JsonView.php,行89]代码上下文                $data = array();                foreach ($serialize as $key) {                    $data[$key] = $this->viewVars[$key];$view=空$layout=null$serialize=数组(';演示'=>#039;1';)$data=array()$key=';1';JsonView::render()-CORE\Cake\View\JsonView.php,第89行控制器::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}

根据我对文档的理解,您必须指定一个视图变量,然后在使用_serialize键时引用该变量。这意味着你的代码片段看起来像:

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

我的URL中没有.json扩展名,routes.php文件中也没有Router::parseExtensions('json');行,所以@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');
}

您可以创建一个元素并对其进行渲染。

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');
}

参见文档

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

public function fun() {
$this->autoRender = false;
$this->request->onlyAllow('ajax');
$result = array('data1' => 'hello', 'data2' => 'world');
return json_encode($result);
}

相关内容

  • 没有找到相关文章

最新更新