在Cakephp中渲染AJAX视图

时间:2014-11-17 02:07:58

标签: php ajax cakephp

我有一个方法会根据请求类型呈现标准视图文件index.ctp或AJAX视图文件index_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语句,那么该语句会输出到视图,但实际的视图文件本身不会被拾取和渲染。我不确定我的错误是什么 - 感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

试试这个:

 if ($this->request->is(array('get', 'post'))) {
         // .... do normal stuff
       } elseif ($this->request->is('ajax')) {
         $this->view="index_ajax";
         $this->layout="ajax";

       }

在此之后,如果您使用块或类似的东西,不要显示您的代码或类似内容,请查看您的布局ajax。

答案 1 :(得分:1)

好的 - 经过大量的反复试验和试验后,我找到了解决方案。

对于我发布的原始问题,@ mark给出了正确的答案,然后我将可用的插件here合并 - 实际上,我们下载并包含该链接和AJAX方法中提到的插件我们的控制器我们在下面添加了一行

$this->viewClass = 'Tool.Ajax'

在你的AJAX javascript中包含以下行,它从解析的JSON数组中提取内容并嵌入提供的HTML选择器中

$.ajax ({
   url: '/myajaxurl',
   type: 'ajax',
   success: function(data) {
       $('myDiv').html(data.content);
   }
});

足底!现在可以呈现AJAX视图了。我检查了插件源代码,发现Mark基本上扩展了Basic视图类并重写了render方法,以通过JSON数组呈现AJAX视图。然而,这对我来说是一个问题,因为我在我的AJAX视图中也有分页。因此,虽然链接将被渲染得很好并且第一页可以正常加载,但第二页和后续页面将作为未解析的JSON数组加载。

为了解决这个问题,我不得不做了很多摆弄,我终于弄清楚我们需要放弃CakePHP手册中指定的默认AJAX分页,并使用Mark提供的AJAX分页link(沿着适当的source code)。基本上,我们现在应该使用echo $this->Pagination->numbers()而不是使用默认的echo $this->element('Tools.pagination'),我们应该包含一个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方法加载超链接的内容,但由于AJAX视图返回了JSON数组,我们正在解析它并相应地设置DIV的内容。

希望这有助于其他人下线!