添加不同的布局

时间:2010-11-23 10:05:28

标签: zend-framework

如何在配置文件中为前端添加新布局,并为管理部分保留一个

4 个答案:

答案 0 :(得分:0)

默认情况下,这是不可能的,因为在路由请求之前(显然)执行了引导程序。如果调用前端或后端,则引导程序无法知道。您可以创建 FrontControlle -Plugin,它读取(自定义)配置设置和路由请求,然后设置正确的布局。

答案 1 :(得分:0)

我有完全相同的问题,并通过子类化bootstrap解决了它。所以我有三个引导程序文件

  1. 用户空间一
  2. 管理员一
  3. 普通人
  4. 类似于bootstrap文件的东西(它们都可以放在默认的Zend位置)

    class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
    {
    
        protected function _initXXX() {
            /* COMMON FOR ALL */
        }
    
        /* ... etc ... */
    }
    
    
    class BootstrapAdmin extends Bootstrap
    {
        protected function _initAdmin1() {
            /* specific for admin */
        }
        /* ... etc ... */
    }
    
    class BootstrapUser extends Bootstrap
    {
        protected function _initUser1() {
            /* specific for admin */
        }
        /* ... etc ... */
    }
    

    其中(1)和(2)延伸(3)。如果你愿意,我会重新创建代码。

    之后在index.php中:

    if ($adminMode) {
    $application->setBootstrap(APPLICATION_PATH . '/Name_of_Bootstrap_file.php', 'BootstrapAdmin');
    } else {
    $application->setBootstrap(APPLICATION_PATH . '/Name_of_Bootstrap_file.php', 'BootstrapUser');
    }
    

    我第一次这样做时,我将所有类放在同一个文件Name_of_Bootstrap_file.php中,为了将它们一起更改,下次虽然可以采用不同的方式...

    希望我帮助过。

答案 2 :(得分:0)

取决于加载了哪些模块的布局

在我的configs / application.ini

resources.layout.layout = "default"
resources.layout.pluginClass = "Core_Controller_Plugin_ModuleBasedLayout"

然后是我的插件

<?php
class Core_Controller_Plugin_ModuleBasedLayout 
    extends Zend_Layout_Controller_Plugin_Layout
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $this->getLayout()->setLayoutPath( 
            Zend_Registry::get('config')->resources->frontController->moduleDirectory
            . DIRECTORY_SEPARATOR . $request->getModuleName() . DIRECTORY_SEPARATOR . 'views' . DIRECTORY_SEPARATOR . 'layouts' );
    }
} 

和我的bootstrap.php

    protected function _initConfig() {
    Zend_Registry::set ( 'config', new Zend_Config ( $this->getOptions () ) );
}

我的布局存储在views / layouts / default.php

答案 3 :(得分:0)

以为我会使用我的解决方案。这假定“admin”部分是一个模块。

我开发了一个动作助手,而不是根据模块名称和配置切换布局 - ModuleLayoutLoader

您可以使用关联的ModuleLayout应用程序资源插件从配置文件中配置它。例如

resources.moduleLayout.admin.layout = "admin"
resources.moduleLayout.anotherModule.layout = "foo"

如果要将布局脚本分开,还可以使用类似的设置模块布局的layoutPath属性

resources.moduleLayout.admin.layoutPath = APPLICATION_PATH "/path/to/admin/layout"