2

我在我的布局中调用了一个视图助手,它在默认模块中运行良好,但是当我在另一个模块中时出现异常。

我已经通过设置更改了我的 app.ini 以在所有模块中使用默认布局:

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

在这里搜索和谷歌为我提供了另一个 app.ini 设置来为所有模块添加视图助手路径:

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

但是,该附加设置并没有解决问题,而是导致 Zend 异常成为 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 函数以编程方式添加此视图帮助程序路径?

4

1 回答 1

1

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

如果这个视图助手真的是一个单一的应用程序助手,那么我发现它自然地驻留在application文件夹中的某个位置。在那个可能性空间内,我会问 view-helper 是在单个模块中使用还是在多个模块中使用。

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

如果 view-helper 旨在跨多个modules 使用,modules我可能会将它Application_View_Helper_Myhelper拉到比存储在 . 在这种情况下,我们需要告诉视图该目录中有带前缀的助手。这可以在引导程序中完成:appnamespaceApplicationapplication/views/helpers/Myhelper.phpApplication_View_Helper_

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存储在文件中library/MyLibrary/View/Helper/Myhelper.php。和以前一样,您需要通知视图(可能在引导程序或前端控制器插件中)前缀/路径映射:

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

请注意,在上述所有情况下,view-helper 功能本身的调用 - 例如,在 view-script 内 - 是:

<?php echo $this->myhelper($params) ?>

请特别注意类名和调用之间的大小写差异。

于 2012-12-28T17:53:07.053 回答