2011-01-07 35 views
2

我創建了一個Zend Framework網站,我現在更新它來根據用戶是否在移動設備上來切換佈局文件。在哪裏放置代碼來切換正在使用的Zend佈局的適當位置?

我已經寫了一個類來處理檢測,但我不知道哪裏最好放置此檢查並觸發正在使用的佈局文件。

代碼:

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

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

我都會觸發自舉功能_initViewHelpers()佈局,但我儘快得到一個500錯誤,因爲我加入包括以上線。

任何關於如何以及在何處放置這個的建議?我最初有一個幫手處理這個檢查,但是在佈局中使用了它,而不是讓我把整個佈局文件換掉。

回答

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' 
    ) 
); 

它實際上是我花了一段時間才能得到這個想通了,但一旦你通過它的工作,你會這麼多快樂。希望幫助:)

+0

不確定到底發生了什麼。我的邏輯會進入pre函數嗎? - > getModuleName()會返回什麼?只是從bootstrap pluginClass? – Andrew 2011-01-07 00:36:00

0

其實真正發生的是你有一個新的單獨的模塊稱爲「移動」和佈局插件助手實際上是做preDispatch()方法檢查這是否是模塊調用。之後,該方法正在改變佈局。這很複雜。我認爲你實際上可以爲你的移動版本和它的init()方法創建一個基礎控制器,用$ this - > _ helper-> layout-> changeLayout()來改變佈局。

相關問題