View helper 可以在一个控制器中访问,但不能从另一个控制器访问

Posted

技术标签:

【中文标题】View helper 可以在一个控制器中访问,但不能从另一个控制器访问【英文标题】:View helper is accessible in one controller, but not accessible from another 【发布时间】:2013-08-30 18:12:23 【问题描述】:

我的情况有点奇怪。 我有视图,从这个视图我执行我的视图助手“convertingText”。此视图助手 (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 - 查看助手转换文本在 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;

【问题讨论】:

【参考方案1】:

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

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

(根据需要更新。)

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

编辑:试试这个作为你的初始化视图方法:

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;

【讨论】:

仅当我将此代码添加到我的 ErrorController 时才有效。 (就像这样 $this->view->addHelperPath(APPLICATION_PATH . "/../FR/View/Helper", "FR_View_Helper"); 在 Bootstrap.php 中将相对路径替换为绝对路径给出相同的结果 - 主页有效,404页面 - 错误。谢谢 对不起,在我之前的评论中,我只发布了部分文字。 您能否编辑您的问题以包含您要添加视图路径的引导类中的完整方法? 添加方法_initView 更新 _initView 方法的情况相同 - 主页有效,404 - 未加载转换文本。 :(【参考方案2】:

试试这个我认为尾部斜杠(/)和下划线(_)可能会造成问题

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;

【讨论】:

你用你的 $path 替换了 $path 吗? @yAnTar is DR/View/Helper is inside libraries directory ? 当然我替换了路径,如果我设置了不正确的路径 - 我在两个页面上都会出错,如果正确 - 主页有效,404 页面无效。【参考方案3】:

我发现了问题,为什么视图助手无法访问。

帮助器的路径被覆盖。我在一个插件中找到了这段代码。

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

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

【讨论】:

以上是关于View helper 可以在一个控制器中访问,但不能从另一个控制器访问的主要内容,如果未能解决你的问题,请参考以下文章

如何测试作为 helper_method 公开的 Rails 控制器方法?

从子 ui-view 组件访问父控制器

Zend 框架:View Partials 和 Helpers 之间的区别

注册View-Helper理解问题

从 Rails 3 控制器调用辅助方法

CodeIgniter Helper Functions 可以使用数据库函数吗?