我读过很多关于如何注册自定义视图助手的帖子。这不是我的问题。我的库中有自定义视图助手;但是,它们似乎只能从“默认”模块(即模块外部)访问。当试图从模块中调用帮助程序时,我收到以下错误:
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
{
}
关于如何使这个工作视图助手对我的模块可见的任何建议?
答案 0 :(得分:2)
这是一个很长的镜头,但你可以尝试注释掉你目前拥有的三个视图渲染器行,并将以下内容添加到_initViewHelpers()
函数的末尾:
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
$viewRenderer->setViewSuffix('php');
$stack = Zend_Controller_Action_HelperBroker::getStack();
$stack->push($viewRenderer);
这应该确保您配置的$view
对象是视图渲染器使用的对象。您的帮助程序路径不在您获得的错误中,这表明它来自不同的视图对象。
我没有解释为什么它在默认模块中有效但在管理员模块中无效。如果它在布局中起作用,而不是从可能更有意义的视图脚本起作用。
答案 1 :(得分:1)
看起来你正在使用相对文件路径来查看助手 - 这可以解释为什么当你在默认模块中而不在其他模块中时它会起作用,因为在其他模块中你改变视图助手的相对路径是与模块中的不同。尝试类似$view->addHelperPath("/ABSOLUTE/PATH/TO/library/Sc/View/Helper", "Sc_View_Helper");