zend framework多模塊多布局配置

來源: RockUX  發布時間: 2011-03-06 21:21  閱讀: 3227 次  推薦: 1   原文鏈接   [收藏]  
摘要:該文將為大家簡單介紹一下如何使用zend framework創建模塊化的應用程序。

  zend framework對多模塊的支持是很好的,但是可能是由于功能太過強大的緣故,部署起來并不是很容易。許多人在使用過程中都會遇到這樣那樣的問題,而且zend framework現在已經到1.11版本了,網絡上的很多資料都還停留在舊版本上,因此我在這里以當前的最新版本1.11為例,來簡單介紹一下如何使用zend framework創建模塊化的應用程序。

  1、準備工作

  首先假設你已經部署了web服務器和php,并下載了zend framework的最新版本,創建了一個最原始的zend framework項目,并可以訪問默認的action了。你可以使用zend framework工具來創建項目,具體操作參見使用zend framework創建項目。當然也可以自己手動建立文件夾和文件,參見zend framework推薦的項目目錄結構。

  簡單地看一下默認的幾個重要目錄。

  首先是public,它不但存放了程序的入口點index.php,還可以存放圖片,css,javascript文件等。

  其次是library,用于存放一些類庫,包括你自己定義的或第三方的類庫。

  然后是test,用于存放單元測試等測試文件的。

  最后,也是和我們這里要講的關系最大的目錄application。進到application目錄下,會有以下目錄:configs:存放配置文件,一般會有一個主配置文件application.ini;

  controllers:操制器,如默認的IndexController.php;

  models:存放業務邏輯,數據模型等文件;

  views:視圖層的腳本,一般以.phtml為后綴名;

  modules:模塊目錄,使用工具默認選項自動生成的是沒有這個目錄的,需要手動添加。modules底下可以包含多個以模塊名命名的文件夾,如admin,默認是default,一個文件夾代表一個模塊,其下的目錄結構與application目錄類似,又可以包含controllers,models,views等目錄。需要注意的是模塊下的controllers下面的文件的類名請加上模塊名前綴,如application/modules/admin/controllers/IndexController.php的類名為Admin_IndexController。

  如果你需要在項目中方便的使用你自己寫的一些類庫(如名稱空間是Rockux),或是第三方的類庫,可以修改application.ini文件,添加以下行:

 
autoloaderNamespaces.rockux = "Rockux_"autoloaderNamespaces.thirdParty = "ThirdPartyLibrary_"

  當然你也可以根據需要多添加幾個,不過請注意最后面的下劃線。

  2、建立模塊

  現在我們來創建一個admin模塊,目錄如下:

  application/modules/admin/controllers

  application/modules/admin/models

  application/modules/admin/views

  application/modules/admin/views/scripts

  application/modules/admin/views/helpers

  application/modules/admin/views/filters

  并創建以下文件:

  application/modules/admin/controllers/IndexController.php(類名為Admin_IndexController)    application/modules/admin/views/scripts/index/index.phtml

  除了新建模塊文件之外,還需要更改配置文件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/layout

  可以在application下新建如下目錄和文件:

  application/layouts/scripts/layout.phtml

  application/layouts/scripts/admin.phtml

  在配置文件application.ini中添加如下幾行:

 
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"resources.layout.layout = "layout"admin.resources.layout.layout = "admin"

  第二種,不同模塊的布局腳本文件分別存放在各自的模塊文件夾下

  可以在application下新建如下目錄和文件:

  application/layouts/scripts/layout.phtml

  application/modules/admin/layouts/scripts/layout.phtml

  在配置文件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,應當就可以看到使用指定的布局文件了。

  如果要針對某個特定的controller使用特定的layout,可以在controller的init()方法里添加如下代碼:

 
$layout = Zend_Layout::getMvcInstance();$layout->setLayout('layout_special');
1
0
 
 
 

文章列表

全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()