[英]CakePHP AJAX Layout
我正在使用CakePHP应用程序和jQuery Mobile。 在CakePHP应用程序中,RequestHandler已打开,现在,jQuery Mobile将所有请求作为ajax请求发出,但不仅需要整页,而且需要完整的页面布局。
我需要requesthandler,并且尝试设置布局,强制渲染,关闭自动布局,什么都没有用,cake只返回我视图的内容。
我真的很想知道这是怎么回事。
如果有人感兴趣,我找到了解决方案,我发现当您打开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
}
}
}
我在使用jQueryMobile来构建适合移动设备的视图的CakePHP 1.3应用程序中遇到相同的问题。 我会尝试将其布置以备将来搜索。
当我打开$.mobile.ajaxEnabled = true;
对于jQM的基于Ajax的不错的导航,所有链接的页面都显示为undefined
而不是页面内容。 Ajax导航要求链接页面具有正确的结构,如下所示:
<div data-role="page">
<div data-role="header">
<h1>Page Title</h1>
</div><!-- /header -->
<div data-role="content">
<p>Page content goes here.</p>
</div><!-- /content -->
<div data-role="footer">
<h4>Page Footer</h4>
</div><!-- /footer -->
</div><!-- /page -->
不过,此标记来自我的应用程序的两个位置:我的默认移动布局具有<html>
, <body>
以及page
和footer
div。 每个视图都有header
和content
div。
之所以出现此问题,是因为Cake的RequestHandler希望将所有Ajax请求的布局都设置为ajax
。 它在 beforeFilter()
之后的某个地方执行此操作,这导致它忽略在那里声明的布局(Luke提到了)。
与我的默认布局不同, ajax
布局是空的-它没有<html>
和其他标记,因为它(正确地)假设您只希望将部分标记由Ajax插入到页面中。 但是,基于jQuery Ajax的导航确实希望看到完整的标记,并且在发出Ajax请求时没有收到格式正确的页面时,就没有页面可以显示。
因此,问题变成了:“如何使RequestHandler对移动页面请求使用默认的移动布局?” 我对Luke上面的完全禁用Mobile的RequestHandler的解决方案不满意。 幸运的是,我在11年5月发现了一个存在相同问题和更好解决方案的帖子:
终于排序了! 我正在检查移动设备是否正在使用$ 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';
}
}
我希望这可以帮助某个人。
我是CakePHP的新手,几周前开始使用Version 2。
到目前为止,我还保持了beforeFilter不变,直到标识符isMobile()
并最终在主题文件夹中使用移动视图。 因此,在默认的桌面视图中,我不对移动视图使用子文件夹。 在条件中添加this-> layout之后,似乎摆脱了仅通过一些action链接出现的undefined
。
public function beforeRender() {
if($this->RequestHandler->isMobile()) {
$this->theme = 'Mobile';
$this->layout = 'default';
}
}
我认为最好的解决方案是在应用控制器中检测到移动浏览器之后,在过滤器之前配置请求处理程序:
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
}
}
只需设置$this->layout = 'default';
在您的控制器中,它将使用默认布局。
或者,您可以制作一个header和footer 元素以放入您的ajax和默认布局。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.