我创建了一个Zend Framework网站,我现在正在更新它以根据用户是否在移动设备上来切换布局文件。
我已经编写了一个处理检测的类,但我不知道最好放置此检查的位置,还会触发正在使用的布局文件。
代码:
include(APPLICATION_PATH . "/classes/MobileDetection.php");
$detect = new MobileDetect();
if ($detect->isMobile()) {
$layout = $layout->setLayout('mobile');
}
我可以从Bootstrap函数_initViewHelpers()
触发布局,但是一旦我添加上面的include行,就会出现500错误。
有关如何以及在何处放置此建议的任何建议?我最初有一个帮助处理检查,但是在布局本身使用,而不是让我交换整个布局文件。
答案 0 :(得分:2)
您可以使用插件,这就是我的工作:
<?php
class Mobile_Layout_Controller_Plugin_Layout extends Zend_Layout_Controller_Plugin_Layout
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
switch ($request->getModuleName()) {
case 'mobile': $this->_moduleChange('mobile');
}
}
protected function _moduleChange($moduleName) {
$this->getLayout()->setLayoutPath(
dirname(dirname(
$this->getLayout()->getLayoutPath()
))
. DIRECTORY_SEPARATOR . 'layouts/scripts/' . $moduleName
);
$this->getLayout()->setLayout($moduleName);
}
}
我将其保留在library/ProjectName/Layout/Controller/Plugin/Layout.php
。
在你的Bootsrap中,你需要加入这样的东西:
Zend_Layout::startMvc(
array(
'layoutPath' => self::$root . '/application/views/layouts/scripts',
'layout' => 'layout',
'pluginClass' => 'Mobile_Layout_Controller_Plugin_Layout'
)
);
实际上花了我一段时间才弄明白这一点,但是一旦你完成它,你就会所以更快乐。希望有所帮助:)
答案 1 :(得分:0)
实际上真正发生的是你有一个名为“mobile”的新单独模块,而布局插件助手实际上正在执行preDispatch()方法检查这是否是被调用的模块。之后,该方法正在改变布局。这很复杂。我认为您实际上可以为您的移动版本创建一个基本控制器,并在其init()方法中使用$ this-&gt; _helper-&gt; layout-&gt; changeLayout()更改布局。
答案 2 :(得分:0)
想象一下,您有www.example.com,当您使用移动设备点击此页面时,您希望被重定向到mobile.example.com:
知道www是模块,移动设备是应用程序中具有不同布局的模块
我找到了有关如何检测移动设备的以下页面http://framework.zend.com/manual/de/zend.http.user-agent.html#zend.http.user-agent.quick-start
如何以及在何处重定向?
此致