在Cakephp中呈现AJAX视图
我有一种方法可以根据请求类型呈现标准视图文件在Cakephp中呈现AJAX视图,php,ajax,cakephp,Php,Ajax,Cakephp,我有一种方法可以根据请求类型呈现标准视图文件index.ctp或AJAX视图文件index\u AJAX.ctp 在我的控制器中-我有以下代码 public function index() { if ($this->request->is(array('get', 'post))) { // .... do normal stuff } elseif ($this->request->is('ajax')) { $this->aut
index.ctp
或AJAX视图文件index\u AJAX.ctp
在我的控制器中-我有以下代码
public function index() {
if ($this->request->is(array('get', 'post))) {
// .... do normal stuff
} elseif ($this->request->is('ajax')) {
$this->autorender = false;
echo 'blah blah'; // this shows
$this->render('index_ajax', 'ajax'); // this does not render
exit;
}
}
调用此AJAX视图的Javascript如下所示
$('#myModal').on('show.bs.modal', function (event) {
$.ajax({
url: '/cake/myController/index',
type: 'ajax',
success: function(data) {
alert(data);
$('#link-list').html(data);
}
});
});
现在,普通的索引视图渲染得很好-没有任何问题,但是AJAX视图没有渲染。如果我在控制器中放入一个echo语句,该语句会被输出到视图,但实际的视图文件本身不会被拾取和渲染。我不确定我的错误是什么-非常感谢您的帮助。试试这个:
if ($this->request->is(array('get', 'post'))) {
// .... do normal stuff
} elseif ($this->request->is('ajax')) {
$this->view="index_ajax";
$this->layout="ajax";
}
在这之后,如果您使用的是块或类似的东西,而没有显示您的代码或类似的东西,请查看您的布局ajax。好的-经过大量的尝试和尝试,我找到了解决方案 对于我发布的原始问题,@mark给出了正确的答案,此后我加入了可用的插件——本质上,我们下载并包含了该链接中提到的插件,在控制器的AJAX方法中,我们添加了一行代码,如下所示
$this->viewClass = 'Tool.Ajax'
在ajaxjavascript中,包含以下代码行,它从解析的JSON数组中提取内容并嵌入到提供的HTML选择器中
$.ajax ({
url: '/myajaxurl',
type: 'ajax',
success: function(data) {
$('myDiv').html(data.content);
}
});
沃拉!现在将呈现AJAX视图。我检查了插件源代码,发现Mark实际上扩展了基本视图类,并重写了render方法,通过JSON数组呈现AJAX视图。然而,这给我带来了一个问题,因为我在AJAX视图中也有分页。因此,虽然链接可以很好地呈现,第一个页面可以很好地加载,但第二个页面和后续页面将作为未解析的JSON数组加载
为了克服这个问题,我不得不做了大量的修改,最终我发现我们需要放弃CakePHP手册中指定的默认AJAX分页,并使用Mark在这里提供的AJAX分页(以及相应的页面)。本质上,我们现在应该使用echo$this->Pagination->numbers()
元素('Tools.Pagination'),而不是使用默认的echo$this->Pagination->numbers(),我们应该包括一个javascript,它以以下方式绑定生成的分页链接-
假设分页链接位于标识为“分页”的div中,这些链接由Mark的插件动态生成
$(document).on('click', 'div.pagination a', function(evt) {
evt.preventDefault();
$('#myDiv').load($(this).attr('href'), function(data) {
var res = $.parseJSON(data);
$('#myDiv').html(content);
});
});
本质上,上面发生的事情是,我们将每个分页链接绑定到不同的事件,而不是CakePHP自动生成的事件。因此,我们通过load
方法加载hyperlink的内容,但是由于AJAX视图返回了一个JSON数组,因此我们正在解析它并相应地设置DIV的内容
希望这对其他人有帮助 请参阅如何利用扩展和一些自定义JS在CakePHP中轻松检索AJAX输出。PS:您应该经常提到您使用的确切cakephp版本。我使用的是cakephp 2.5.xMark-我查看了您的网站,但是您能帮助我理解为什么默认情况下在ajax布局中不呈现视图吗?当我们明确提到render时,怎么会传递回显的东西呢?我使用了AJAX视图,它工作得很好-但是当我将它与AJAX分页结合起来时,我有一个独特的问题。第一个页面呈现得非常好,但是第二个页面是一个转义的JSON数组。我认为,问题在于分页链接不会通过Javascript函数重定向-您对如何解决这个问题有什么建议吗?