2009-10-23 120 views
14

我從其他文章中獲得了一些用於在zend框架中配置模塊和佈局的代碼。我在當地嘗試過。我沒有得到不同的默認和管理模塊的佈局。這裏是我爲zend框架配置模塊和佈局的代碼。zend框架中的模塊配置和佈局配置

CONFIGS /的application.ini

[production] 

# Debug output 
phpSettings.display_startup_errors = 0 
phpSettings.display_errors = 0 

# Include path 
includePaths.library = APPLICATION_PATH "/../library" 

# Bootstrap 
bootstrap.path = APPLICATION_PATH "/Bootstrap.php" 
bootstrap.class = "Bootstrap" 

admin.bootstrap.path = APPLICATION_PATH "/modules/admin/Bootstrap.php" 
admin.bootstrap.class = "admin_Bootstrap" 

# Front Controller 
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" 
resources.frontController.env = APPLICATION_ENV 

# Session 
resources.session.name = "ZendSession" 
resources.session.save_path = APPLICATION_PATH "/../data/session" 
resources.session.remember_me_seconds = 86400 

# Layout 
resources.layout.layout = "layout" 
resources.layout.layoutPath = APPLICATION_PATH "/layouts" 
admin.resources.layout.layout = "admin" 
admin.resources.layout.layoutPath = APPLICATION_PATH "/modules/admin/layouts" 

# Views 
resources.view.encoding = "UTF-8" 
resources.view.basePath = APPLICATION_PATH "/views/" 
resources.view[] = 

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" 
resources.modules[] = 
resources.view[] = 
admin.resources.view[] = 

[staging : production] 

[testing : production] 
phpSettings.display_startup_errors = 1 
phpSettings.display_errors = 1 

[development : production] 
phpSettings.display_startup_errors = 1 
phpSettings.display_errors = 1 

應用/ bootstrap.php中

<?php 

/** 
* Ensure all communications are managed by sessions. 
*/ 
require_once ('Zend/Session.php'); 
Zend_Session::start(); 

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { 

    protected function _initDoctype() { 
     $this->bootstrap('view'); 
     $view = $this->getResource('view'); 
     $view->navigation = array(); 
     $view->subnavigation = array(); 
     $view->headTitle('Module One'); 
     $view->headLink()->appendStylesheet('/css/clear.css'); 
     $view->headLink()->appendStylesheet('/css/main.css'); 
     $view->headScript()->appendFile('/js/jquery.js'); 
     $view->doctype('XHTML1_STRICT'); 
     //$view->navigation = $this->buildMenu(); 
    } 

    /*protected function _initAppAutoLoad() 
    { 
    $autoloader = new Zend_Application_Module_Autoloader(array(
     'namespace' => 'default', 
     'basePath' => APPLICATION_PATH 
     )); 
    return $autoloader; 
    }*/ 

    protected function _initLayoutHelper() 
    { 
     $this->bootstrap('frontController'); 
     $layout = Zend_Controller_Action_HelperBroker::addHelper(
      new ModuleLayoutLoader()); 
    } 


    public function _initControllers() 
    { 
     $front = Zend_Controller_Front::getInstance(); 
     $front->addModuleDirectory(APPLICATION_PATH . '/modules/admin/', 'admin'); 
    } 

    protected function _initAutoLoadModuleAdmin() { 
     $autoloader = new Zend_Application_module_Autoloader(array(
      'namespace' => 'Admin', 
      'basePath' => APPLICATION_PATH . '/modules/admin' 
     )); 

     return $autoloader; 
    } 

    protected function _initModuleutoload() { 
     $autoloader = new Zend_Application_Module_Autoloader (array ('namespace' => '', 'basePath' => APPLICATION_PATH)); 
     return $autoloader; 
    } 

} 

