视图帮助程序可以在一个控制器中访问,但不能从另一个控制器访问


View helper is accessible in one controller, but not accessible from another

我有一点奇怪的情况。我有视图,从这个视图我执行我的视图助手"conversingText"。此视图帮助程序(FR_view_helper_ConvertingText.php)位于文件夹FR/view/helper 中

没问题,助手工作。

我创建了404页。这不是一个简单的html页面。这个页面类似于主页面-我们从数据库中输出一些项目。我在新视图中复制了视图的一部分,在转换时遇到问题。没有加载文本视图帮助程序。

Fatal error: Uncaught exception 'Zend_Loader_PluginLoader_Exception' with message 'Plugin by name 'ConvertingText' in /var/www/framework/zend/library/Zend/Controller/Plugin/Broker.php on line 336
Zend_Loader_PluginLoader_Exception: Plugin by name 'ConvertingText' was not found in the registry; used paths:
Zend_View_Helper_: Zend/View/Helper/:../application/views/helpers/:/var/www/current/application/modules/default/views/helpers/ in /var/www/framework/zend/library/Zend/Loader/PluginLoader.php on line 422

在Bootstrap.php上,我们有添加文件夹以加载助手的行

$view->addHelperPath("FR/View/Helper", "FR_View_Helper");

我从方法加载类Zend_Loader_PluginLoader调试并输出路径在主页上,我有不同的路径(用于加载插件)和404页面上的路径。

在主页上我有这些路径

/var/www/current/modules/movies/views/helpers/ConvertingText.php
FR/View/Helper/ConvertingText.php

在404页我有这些路径

/var/www/current/application/modules/movies/views/helpers/ConvertingText.php
/var/www/current/application/modules/default/views/helpers/ConvertingText.php
../application/views/helpers/ConvertingText.php
Zend/View/Helper/ConvertingText.php

还有一个奇怪的问题,如果我加上行

$view->convertingText('', '');

线后

$view->addHelperPath("FR/View/Helper", "FR_View_Helper");

在Bootstrap.php中,view helper conversingText适用于404页面。

为什么会有这样的行为?

protected function _initView()
{
    $view = new Zend_View();
    $view->addHelperPath("ZendX/JQuery/View/Helper", "ZendX_JQuery_View_Helper");
    $view->addHelperPath("DR/View/Helper", "DR_View_Helper");
    $view->addHelperPath("FR/View/Helper", "FR_View_Helper");
    $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
    $viewRenderer->setViewScriptPathSpec(":controller/:action.:suffix");
    $viewRenderer->setView($view);
    Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
    Zend_View_Helper_PaginationControl::setDefaultViewPartial(array('pagination.phtml','default'));
    Zend_Registry::set('view', $view);
    return $view;
}

不同的路径可能取决于您所在的模块。您应该为视图助手路径使用绝对路径,这样您就不会有这个问题:

$view->addHelperPath(APPLICATION_PATH."/../FR/View/Helper", "FR_View_Helper");

(根据需要更新。)

ZF重用已经加载的助手类,所以$view->convertingText('', '');修复了它,因为在模块更改之前就加载了助手。

编辑:为您的init视图方法尝试此操作:

protected function _initView()
{
    $view = new Zend_View();
    $view->addHelperPath("ZendX/JQuery/View/Helper", "ZendX_JQuery_View_Helper");
    $view->addHelperPath(APPLICATION_PATH."/../DR/View/Helper", "DR_View_Helper");
    $view->addHelperPath(APPLICATION_PATH."/../FR/View/Helper", "FR_View_Helper");
    $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
    $viewRenderer->setViewScriptPathSpec(":controller/:action.:suffix");
    $stack = Zend_Controller_Action_HelperBroker::getStack();
    $stack->push($viewRenderer);
    Zend_View_Helper_PaginationControl::setDefaultViewPartial(array('pagination.phtml','default'));
    Zend_Registry::set('view', $view);
    return $view;
}

试试这个,我认为后面的斜杠(/)和下划线(_)可能会造成问题

protected function _initView()
{
    $view = new Zend_View();
    $view->addHelperPath("ZendX/JQuery/View/Helper", "ZendX_JQuery_View_Helper");
    $view->addHelperPath($path . "/DR/View/Helper/", "DR_View_Helper_");//Add $path
    $view->addHelperPath($path . "/FR/View/Helper/", "FR_View_Helper_");//Add $path
    $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
    $viewRenderer->setViewScriptPathSpec(":controller/:action.:suffix");
    $viewRenderer->setView($view);
    Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
    Zend_View_Helper_PaginationControl::setDefaultViewPartial(array('pagination.phtml','default'));
    Zend_Registry::set('view', $view);
    return $view;
}

我发现了问题,为什么视图助手不可用。

指向辅助对象的路径被覆盖。我在一个插件中找到了这个代码。

$this->view = Zend_Registry::get('view');
$this->view->setBasePath('../application/views/');

执行方法setBasePath覆盖了指向我的助手的路径。