【问题标题】:Rendering AJAX view in Cakephp在 Cakephp 中渲染 AJAX 视图
【发布时间】:2014-11-17 02:07:58
【问题描述】:

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

【问题讨论】:

  • 请参阅ajax-and-cakephp,了解如何利用扩展和一些自定义 JS 在 CakePHP 中轻松检索 AJAX 输出。 PS:您应该始终提及您正在使用的确切 cakephp 版本。
  • 我使用的是 CakePHP 2.5.x
  • 马克 - 我查看了您的网站,但请您帮我理解为什么视图在 ajax 布局中默认不呈现?回显的东西是如何传递的,但当我们明确提到渲染时却没有传递?
  • 我使用了 AJAX 视图,它工作正常 - 但是当我将它与 AJAX 分页结合使用时,我遇到了一个独特的问题。第一页呈现得非常好,但是第二页是一个转义的 JSON 数组。我认为,问题在于分页链接没有通过 Javascript 函数重定向 - 你对如何解决这个问题有什么建议吗?

标签: php ajax cakephp


【解决方案1】:

试试这个:

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

       }

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

【讨论】:

    【解决方案2】:

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

    对于我发布的原始问题,@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 在此 link 提供的 AJAX 分页(以及适当的source code)。本质上,我们现在应该使用echo $this->element('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方法加载超链接的内容,但是由于AJAX视图返回一个JSON数组,我们正在解析它并相应地设置DIV的内容。

    希望这对其他人有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 2013-08-28
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      相关资源
      最近更新 更多