class ModuleLayoutLoader extends Zend_Controller_Action_Helper_Abstract 
// looks up layout by module in application.ini 
{ 
    public function preDispatch() 
    { 
     $bootstrap = $this->getActionController() 
          ->getInvokeArg('bootstrap'); 
     $config = $bootstrap->getOptions(); 
     echo $module = $this->getRequest()->getModuleName(); 
     /*echo "Configs : <pre>"; 
     print_r($config[$module]);*/ 
     if (isset($config[$module]['resources']['layout']['layout'])) { 
      $layoutScript = $config[$module]['resources']['layout']['layout']; 
      $this->getActionController() 
      ->getHelper('layout') 
      ->setLayout($layoutScript); 
     } 
    } 
} 

應用/模塊/管理/ bootstrap.php中

<?php 
class Admin_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 
/*protected function _initAppAutoload() 
{ 
    $autoloader = new Zend_Application_Module_Autoloader(array(
     'namespace' => 'admin', 
     'basePath' => APPLICATION_PATH . '/modules/admin/' 
    )); 
    return $autoloader; 
}*/ 
    protected function _initDoctype() { 
     $this->bootstrap('view'); 
     $view = $this->getResource('view'); 
     $view->navigation = array(); 
     $view->subnavigation = array(); 
     $view->headTitle('Module One'); 
     $view->headLink()->appendStylesheet('/css/clear.css'); 
     $view->headLink()->appendStylesheet('/css/main.css'); 
     $view->headScript()->appendFile('/js/jquery.js'); 
     $view->doctype('XHTML1_STRICT'); 
     //$view->navigation = $this->buildMenu(); 
    } 
} 

請通過它,讓我知道任何知道如何做配置正確的方式模塊與佈局..

感謝和問候,

Prasanth P

+0

我不明白爲什麼你們投票到這個帖子?這篇文章幾乎在谷歌搜索以及大多數人的審查!! – 2013-04-23 05:55:01

+0

如果答案是錯誤的請投票回答只有而不是爲了這個職位。謝謝.. – 2013-04-23 06:01:48

回答

2

您需要使用一個控制器插件來實現這一點,因爲佈局是基於請求條目設置的,並且在引導程序上尚未分派應用程序,所以您需要使用控制器插件來處理preDispatch以切換佈局。

8

從代碼:

# Layout 
resources.layout.layout = "layout" 
resources.layout.layoutPath = APPLICATION_PATH "/layouts" 
admin.resources.layout.layout = "admin" 
admin.resources.layout.layoutPath = APPLICATION_PATH "/modules/admin/layouts" 

您使用your_app /模塊/管理/佈局/ admin.phtml作爲管理模塊的佈局,我想它取代your_app /佈局/ layout.phtml。檢查一下在模塊之間切換的方法,並嘗試使用site.ressources.layout而不是resources.layout.layout。我是zend的新手。看看如何設置你引導在http://www.survivethedeepend.com/

同樣的問題和解決方案已在此間強調:http://blog.astrumfutura.com/archives/415-Self-Contained-Reusable-Zend-Framework-Modules-With-Standardised-Configurators.html

24

我使用插件的方法與此代碼我寫:

在主引導:

protected function _initPlugins() 
{ 
     // Access plugin 
     $front = Zend_Controller_Front::getInstance(); 
     $front->registerPlugin(new MyApp_Plugin_Module()); 
} 

在插件目錄:

class MyApp_Plugin_Module extends Zend_Controller_Plugin_Abstract 
{ 

    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 

     $module = $request->getModuleName(); 
     $layout = Zend_Layout::getMvcInstance(); 

     // check module and automatically set layout 
     $layoutsDir = $layout->getLayoutPath(); 
     // check if module layout exists else use default 
     if(file_exists($layoutsDir . DIRECTORY_SEPARATOR . $module . ".phtml")) { 
      $layout->setLayout($module); 
     } else { 
      $layout->setLayout("default"); 
     } 
} 

希望它有幫助。

+0

我在哪裏放這個文件? – 2010-11-12 19:33:49

+0

在包含此文件之前,您還需要在引導程序中調用'Zend_Layout :: startMvc()' – HorusKol 2011-05-19 00:33:38

