我知道这应该是显而易见的,但我在互联网上找不到任何有用或更新的东西。
我正在尝试使用 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 表达式?
谢谢
我知道json_encode是将数组和其他 php 变量更改为有效 JSON 的 php 函数,因此您无法获取 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));
}
}
}
链接到源代码我认为更好的方法是file_get_content
js文件的功能。第二个更好地执行 ajax 请求是 jsonView
如果这个.js代码被widgetsPanel使用,那么它应该从ctp文件中引用,最有可能通过js或cakePHP的html助手,为此将js文件的名称设置为视图变量并在ctp文件中使用它。
那么你就不需要调用$this->render()两次,一个简单的回显就可以显示widgetsPanel的内容,所以你将节省一次对渲染方法的调用和对json_encode的调用。还将 dataType 更改为 HTML,数据类型 JSON 仅用于获取精益数据而不是整个 html 视图块。