Zend视图帮助程序在模块中不可用


Zend view helper not available in module

我读过很多关于如何注册自定义视图助手的文章。这不是我的问题。我有自定义视图助手在我的库中工作;然而,它们似乎只能从"默认"模块(即模块外)访问。当试图从模块内调用助手时,我得到以下错误:

Message: Plugin by name 'IsCurrent' was not found in the registry; used paths: Zend_View_Helper_: Zend/View/Helper/:/Users/firemanrob/Development/Projects/mysite.com/www/application/modules/admin/views/helpers/

如上所述,当我从模块外部进行此调用时,它工作得很好。。。

if ($this->isCurrent(...

但是,在视图脚本中,在模块中的同一行会产生错误。

我的助手类在一个名为的文件中

library/Sc/View/Helper/IsCurrent.php

类的定义和函数的声明如下:

class Sc_View_Helper_IsCurrent extends Zend_View_Helper_Abstract {
public function isCurrent($startTime, $endTime) {

我的Bootstrap.php文件(以及其他文件)包含以下内容:

function _initViewHelpers() {
    $this->bootstrap('layout');
    $layout = $this->getResource('layout');
    $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
    $viewRenderer->setViewSuffix('php');
    unset($viewRenderer);
    /* @var $view Zend_View */
    $view = $layout->getView();
    $options = Zend_Registry::get('options');
    if (Zend_Registry::isRegistered('db')) {
        $this->_db = Zend_Registry::get('db');
    } else {
        $db = $this->getPluginResource('db');
        $this->_db = Zend_Db::factory($db->getAdapter(), $db->getParams());
        Zend_Registry::set('db', $this->_db);
    }
    $view->doctype('HTML5');
    $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
    $view->headTitle($options->template->websiteBaseTitle);
    $view->headTitle()->setSeparator(' | ');
    $view->addHelperPath("Sc/View/Helper", "Sc_View_Helper");
}

我的application.ini文件中唯一包含的与模块或视图助手有关的内容是:

includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0
; setup modules
resources.modules[] =
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
;content settings
content.path = "../application/content"
;layout settings
resources.layout.layoutpath = APPLICATION_PATH "/layouts"
resources.layout.viewSuffix = php
resources.layout.layout = "default"
autoloadernamespaces[] = Amg
autoloadernamespaces[] = Sc
autoloadernamespaces[] = Phpmailer

当我在另一篇文章中读到类似的内容时,我试着对resources.modules[]行进行了注释。这简直破坏了一切。

我试图从中调用的特定模块被称为"admin",在该模块的文件夹中是另一个Bootstrap.php文件,它只包含:

<?php
class Admin_Bootstrap extends Zend_Application_Module_Bootstrap
{
}

关于如何让这个工作视图助手对我的模块也可见,有什么建议吗?

这是一个有点长的机会,但你可以试着注释掉你目前拥有的三个视图渲染器行,并在_initViewHelpers()函数的末尾添加以下内容吗:

$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
$viewRenderer->setViewSuffix('php');
$stack = Zend_Controller_Action_HelperBroker::getStack();
$stack->push($viewRenderer);

这应该确保您正在配置的$view对象是视图渲染器使用的对象。您的助手路径不在您得到的错误中,这表明它来自不同的视图对象。

我没有解释为什么它在默认模块中有效,而在管理模块中无效。如果它在布局中工作,但不是在视图脚本中工作,那可能会更有意义。

看起来你正在为你的视图助手使用一个相对文件路径-这可以解释为什么当你在默认模块中时它有效,而在其他模块中却无效,因为在其他模块里,你更改视图助手的相对路径与在模块中时不同。尝试类似$view->addHelperPath("/ABSOLUTE/PATH/TO/library/Sc/View/Helper", "Sc_View_Helper"); 的东西