繁体   English   中英

CakePHP AJAX布局

[英]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>以及pagefooter div。 每个视图都有headercontent 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM