在哪里放置代码来切换正在使用的Zend Layout?

时间:2011-01-07 00:13:03

标签: zend-framework zend-layout

我创建了一个Zend Framework网站,我现在正在更新它以根据用户是否在移动设备上来切换布局文件。

我已经编写了一个处理检测的类,但我不知道最好放置此检查的位置,还会触发正在使用的布局文件。

代码:

include(APPLICATION_PATH . "/classes/MobileDetection.php");
$detect = new MobileDetect();

if ($detect->isMobile()) {
    $layout = $layout->setLayout('mobile');
} 

我可以从Bootstrap函数_initViewHelpers()触发布局,但是一旦我添加上面的include行,就会出现500错误。

有关如何以及在何处放置此建议的任何建议?我最初有一个帮助处理检查,但是在布局本身使用,而不是让我交换整个布局文件。

3 个答案:

答案 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

如何以及在何处重定向?

此致