+0

請注意,您可以使用'Zend_Controller_Front :: getInstance() - > getModuleDirectory()' – Kirzilla 2012-09-11 15:13:17

2

我覺得最簡單的方法是檢查URI_String。請看下面:

我有一個名爲「admin」的模塊。 在佈局文件夾下我有2個目錄。 「網站」 和 「admin」

\程序\設計\網站\ layout.phtml和\程序\設計\ ADMIN \ layout.phtml

添加的代碼塊上的bootstrap.php 它只是更改佈局目錄路徑。

protected function _initLayout(){ 
    $layout = explode('/', $_SERVER['REQUEST_URI']); 

    if(in_array('admin', $layout)){ 
     $layout_dir = 'admin'; 
    }else{ 
     $layout_dir = 'site'; 
    } 

     $options = array(
      'layout'  => 'layout', 
      'layoutPath' => APPLICATION_PATH . "/layouts/scripts/".$layout_dir, 
    ); 

    Zend_Layout::startMvc($options); 
} 
+0

這對我無效 – 2010-11-12 19:33:24

+1

如果您想添加一些用戶友好的重寫,例如www.mysite.com/user-admin.html – 2011-06-12 07:48:56

0
<?php 

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 

    public function _initAutoload() { 
      $autoloader = Zend_Loader_Autoloader::getInstance(); 
      $moduleLoader = new Zend_Application_Module_Autoloader(
        array(
          'namespace' => '', 
          'basePath' => APPLICATION_PATH . '/modules' 

        ) 
      ); 

      return $moduleLoader; 
    } 


protected function _initViewhelpers() 
{ 
    $this->bootstrap('layout'); 
    $layout = $this->getResource('layout'); 
    $view = $layout->getView(); 
    $view->doctype('XHTML1_STRICT'); 
    $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8'); 
} 


protected function _initNavigation() 
{ 
    $this->bootstrap('layout'); 
    $layout = $this->getResource('layout'); 
    $view = $layout->getView(); 
    $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml','nav'); 

    $navigation = new Zend_Navigation($config); 
    $view->navigation($navigation); 
} 

} 
+0

你能否提供一些解釋? – cereallarceny 2012-10-22 02:45:32

1

您的問題回答了我的問題,這是正確的,我試圖找出爲什麼沒有在我的引導模塊,其配置文件中看到,您需要添加行工作

administrador.resources.view [] =

Valew partner!

6

在我的應用程序中,我配置了這種方式。它工作完美。

protected function _initLayout(){ 
    $layout = explode('/', $_SERVER['REQUEST_URI']); 

    if(in_array('admin', $layout)){ 
     $layout_dir = 'admin'; 
    }else if(in_array('default', $layout)){ 
     $layout_dir = 'default'; 
    }else{ 
     $layout_dir = 'default'; 
    } 
     $options = array(
      'layout'  => 'layout', 
      'layoutPath' => APPLICATION_PATH."/modules/".$layout_dir."/views/layouts" 
    ); 
    Zend_Layout::startMvc($options); 
} 
0

佈局和模塊的話(ZF版本1)在新的Zend項目啓用。它需要啓用,你需要使它工作。

佈局適用於工作zend項目的公共頁眉和頁腳,另一方面,模塊可以用於不同類型的訪問,即用戶模塊,管理員模塊,訪問者模塊等等。

爲了快速參考,您可以在我的網站上找到完整的項目的完整解釋,從這裏獲得基本想法。 。 http://www.getallthing.com/how-to-use-layout-and-module-in-zend-framework/

祝你好運,歡呼!

0
$options = array(
     'layout'  => 'layout', 
     'layoutPath' => APPLICATION_PATH."/modules/".$layout_dir."/views/layouts" 
); 
Zend_Layout::startMvc($options); 

嘗試了SOF的一些其他解決方案,這個工作很好。只需要將layoutPath指向實際佈局的文件夾