2

「アプリケーション/ビュー/ヘルパー」内にあるいくつかのビューヘルパーを無効にする方法を作ろうとしています...

私が本当に望んでいるのは、いくつかのヘルパーを有効または無効にするために、application.ini にいくつかのオプションを追加することです。

application.ini の例:

helpers.Helper1=on
helpers.Helper2=off

問題は、ヘルパーがオフのときに、ビューで別の結果を返すために、このヘルパーのいくつかの関数を書き直したいということです。このように、ビュー スクリプトで何も変更する必要はありません。

私は、ヘルパーごとに 2 つの異なる php ファイルを異なる場所に配置することを考えました。1 つは実際のヘルパーを使用し、もう 1 つは変更されたヘルパーを使用します (application.ini でオフになっているときに機能するように)。

問題は、どのビューをロードするかをビューに伝える方法がわからないことです...

どうすればそれができるか知っている人はいますか?

最終コード

わかりました、何度も試した後、次のコードで動作するようにしました:

ブートストラップ

protected function _initConfigureHelpers(){
    $this->bootstrap('view');
    $view = $this->getResource('view');

    $view->addHelperPath("./../library/ConfigHelpers","Configurable_Helper");
    $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
        'ViewRenderer'
    );
    $viewRenderer->setView($view);
    $front  = Zend_Controller_Front::getInstance();
    $front->registerPlugin(new Application_Plugin_ViewPlugins());
    return $view;
}

Application_Plugin_ViewPlugins

class Application_Plugin_ViewPlugins extends Zend_Controller_Plugin_Abstract
{

    public function preDispatch(Zend_Controller_Request_Abstract $request){

        $front=Zend_Controller_Front::getInstance();
        $bootstrap=$front->getParam('bootstrap');
        $options=$bootstrap->getOption("helpers");
        if (is_array($options)){
            $view = $bootstrap->getResource('view');

            foreach($options as $option => $value){
                $helper=$view->getHelper($option);
                if ($helper){
                    if ($value=="off")
                        $helper->__disable();
                    else if ($value!="on")
                        throw new Exception('The value of helpers.'.$option.' must be "on" or "off" on application.ini.');
                } else {
                    throw new Exception("Inexistent Helper");
                }
            }
        }
    }

}

ヘルパーの変更例

require_once APPLICATION_HELPERS."CssCrush.php";

class Configurable_Helper_CssCrush extends Zend_View_Helper_CssCrush {

    protected $__config_enabled = true;

    public function __disable(){
        $this->__config_enabled = false;
        return $this;
    }


    public function __enable(){
        $this->__config_enabled = true;
        return $this;
    }

    public function cssCrush(){
        if ($this->__config_enabled){
            return parent::cssCrush();
        } else{
            return new Modified_CssCrush();
        }
    }

}

class Modified_CssCrush {

    public static function file ( $file, $options = null ) {
        return $file;
    }

}

APPLICATION_HELPERS は /public/index.php で "../application/views/helpers/" として定義されています。

ここで、構成可能なヘルパーを追加したい場合は、元のヘルパーを "/application/views/helpers/" に置き、それを修正したバージョンを "/library/ConfigHelpers" に上記の例の構造で作成します。

4

3 に答える 3

1

次のリンクZend_View リンクをご覧ください。

以下は、Zend ドキュメントから考慮すべき重要なポイントです。

注: デフォルトのヘルパー パス

デフォルトのヘルパー パスは、常に Zend Framework ビュー ヘルパー、つまり「Zend/View/Helper/」を指します。setHelperPath() を呼び出して既存のパスを上書きしても、デフォルトのヘルパーが確実に機能するようにこのパスが設定されます。

つまり、Zend_View オブジェクトを拡張して setHelperPath メソッドを上書きしない限り、実際にはヘルパーをオフにすることはできません。しかし、これは行くべき道ではありません。

これがおそらくあなたがやりたいことです。まず、ここに私の仮定があります。

前提 : いくつかのメソッドをあちこちで変更することによって、現在のビュー ヘルパーの動作をわずかに変更する独自のビュー ヘルパーを作成したいと考えています。

これを達成するためにあなたがすべきことは次のとおりです。

まず、ビュー ヘルパーを記述します。クラス名の最後の部分が、「上書き」するビュー ヘルパーと同じであることを確認してください。必須ではありませんが、これにより、元のヘルパーが使用できなくなります。

class My_View_Helper_BaseUrl extends Zend_View_Helper_BaseUrl

{   
    private $_enabled = true;
    public function setEnabled( $bool ){ $this->_enabled = (boolean) $bool; }
    public function baseUrl(){ 
        if( $this->_enabled ){
             return 'testUrl'; //other code 
        }
        else return parent::baseUrl();
}

それができたら、次のことを行います

$view->setHelperPath('/path/to/my/helpers', 'My_View_Helper'); //1
echo $view->baseUrl();  //2

優秀な。これで、元の BaseUrl ヘルパーを効果的にシャドーイングできました。上記のコードは、デフォルトの zend ディレクトリをスキャンする前に、ビューがヘルパーのディレクトリをスキャンするようにします。2 行目に到達すると、ビューは最初に YOUR baseUrl ヘルパーを見つけ、元の baseUrl ヘルパーの代わりに THAT を使用します。上記の例では、通常の baseUrl の動作ではなく、'testurl' をエコーする必要があります。

于 2012-05-02T21:23:32.093 に答える
1

あなたが欲しいと思うのは、 zf2 に来る依存性注入ですが、 zf1では利用できません。

少しいじくり回すと、必要なものを手に入れることができます。

ブートストラップでのヘルパーの構成

(デフォルトのプロジェクト構造を想定)

ヘルパー パスの表示 config : application/configs/application.ini:

resources.view.helperPath.Zf_View_Helper_ = "Zf/View/Helper"

シンプルな構成可能なヘルパー(無効化/有効化を許可しますが、明らかに必要なメソッドを追加できます (動作を必要とするヘルパーの基本クラスとしてこれを使用します)

class Zf_View_Helper_Configurable extends Zend_View_Helper_Abstract
{
    protected $isEnabled = true;

    public function configurable()
    {
        return $this;
    }

    public function disable()
    {
        $this->isEnabled = false;
        return $this;
    }


    public function enable()
    {
        $this->isEnabled = true;
        return $this;
    }

    public function __toString()
    {
        if ($this->isEnabled) {
            return 'Configurable is enabled';
        } else {
            return 'Configurable is disabled';
        }
    }
}

ブートストラップでヘルパーを構成します。

public function _initConfigureHelpers()
{
    $this->bootstrap('view');
    $view = $this->getResource('view');

    $configurableHelper = $view->configurable();
    $configurableHelper->disable();
}

.ini ファイルにオプションを追加して、ブートストラップの initConfigureHelpers() メソッドで取得できます。

デフォルトのzfヘルパーからこの動作が必要な場合は、@Ratsoが言ったことを実行し、それらのヘルパーを拡張し、必要な動作を追加してから、ブートストラップで構成してください。

于 2012-05-02T20:24:28.893 に答える
0

たとえば、元のヘルパーを拡張するカスタム ヘルパーを作成できます。

class My_Helper_Url extends Zend_View_Helper_Url
{}

必要に応じてメソッドを書き換えます。

于 2012-05-02T19:59:47.690 に答える