Zend_Layout用于模块

时间:2011-03-28 17:56:56

标签: zend-framework

如何让每个模块都拥有自己的布局目录?

即。当我没有任何模块时,配置文件中的布局条目如下所示:

resources.layout.layoutPath = APPLICATION_PATH "/layouts"

我尝试输入即。

; Layout directory for admin module
admin.resources.layout.layoutPath = APPLICATION_PATH "/modules/admin/layouts"

其中admin是模块名称;但它不起作用。出于某种奇怪的原因,ZF在/ module / admin / views / scripts目录中查找模块布局。

根据this tutorial,每个模块都有一个单独的module.ini配置文件,唉布局路径也会被忽略。此外,我一直在尝试遵循这些模块layout tutorial,但它不起作用,我想由于ZF版本的差异(教程相当陈旧)。所以我不知道还能做什么

5 个答案:

答案 0 :(得分:2)

使用教程中的插件,您将被讨论:

class My_Controller_Plugin_RequestedModuleLayoutLoader extends Zend_Controller_Plugin_Abstract {
    public function preDispatch(Zend_Controller_Request_Abstract $request) {
        $config     = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getOptions();
        $moduleName = $request->getModuleName();

        if (isset($config[$moduleName]['resources']['layout'])) {
            Zend_Layout::startMvc($config[$moduleName]['resources']['layout']);
        }
    }
}

的application.ini

resources.frontController.plugins.layoutloader = My_Controller_Plugin_RequestedModuleLayoutLoader 

module.ini中:

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

工作正常。

答案 1 :(得分:2)

Ololo推荐的一种稍微替代方法(这是一种很好的方法)..

class YourApp_Controller_Plugin_Modulelayout extends Zend_Controller_Plugin_Abstract
{
     public function routeShutdown(Zend_Controller_Request_Abstract $request)
     {
          $module = $request->getModuleName();
          if ($module != 'default')
          {
              if (file_exists(APPLICATION_PATH . '/layouts/' . $module . '.html')) {
                  Zend_Layout::getMvcInstance()->setLayout($module);
              }
          }
     }
}

将此控制器插件放在/library/YourApp/Controller/Plugin/Modulelayout.php中 然后将模块布局作为模块名称保存在layouts文件夹中(例如,/layout / admin.phtml)。如果找不到该模块的布局,它将默认返回layout.phtml或您最初设置的任何布局。

答案 2 :(得分:2)

看看这个要点 - https://gist.github.com/891384

这使用了

的组合
  • 操作助手检查所请求的模块并给出匹配的配置,更改layout挂钩中的布局layoutPathpreDispatch属性
  • 应用程序资源插件捕获模块布局选项,将它们注入上面的帮助程序并将其添加到帮助程序代理

答案 3 :(得分:1)

也发生在我身上我通过在我的控制器中使用这一行来解决它(我创建了一个init函数)

Zend_Layout::startMvc(array('layoutPath' => APPLICATION_PATH . '/modules/admin/layouts')); 

答案 4 :(得分:0)

从Zend Framework 1.12开始(尚未在以前的版本中测试过):

  1. 创建模块
  2. 以您喜欢的方式初始化布局。例如在application.ini中作为zend工具执行:

    resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
    
  3. 在每个模块中创建一个布局,在模块路径中使用默认布局名称“views / scripts /”,例如“application / modules / default / views / scripts / layout.phtml”

    < / LI>

    不要忘记为默认模块创建一个,因为它将是您的后备布局!

    请勿在/ application / layouts / scripts中创建默认布局,否则无效

    你准备好了!

    当Zend_Layout找不到默认的layut时,它会查看模块文件夹。

    如果您需要一些额外的调整,您可以创建一个插件并将其分配给布局对象本身。例如,在application.ini中:

    resources.layout.pluginClass = "MyLibrary_Controller_Plugin_Layout"
    

    ......或者在Bootstrap中:

    Zend_Layout::getMvcInstance()->setPluginClass("MyLibrary_Controller_Plugin_Layout");
    

    干杯!