2

別の投稿で述べたように、私はオープンソースのイントラネットを自分のニーズに適合させようとしています。私がやろうとしていることの1つは、イントラネットがデフォルトとは異なるフォルダー($customViewPathおよび$defaultViewPath、今後)でビューテンプレートを検索するようにすることです。

私はZendFrameworkにまったく慣れておらず、いくつかのことを理解するのに苦労していますが、これで行き詰まったと思います。

私が試しているのは$view->addScriptPath($customViewPath)、ブートストラップで使用して、ビューテンプレートのカスタムパスを追加することです。実際には機能しますが、ビューファイルがに存在しない場合に限ります$defaultViewPath。私が欲しいのは正反対です。カスタムファイルがに存在しない場合は$customViewPath、からデフォルトのビューをロードします$defaultViewPath

印刷getScriptPaths()するとarray($defaultViewPath, $customViewPath)。つまり、スクリプトのライフサイクルのどこかで$defaultViewPath、カスタムパスよりも優先度の高いビューパスのリストに追加されます。これがどこで発生するかわかりません。また、すべてのモジュールコントローラーにあるとは思いません。

また、カスタムパスはモジュールに関連しているため、コードを$view->addScriptPath($customViewPath)ブートストラップの外に移動する必要があることはわかっていますが、リクエストがまだ開始されていないため、ブートストラップからモジュール名にアクセスできません。私はそれを変えることができると思いますが、私は可能な限り元の振る舞いを維持したいと思います。

addScriptPath()私は、についてのあらゆる情報を読みましたがsetScriptPath()getScriptPaths()理解できましたが、それを私のケースに適用する方法がまだわかりません。どんなアイデアでも大歓迎です。

アプリケーションについてもっと情報を提供する必要があることは承知していますが、経験が不足しているため、他に何が必要かわかりません。私の問題をより明確にすることができるものがあれば、遠慮なく質問してください。

アプリケーションのコードは、そのWebからダウンロードできます。スパムのように見えないように、ここにリンクを投稿しません。

編集:

このトピックについて主張して申し訳ありませんが、ZFについて学べば学ぶほど、この問題に戸惑うようになります。

ビューパスのスタックをトレースしました。プラグインのpreDispatch()関数とアクションのpreDispatch()関数の間のどこかで、デフォルトのパス(オーバーライドしようとしているパス)がスタックにプッシュされます。

私が考えることができる唯一のことは、他のプラグインが私の後に実行されているということです。プラグインに非常に高い実行順序番号を付けようとしましたが、それでも何もありません。

私はこの問題に少なくとも2週間費やしたと言っても過言ではありません(仕事でこれ以上時間を費やす余裕はありません、私は家でたくさん過ごしています)、私はできる限りすべてを読みましたディスパッチサイクルについては手に入れましたが、次に何を試すべきかわかりません。

私が正しいかもしれない場合に備えて、実行されているプラ​​グインとその順序をアクションからリストする方法はありますか?

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 に答える