如何用cakePHP执行ajax请求?

时间:2013-10-18 14:49:34

标签: javascript php jquery ajax cakephp

我知道这应该是显而易见的,但我无法在互联网上找到任何有用或更新的内容。

我试图用ajax执行请求,获取视图内容以及从cakePHP控制器执行的JS代码。

请求是:

  $.ajax({
    url: '/alarm/fetchGadgetsComponent',
    type: "POST",
    cache: false,
    dataType: 'json',
    success: function (data) {
       console.log(data);
    }
 });

,PHP类看起来像这样:

class AlarmController extends AppController {
    public $uses = false;
    public $components = array('RequestHandler');
    public function index() {

    }


    public function fetchGadgetsComponent()
    {
        if ($this->request->is('Ajax'))
        {
            $this->autoRender = false;
            $this->layout = 'ajax';

            $html = $this->render('ajax\widgetsPanel');
            $js = $this->render('ajax\widgetsPanel.js');

            echo json_encode(array('html' => $html,'js' => $js));
        }
    }
}

首先,第一个渲染只是在屏幕上渲染到$html变量。 其次,如何使用不同的方法获取js文件? (渲染方法显然不适用于此,因为它搜索.ctp文件) 以及如何将它们作为json表达式一起解析?

谢谢

2 个答案:

答案 0 :(得分:0)

我知道json_encode是php函数,它将数组和其他php变量更改为有效的JSON,因此您无法获取javascript文件的内容并使用此方法将其更改为JSON。如果您想要更改,蛋糕渲染方法会呈现ctp文件查看前缀使用:

class AlarmController extends AppController {
    public $uses = false;
    public $components = array('RequestHandler');
    public function index() {

    }


    public function fetchGadgetsComponent()
    {
        if ($this->request->is('Ajax'))
        {
            $this->autoRender = false;
            $this->layout = 'ajax';

            $html = $this->render('ajax\widgetsPanel');

            $this->ext = '.js';
            $js = $this->render('ajax\widgetsPanel.js');

            echo json_encode(array('html' => $html,'js' => $js));
        }
    }
}

link to source code 我认为更好的方法是js文件的file_get_content函数。 第二个更好地执行ajax请求是jsonView

答案 1 :(得分:0)

如果这个.js代码被widgetsPanel使用,那么这应该是从ctp文件中引用的,最有可能是通过cakePHP的js或html帮助器,为此设置js文件的名称作为视图变量并在其中使用它ctp文件。

然后你不需要调用$ this-> render()两次,并且一个简单的echo可以很好地显示widgetsPanel的内容,所以你可以调用render方法并调用json_encode。 也将dataType更改为HTML,dataType JSON仅用于获取精益数据,而不是整个html视图块。