使用来自admin模块的Zend视图助手和默认模块布局

时间:2012-12-28 16:29:22

标签: zend-framework layout module view-helpers

我在我的布局中调用了一个可以在默认模块中正常工作的视图助手,但是当我在另一个模块中时,我得到一个例外。

我已经更改了我的app.ini,通过设置:

在所有模块中使用默认布局
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

在这里搜索并且google为我提供了另一个app.ini设置,为所有模块添加了视图助手路径:

resources.view.helperPath.Zend_View_Helper = APPLICATION_PATH "/views/helpers"

但是,不是修复问题,而是另外的设置会导致Zend Exception成为WSOD。

如果没有第二个app.ini设置,我会看到布局并获得此异常:

Plugin by name 'AutoScript' was not found in the registry; used paths: Admin_View_Helper_: /Applications/XAMPP/xamppfiles/htdocs/dad/application/modules/admin/views/helpers/ Zend_View_Helper_: Zend/View/Helper/:./views/helpers/

使用helperPath.Zend_View_Helper ini设置我得到一个带有以下内容的WSOD:

Fatal error: Uncaught exception 'Zend_Loader_PluginLoader_Exception' with message 'Plugin by name 'AutoScript' was not found in the registry; used paths: Zend_View_Helper_: Zend/View/Helper/:./views/helpers/' 

看起来插件加载器正在查看public / views / helpers /中的AutoScript.php文件,即使它应该使用APPLICATION_PATH值作为前缀。

我的布局调用如下所示

<?php $this->AutoScript(); ?>

我的AutoScript.php文件的类在application / views / helpers /

中定义
class Zend_View_Helper_AutoScript extends Zend_View_Helper_Abstract {
  public function AutoScript() {...}
}

我目前的解决方法是将AutoScript.php文件从application / views / helpers复制到modules / admin / views / helpers中,修复问题,但复制文件。我错过了什么?我是否必须通过在引导程序中创建_initView函数以编程方式添加此视图辅助路径?

1 个答案:

答案 0 :(得分:1)

通常,您可以使用自己的前缀命名自定义视图助手,而不是Zend_前缀。除此之外,还有几种选择可以放置和命名视图助手。

如果这个view-helper实际上是一个单应用程序帮助器,那么我发现它可以驻留在application文件夹中的某个位置。在这个可能性空间内,我会问视图助手是否将用于单个模块或多个模块。

如果view-helper打算用于单个模块,那么我依赖于内置资源自动加载器映射并将我的视图助手类Mymodule_View_Helper_Myhelper放在档案application/modules/mymodule/views/helpers/Myhelper.php

如果view-helper打算在多个模块中使用,我可能会将其提升到比modules文件夹稍高的位置,比如说Application_View_Helper_Myhelper(假设{存储在appnamespace中的{1}} Application。在这种情况下,我们需要告诉视图在该目录中有前缀为application/views/helpers/Myhelper.php的帮助程序。这可以在bootstrap上完成:

Application_View_Helper_

有时候,你需要一个模块中的一个视图助手,它存在于另一个模块中,你不能 - 实际上 - 移动原始模块。在这种情况下,一种解决方法是在您的使用模块中定义视图助手的空shell,从而扩展您的不可移动的视图助手。在档案protected function _initViewHelperPaths() { $this->bootstrap('view'); $view = $this->getResource('view'); $view->addHelperPath(APPLICATION_PATH . '/views/helpers', 'Application_View_Helper_'); } 中:

application/mymodule/views/helpers/MyHelper.php

这样,帮助程序实现的代码不会重复。模块特定的资源自动加载器映射将允许在从视图脚本作为视图助手调用时找到所有这些类。

最后,如果要在多个项目中使用此视图助手,则会有一个参数将其置于应用程序范围之外,位于class Mymodule_View_Helper_Myhelper extends Othermodule_View_Helper_Myhelper { } 文件夹中。因此,类library可能存储在文件MyLibrary_View_Helper_Myhelper中。和以前一样,你需要通知视图 - 可能是在bootstrap或前端控制器插件中 - 前缀/路径映射:

library/MyLibrary/View/Helper/Myhelper.php

请注意,在上述所有情况下,视图助手功能本身的调用(例如,在视图脚本中)是:

$view->addHelperPath(APPLICATON_PATH . '/../library/MyLibrary/View/Helper', 'MyLibrary_View_Helper_');

请注意,特别是classname和调用之间的大小写区别。