【问题标题】:Module configuration and layout configuration in zend frameworkzend框架中的模块配置和布局配置
【发布时间】:2013-07-12 04:21:35
【问题描述】:

我从其他文章中获得了一些代码,用于在 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);
        }
    }
}

application/modules/admin/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();
   }
}

请仔细阅读,让我知道如何正确配置模块和布局..

感谢和问候,

普拉桑斯 P

【问题讨论】:

  • 我不明白.. 为什么你们拒绝投票给这篇文章?这篇文章几乎被谷歌搜索以及大多数人评论!..
  • 如果答案有误,请仅对答案投反对票,不要投给帖子。谢谢..

标签: zend-framework


【解决方案1】:

我在我编写的这段代码中使用插件方法:

在主引导程序中:

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");
        }
}

希望对你有帮助。

【讨论】:

  • 在包含此文件之前,您还需要在引导程序中调用 Zend_Layout::startMvc()
  • 请注意您可以使用Zend_Controller_Front::getInstance()-&gt;getModuleDirectory()获取模块目录的路径
  • 当我尝试这段代码时,我得到了 Zend_View 异常,“找不到 default.html”。我的文件名为 layout.phtml。当我将其更改为 default.phtml 时,它起作用了。此外,模块特定的布局需要存储在与模块同名的 /application/layouts/scripts 下。希望它可以帮助那些仍然想知道它是如何工作的人。谢谢。
【解决方案2】:

来自您的代码:

# 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/modules/admin/layouts/admin.phtml 作为管理模块布局,我猜它取代了 your_app/layouts/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

【讨论】:

    【解决方案3】:

    在我的应用程序中,我以这种方式进行了配置。效果很好。

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

    【讨论】:

      【解决方案4】:

      您需要使用控制器插件来实现,因为布局是根据请求条目设置的,并且在引导时应用程序尚未分派,因此您需要使用控制器插件来处理 preDispatch切换布局。

      【讨论】:

        【解决方案5】:

        我认为最简单的方法是检查 URI_String。请看下面:

        我有一个名为“admin”的模块。 在布局文件夹下,我有 2 个目录。 “网站”和“管理员”

        \application\layout\site\layout.phtml 和 \application\layout\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);
        }
        

        【讨论】:

        • 如果你想添加一些用户友好的重写,这将是一个坏主意,例如www.mysite.com/user-admin.html
        【解决方案6】:

        你的问题回答了我的问题,没错,我试图找出为什么它在我的引导模块中不起作用,在它的配置文件中看到你需要添加行

        administrador.resources.view [] =

        好伙伴!

        【讨论】:

          【解决方案7】:
          <?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);
          }
          
          }
          

          【讨论】:

          • 你能解释一下吗?
          【解决方案8】:

          新的 zend 项目(在 ZF 版本 1)上未启用布局和模块。它需要被启用并且你需要让它工作。

          布局适用于工作 zend 项目的公共页眉和页脚,另一方面,模块可用于不同类型的访问,即用户模块、管理员模块、访问者模块等。

          为了快速参考,您可以在我的网站上找到包含完整项目的完整说明,以便从这里获得基本概念。 . http://www.getallthing.com/how-to-use-layout-and-module-in-zend-framework/

          祝你好运和欢呼!

          【讨论】:

            【解决方案9】:
            $options = array(
                     'layout'     => 'layout',
                     'layoutPath' => APPLICATION_PATH."/modules/".$layout_dir."/views/layouts"
              );
            Zend_Layout::startMvc($options);
            

            尝试了 SOF 的其他一些解决方案,这个解决方案效果很好。只需要将 layoutPath 指向实际布局的文件夹

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-03-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-05-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多