|
zend framework多模塊多布局配置 關鍵詞:模塊,布局,layout,配置zend framework對多模塊的支持是很好的,但是可能是由於功能太過強大的緣故,部署起來並不是很容易。許多人在使用過程中都會遇到這樣那樣的問題,而且 zend framework現在已經到1.11版本了,網絡上的很多資料都還停留在舊版本上,因此我在這里以當前的最新版本1.11為例,來簡單介紹一下如何使用 zend framework創建模塊化的應用程序。由於今后框架的版本升級,有些內容可能會過時,請及時參閱最新的使用手冊。 1、准備工作首先假設你已經部署了web服務器和php,並下載了zend framework的最新版本,創建了一個最原始的zend framework項目,並可以訪問默認的action了。你可以使用zend framework工具來創建項目,具體操作參見使用zend framework創建項目。當然也可以自己手動建立文件夾和文件,參見zend framework推薦的項目目錄結構。 簡單地看一下默認的幾個重要目錄。 如果你需要在項目中方便的使用你自己寫的一些類庫(如名稱空間是Rockux),或是第三方的類庫,可以修改application.ini文件,添加以下行:
autoloaderNamespaces.rockux
=
"Rockux_"
autoloaderNamespaces.thirdParty = "ThirdPartyLibrary_" 當然你也可以根據需要多添加幾個,不過請注意最后面的下划線。 2、建立模塊現在我們來創建一個admin模塊,目錄如下: 除了新建模塊文件之外,還需要更改配置文件application.ini,刪除以下行,如果有的話:
resources.frontController.controllerDirectory
=
APPLICATION_PATH
"/controllers"
再加上如下行:
resources.frontController.moduleDirectory
=
APPLICATION_PATH
"/modules"
resources.frontController.moduleControllerDirectoryName = "controllers" resources.frontController.defaultModule = "default" resources.modules [ ] 這樣,再訪問http://localhost/admin,應該就能看到admin模塊輸出的內容了。 如果我們要充分發揮模塊的強大功能,我們還需要為模塊添加一個啟動文件——Bootstrap.php。它可以使得你在事個模塊中方便的使用類資源,models, filters, helpers等。在admin下新建Bootstrap.php,代碼如下:
class Admin_Bootstrap
extends Zend_Application_Module_Bootstrap
{ } 並且在application/Bootstrap.php文件里加入以下方法:
protected
function _initAppAutoload
(
)
{ $autoloader = new Zend_Application_Module_Autoloader ( array ( 'namespace' => 'App' , 'basePath' => dirname ( __FILE__ ) , ) ) ; return $autoloader ; } 它將會自動加載models,filters,helpers等到我們的默認模塊。通過以上設置,我們就可以在接下來的controllers里使用所有這些資源了。 3、設置布局這里主要說明如何配置不同的模塊應用不同的布局,關於布局的概念和基本的用法,請參見官方文檔的創建布局和Zend_Layout入門。 對於一般頁面,你可能需要使用一個布局文件,如三行兩列式,而對於admin模塊,你可能需要使用另一種布局,如兩列式。要達到這個目的可以采用兩種方式。 在配置文件application.ini中添加如下幾行:
resources.layout.layoutPath
= APPLICATION_PATH
"/layouts/scripts"
resources.layout.layout = "layout" admin.resources.layout.layout = "admin" 第二種,不同模塊的布局腳本文件分別存放在各自的模塊文件夾下 在配置文件application.ini中添加如下幾行:
resources.layout.layoutPath
= APPLICATION_PATH
"/layouts/scripts"
resources.layout.layout = "layout" admin.resources.layout.layoutPath = APPLICATION_PATH "/modules/admin/layouts/scripts" 不論是第一種還是第二種,這時如果訪問http://localhost/admin,你會發現系統並沒有使用期望的admin.phtml作為布局文件,而是使用了默認的layout.phtml。這是因為admin那行配置並不是系統默認能處理的有效配置,所以我們要自己來處理它。 我們新建文件:library/Rockux/Controller/Action/Helper/LayoutLoader.php, 針對第一種情況代碼如下:
class Rockux_Controller_Action_Helper_LayoutLoader
extends Zend_Controller_Action_Helper_Abstract
{ public function preDispatch ( ) { $bootstrap = $this -> getActionController ( ) -> getInvokeArg ( 'bootstrap' ) ; $config = $bootstrap -> getOptions ( ) ; $module = $this -> getRequest ( ) -> getModuleName ( ) ; if ( isset ( $config [ $module ] [ 'resources' ] [ 'layout' ] [ 'layout' ] ) ) { $layoutScript = $config [ $module ] [ 'resources' ] [ 'layout' ] [ 'layout' ] ; $this -> getActionController ( ) -> getHelper ( 'layout' ) -> setLayout ( $layoutScript ) ; } } } 針對第二種情況代碼如下:
class Rockux_Controller_Action_Helper_LayoutLoader
extends Zend_Controller_Action_Helper_Abstract
{ public function preDispatch ( ) { $bootstrap = $this -> getActionController ( ) -> getInvokeArg ( 'bootstrap' ) ; $config = $bootstrap -> getOptions ( ) ; $module = $this -> getRequest ( ) -> getModuleName ( ) ; if ( isset ( $config [ $module ] [ 'resources' ] [ 'layout' ] [ 'layoutPath' ] ) ) { $layoutPath = $config [ $module ] [ 'resources' ] [ 'layout' ] [ 'layoutPath' ] ; $this -> getActionController ( ) -> getHelper ( 'layout' ) -> setLayoutPath ( $layoutPath ) ; } } } 接下來我們還需要將它添加到application/Bootstrap.php里去
protected
function _initLayoutHelper
(
)
{ $this -> bootstrap ( 'frontController' ) ; $layout = Zend_Controller_Action_HelperBroker :: addHelper ( new Rockux_Controller_Action_Helper_LayoutLoader ( ) ) ; } 再次訪問http://localhost/admin,應當就可以看到使用指定的布局文件了。
$layout
= Zend_Layout
::
getMvcInstance
(
)
;
$layout -> setLayout ( 'layout_special' ) ; |
