2

正如我在另一篇文章中所说,我正在尝试使开源 Intranet 适应我的需求。我正在尝试做的一件事是让 Intranet 在与默认文件夹不同的文件夹中查找视图模板($customViewPath并且$defaultViewPath,从现在开始)。

我对 Zend Framework 完全没有经验,而且我很难弄清楚一些事情,但是我认为我已经走到了死胡同。

我正在尝试通过$view->addScriptPath($customViewPath)在引导程序中使用为视图模板添加我的自定义路径。实际上,它可以工作,但前提是视图文件不存在于$defaultViewPath. 我想要的恰恰相反:如果自定义文件不存在$customViewPath,则从$defaultViewPath.

如果我打印getScriptPaths(),我会得到array($defaultViewPath, $customViewPath)。也就是说,在脚本生命周期的某个地方,$defaultViewPath被添加到视图路径列表中,其优先级高于我的自定义路径。我找不到发生这种情况的地方,并且不认为它存在于每个模块控制器中。

另外,我知道我必须将我的一段代码移动$view->addScriptPath($customViewPath)到引导程序之外的某个位置,因为自定义路径与模块相关,但我无法从引导程序访问模块名称,因为尚未启动请求。我想我可以改变它,但我想尽可能地保持原来的行为。

addScriptPath()我已经阅读了关于,的所有信息setScriptPath()getScriptPaths()我可以理解,但仍然不知道如何将其应用于我的案例。任何想法都会受到欢迎。

我知道我应该提供有关该应用程序的更多信息,但我缺乏经验使我不知道还有什么需要。请随时提出任何可以使我的问题更清楚的问题。

该应用程序的代码可以从其网站下载。我只是不在这里发布链接,以免它看起来像垃圾邮件。

编辑:

我很抱歉坚持这个话题,但我对 ZF 了解得越多,我对这个问题就越感到困惑。

我已经跟踪了视图路径堆栈,并且在我的插件 preDispatch() 和操作 preDispatch() 函数之间的某个位置,默认路径(我试图覆盖的路径)被推入堆栈。

我唯一能想到的是其他一些插件正在我之后执行。我试图给我的插件一个非常高的执行订单号,但仍然没有。

如果我说我在这个问题上花了至少两个星期,我并不夸张(虽然我不能在工作上花更多的时间,我在家里花了很多时间),我已经阅读了所有我能读到的东西把我的手放在调度周期上,但我不知道接下来要尝试什么。

以防万一我可能是对的,有没有办法从一个动作中列出正在执行的插件及其顺序?

4

1 回答 1

2

基本上你有反转路径堆栈的顺序。

尝试:

protected function _initView()
    {
        //Initialize view
        $view = new Zend_View();

        //reset script path stack with custom view path
        $view->setScriptPath($customViewPath);
        //add default path back to path stack
        $view->addScriptPath($defaultViewPath);

        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
                'ViewRenderer');
        $viewRenderer->setView($view);
        //Return it, so that it can be stored by the bootstrap
        return $view;
    }

这应该可以完成您正在寻找的东西。

于 2012-09-12T06:39:28.517 回答