2009-10-23 109 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指向实际布局的文件夹