2

デフォルトのモジュールでは正常に動作するビュー ヘルパーがレイアウトで呼び出されていますが、別のモジュールでは例外が発生します。

次のように設定して、すべてのモジュールでデフォルトのレイアウトを使用するように app.ini を変更しました。

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

ここで検索すると、Google は別の app.ini 設定を提供して、すべてのモジュールのビュー ヘルパー パスを追加しました。

resources.view.helperPath.Zend_View_Helper = APPLICATION_PATH "/views/helpers"

ただし、問題を修正する代わりに、その追加設定により Zend Exception が WSOD になります。

その 2 番目の app.ini 設定がないと、レイアウトが表示され、次の例外が発生します。

Plugin by name 'AutoScript' was not found in the registry; used paths: Admin_View_Helper_: /Applications/XAMPP/xamppfiles/htdocs/dad/application/modules/admin/views/helpers/ Zend_View_Helper_: Zend/View/Helper/:./views/helpers/

helperPath.Zend_View_Helper の ini 設定を使用すると、次のような WSOD が得られます。

Fatal error: Uncaught exception 'Zend_Loader_PluginLoader_Exception' with message 'Plugin by name 'AutoScript' was not found in the registry; used paths: Zend_View_Helper_: Zend/View/Helper/:./views/helpers/' 

APPLICATION_PATH 値をプレフィックスとして使用する必要があるにもかかわらず、プラグイン ローダーが AutoScript.php ファイルの public/views/helpers/ を探しているようです。

私のレイアウト呼び出しは次のようになります

<?php $this->AutoScript(); ?>

AutoScript.php ファイルのクラスは application/views/helpers/ で定義されています

class Zend_View_Helper_AutoScript extends Zend_View_Helper_Abstract {
  public function AutoScript() {...}
}

私の現在の修正は、AutoScript.php ファイルを application/views/helpers から modules/admin/views/helpers にコピーすることです。これにより、問題は修正されますが、ファイルが複製されます。私は何が欠けていますか?ブートストラップで _initView 関数を作成して、このビュー ヘルパー パスをプログラムで追加する必要がありますか?

4

1 に答える 1

1

通常、カスタム ビュー ヘルパーには、プレフィックスではなく、独自のプレフィックスを付けて名前を付けますZend_。さらに、ビュー ヘルパーをどこに配置して名前を付けるかについて、いくつかの選択肢があります。

このビュー ヘルパーが本当に単一アプリケーション ヘルパーである場合、applicationフォルダー内のどこかに常駐するのが自然だと思います。その可能性の範囲内で、view-helper が単一のモジュールで使用されるのか、それとも複数のモジュールで使用されるのかを尋ねます。

ビュー ヘルパーが単一のモジュールで使用することを意図している場合は、組み込みのリソース オートローダー マッピングに依存し、ビュー ヘルパー クラスMymodule_View_Helper_Myhelperをファイルに配置しますapplication/modules/mymodule/views/helpers/Myhelper.php

ビューヘルパーが複数のモジュールで使用することを意図している場合、modulesフォルダーよりも少し上にプルアップする可能性があります 。この場合、そのディレクトリにプレフィックスを持つヘルパーがあることをビューに伝える必要があります。これはブートストラップで行うことができます:Application_View_Helper_MyhelperappnamespaceApplicationapplication/views/helpers/Myhelper.phpApplication_View_Helper_

protected function _initViewHelperPaths()
{
    $this->bootstrap('view');
    $view = $this->getResource('view');
    $view->addHelperPath(APPLICATION_PATH . '/views/helpers', 'Application_View_Helper_');
}

場合によっては、あるモジュールに別のモジュールに存在するビューヘルパーが必要であり、実際には元のモジュールを移動できないことがあります。その場合の 1 つの回避策は、移動できないビュー ヘルパーを拡張する消費モジュールでビュー ヘルパーの空のシェルを定義することです。ファイル内application/mymodule/views/helpers/MyHelper.php:

class Mymodule_View_Helper_Myhelper extends Othermodule_View_Helper_Myhelper
{
}

これにより、ヘルパー実装のコードが重複しなくなります。モジュール固有のリソース オートローダー マッピングにより、ビュー スクリプトからビュー ヘルパーとして呼び出されたときに、これらすべてのクラスを見つけることができます。

最後に、このビュー ヘルパーが複数のプロジェクトで使用される場合、アプリケーション スコープの外に配置するための引数があり、libraryフォルダー内に配置されます。したがって、おそらくMyLibrary_View_Helper_Myhelperファイルに格納されているクラスですlibrary/MyLibrary/View/Helper/Myhelper.php。前と同じように、おそらくブートストラップまたはフロントコントローラープラグインで、プレフィックス/パスのマッピングをビューに通知する必要があります。

$view->addHelperPath(APPLICATON_PATH . '/../library/MyLibrary/View/Helper', 'MyLibrary_View_Helper_');

上記のすべての場合において、ビュー ヘルパー機能自体の呼び出し (たとえば、ビュー スクリプト内) は次のようになることに注意してください。

<?php echo $this->myhelper($params) ?>

特に、クラス名と呼び出しの大文字と小文字の違いに注意してください。

于 2012-12-28T17:53:07.053 に答える