CakePHP AJAX布局

我正在使用CakePHP应用程序和jQuery Mobile。 在CakePHP应用程序中,RequestHandler已打开,现在,jQuery Mobile将所有请求作为ajax请求,但需要一个完整的页面,而不仅仅是我的视图中的内容,而是完整的布局。

我需要requesthandler,我试图设置一个布局,强制渲染,关闭自动布局,没有任何作用,蛋糕只返回我的视图的内容。

我真的很想知道这里发生了什么。

如果有人有兴趣我找到了解决方案,我发现当你有RequestHandler并发出Ajax请求时,你做什么并不重要,RequestHandler然后通过回调决定你的布局是’ajax’,这个可能适用于所有非html请求类型,如json和text。

我必须设置

$this->RequestHandler->enabled = false; 

它确实需要在beforeFilter()中设置,后者在调用链中,它似乎不起作用。

所以我的代码最终成为:

 class AppController extends Controller { var $components = array('RequestHandler'); function beforeFilter() { if ($this->RequestHandler->isMobile()) { $this->RequestHandler->enabled = false //set special mobile rules here } } } 

我在CakePHP 1.3应用程序中遇到了同样的问题,该应用程序使用jQueryMobile来构建适合移动设备的视图。 我会尝试将其用于将来的搜索。

当我打开$.mobile.ajaxEnabled = true; 对于jQM很好的基于Ajax的导航,所有链接页面都显示undefined而不是页面内容。 Ajax导航要求链接页面具有适当的结构,如下所示:

 

Page Title

Page content goes here.

Page Footer

这个标记来自我的应用程序的两个地方:我的默认移动布局有pagefooter div。 每个视图都有一个headercontent div。

问题出现了,因为Cake的RequestHandler想要为所有Ajax请求将布局设置为ajax 。 它 beforeFilter() 之后的某个地方执行此操作,这导致它忽略了那里声明的布局(Luke提到)。

ajax布局是空的,与我的默认布局不同 – 它没有和其他标记,因为它假定(正确地)您只需要部分标记将由Ajax插入到页面中。 基于jQuery Ajax的导航确实希望看到完整的标记,当它在发出Ajax请求时没有收到格式良好的页面时,它没有可显示的页面。

所以问题变成了,“如何让RequestHandler使用我的默认移动布局来处理移动页面请求?” 我对Luke上面完全禁用RequestHandler的解决方案感到不满意。 幸运的是,我从2011年5月发现了一个post,同样的问题和更好的解决方案:

最后排序了! 我正在检查移动设备是否使用$ this-> RequestHandler-> isMobile()请求页面,但是已将其放在beforeFilter()函数中。 将其移动到app_controller.php文件中的beforeRender()函数可以解决问题。 http://cakephp.1045679.n5.nabble.com/Jquery-Mobile-and-CakePHP-1-3-td4422871.html

所以我的代码在AppController中结束了这样的事情:

 function beforeRender() { if ($this->RequestHandler->isMobile()) { $this->layout = 'm_default'; } } 

我希望能帮到那里的某个人。

只需设置$this->layout = 'default'; 在您的控制器中,它将使用默认布局。

或者也许你可以制作一个页眉和页脚元素来放入你的ajax和默认布局。

几周前,我是CakePHP的新手,并从第2版开始。

到目前为止,我还保持beforeFilter不变为标识符isMobile() ,最后在主题文件夹中使用移动视图。 因此,我不会在默认的桌面视图中使用子文件夹进行移动视图。 在条件中添加this-> layout之后,似乎我摆脱了仅通过某些动作链接出现的undefined

 public function beforeRender() { if($this->RequestHandler->isMobile()) { $this->theme = 'Mobile'; $this->layout = 'default'; } } 

我认为最好的解决方案是在应用程序控制器中检测到移动浏览器之后在filter之前配置请求处理程序:

 public function beforeRender() { if($this->RequestHandler->isMobile()) { $this->theme = 'Mobile';//set your theme $this->RequestHandler->ajaxLayout = 'public';//this does the trick, set your mobile layout, $this->layout is simply ignored or overwritten by the component } }