2009-11-25 4 views
7

私は、自分のモジュールで使用されているZend_View_Helper_FormVarsというヘルパーを持っています。 また、私はGeneralFunctions.phpにありますZend_View_Helper_FormVarsから関数を呼び出すためにしようとしているapplication/common/helpers/GeneralFunctions.phpZend_View_HelperのZend Frameworkコールビューヘルパー

に共通するヘルパーを持っています。ここで

Zend_View_Helper_FormVarsの短いバージョンです:ここで

class Zend_View_Helper_FormVars 
{ 
    public $reqFieldVisual='<span class="req">*</span>'; 
    public $roles=array('admin'=>'admin', 'user'=>'user'); 
    public $paymentMethods=array('1'=>'Check', '2'=>'Credit Card', 
       '3'=>'Cash', '4'=>'Other'); 


    public function formVars(){ 
     $this->baseUrl=Zend_Controller_Front::getInstance()->getBaseUrl(); 
     return $this; 
    } 

    public function mkCategoryCodeSelectGroup($codeTypeArr=array(), 
     $codesArr=array()) { 
     $html=''; 
     $html.=Zend_View_Helper_GeneralFunctions::generalFunctions()->progressMeter(); 
     return $html; 
    } 
} 

GeneralFunctions.phpのコードです:

class Zend_View_Helper_GeneralFunctions 
{ 
    public function generalFunctions(){ 
     $this->baseUrl=Zend_Controller_Front::getInstance()->getBaseUrl(); 
     return $this; 
    } 

    public function progressMeter() { 
     $html=''; 
     $html.='<span id="progressWrapper">'; 
     $html.='<span id="progressMeter"></span>'; 
     $html.='</span>'; 
     $html.=''; 
     return $html; 
    } 
} 

また、私はGeneralFunctionsヘルパー自動ブートストラップのようにロードされていることを言及するのを忘れてしまいましたこれは既に私のすべてのモジュールで利用可能です:

$view->addHelperPath(APPLICATION_PATH .'/common/helpers', 'View_Helper'); 
ここで

は、私が試したものですが、エラーを取得しています:

Fatal error: Class 'Common_Helper_General' not found in /Applications/MAMP/htdocs/mysite/application/modules/dashboard/views/helpers/DashboardHelper.php on line 2

+0

および追加:次に、あなたは、単に上記のあなたの例に基づいて、ビューからあなたと同じように、すなわち

$this->view->generalFunctions()->progressMeter(); 

をヘルパーを呼び出すことができますこのためのヘルパーパス。 –

答えて

13

それは別のビューヘルパーを呼び出すために、実際には本当に簡単です。

$viewにアクセスできるように、ビューヘルパーがZend_View_Helper_Abstractに拡張されていることを確認してください。 (!ないZendの)私は、あなた自身の接頭辞でビューヘルパーを名前空間を推薦する

<?php 

class Zend_View_Helper_FormVars extends Zend_View_Helper_Abstract { 

    /* ... */ 

    public function mkCategoryCodeSelectGroup($codeTypeArr=array(), 
     $codesArr=array()) { 
     $html=''; 
     $html. $this->view->generalFunctions()->progressMeter(); 
     return $html; 
    } 
} 
+0

Davidに感謝します。それも働いた。 Zend Frameworkを使ってたくさんのことをする方法があるようです。私はそれが好きですが、時々混乱することがあります。 – EricP

+0

ここでは、Zend_View_Helper_Abstractをサブクラス化する方法を取り上げました。ビュー参照を取得すると、いつものように関数を呼び出すことができることがわかります。多くの場合、ZFにはオブジェクト参照を取得する複数の方法があります。この場合、ViewRenderedまたはレジストリからビューを技術的に取得できます。私の例はきちんとしています。 –

0

あなたはおそらくapplication/common/helpers/からクラスをロードするためにオートローダを設定していない:私は取得

// application/Bootstrap.php -----------> 
function _initViewHelpers() { 
    // add a helper for use for all modules 
    $view->addHelperPath(APPLICATION_PATH .'/Common/Helper', 'Common_Helper'); 
} 
//--------------------> 


// application/common/helpers/General.php -----------> 
class Zend_View_Helper_General extends Zend_View_Helper_Abstract 
{ 
    public function general(){ 
     return $this; 
    } 
    public function test(){ 
     return 'test 123'; 
    } 
} 
//--------------------> 

// application/modules/dashboard/views/helpers/DashboardHelper.php -----------> 
class Zend_View_Helper_DashboardHelper extends Common_Helper_General 
{ 

    public function dashboardHelper(){ 
     return $this; 
    } 

    public function dashboardTest(){ 
     return 'from dashboard'; 
    } 

} 
//--------------------> 

// application/modules/dashboard/views/scripts/index/index.phtml -----------> 
echo $this->dashboardHelper()->test(); 
//--------------------> 

エラーメッセージフォルダ。

デフォルトパスはZend_Application_Module_Autoloaderを参照してください。新しいフォルダを追加する必要があります。

0

あなたはクラスをインスタンス化せずに呼び出しています。

generalFunctions()関数は$thisポインターを使用しますが、これは機能しません。また、静的メソッドでもありません。

Zend_View_Helper_GeneralFunctions::progressMeter(); 

を別のオプションは、最初にあなたのクラスをインスタンス化することです:

一つのオプションは、静的関数であると、このようにそれを直接呼び出すためにプログレスメーターを設定されています。

+0

私はGeneralFunctionsヘルパーをこのようなブートストラップに自動的にロードして、それは既に私のすべてのモジュールで利用可能であると言いました。 こんにちは、私はそれを最初にこのようにインスタンス化して言ったように動作させました。 $ genFun = new Zend_View_Helper_GeneralFunctions(); $ html。= $ genFun-> progressMeter(); – EricP

0

提供されたコードにいくつかの問題があります。

  1. あなたはそれがクラスメソッドとして宣言されている場合、静的メソッドとしてZend_View_Helper_GeneralFunctions::generalFunctions()を呼び出そうとしている(つまり、あなたがそれを使用するクラスのインスタンスをインスタンス化する必要がある)staticキーワードのあなたの不作為の理由による。
  2. 実際にgeneralFunctions()を静的メソッドとして使用してこれを修正する場合は、baseUrlを静的プロパティにするか、そのクラスのインスタンスをインスタンス化してそのインスタンスを返す必要があります。
  3. 直接呼び出される静的メソッドのコンテナとしてGeneralFunctionsクラスを使用するという考え方は、実際に深刻な問題の症状であり、コードの匂いというラベルが付けられています。私が横たわっていると思うなら、Zend Framework 2.0の重要な項目を見てみてください(ヒント:フレームワークからすべての静的メソッドを削除することが必要です)。あるいは、あなたは静的メソッドの考え方をいつでも尋ねることができます:-)。

一般的な機能クラスZend_View_Helper_GeneralFunctionsのためのあなたの指定したクラス名を見ると、あなたが別のヘルパー内GeneralFunctionsヘルパーを使用しようとしている現在のシナリオを与え、私はあなたが実際には2つの事柄のいずれかを実行する必要があると推測します。

  1. すべてのヘルパーがこれらの機能を利用できるように、すべてのヘルパークラスにGeneralFunctionsクラスをサブクラス化する必要があります。基本的には、あなたの援助者がすべて、拡張機能を超えたヘルパーとしてGeneralFunctionヘルパーとして始まったのかどうかを尋ねてください。このソリューションは、継承を使用して問題を解決します。
  2. すべてのビューヘルパーには、実行中のViewオブジェクトのインスタンスが含まれている必要があります。したがって理論的には、魔法の__callメソッド(他にも明示的なメソッドがあると思いますが、私は常に魔法を使用します)を介して他のビューヘルパーにアクセスできるはずです。それはあなたのシナリオではそうのようになります。このシナリオでは

    public function mkCategoryCodeSelectGroup($codeTypeArr=array(), $codesArr=array()) 
    { 
        $html=''; 
        $html.= $this->generalFunctions()->progressMeter(); 
        return $html; 
    } 
    

    __call方法はGeneralFunctionsヘルパーをロードした後、GeneralFunctionsヘルパーからprogressMeter()メソッドを呼び出しますでしょう。

    今すぐあなたのGeneralFunctionsヘルパークラスは、おそらく次のようになります。

    class Zend_View_Helper_GeneralFunctions 
    { 
        public function __construct() 
        { 
         $this->baseUrl = Zend_Controller_Front::getInstance()->getBaseUrl(); 
        } 
    
        public function progressMeter() { 
         $html=''; 
         $html.='<span id="progressWrapper">'; 
         $html.='<span id="progressMeter"></span>'; 
         $html.='</span>'; 
         $html.=''; 
         return $html; 
        } 
    } 
    
+0

しかし、あなたがノアと言ったことによってコードを改善することに興味があります。 だから、何を言っていることは、私はこのようにすべての私のビューヘルパーを拡張することができるということです。 クラスZend_View_Helper_FormVarsはZend_View_Helper_GeneralFunctions を拡張し、私は例えば、ビュースクリプト内でこれらのクラスのいずれかからの機能を必要とするとき、私は$を呼ぶだろうthis-> formVars() - > someFunction(); someFunction()は、FormVarsクラスまたはGeneralFunctionsクラスに含めることができますか? ありがとうございました – EricP

+0

@EricP - あなたが示唆しているように、すべてのView HelperクラスでGeneralFunctions View Helperクラスを拡張できます。または、サンプルコードに示されているように、単純に汎用ヘルパービューヘルパーをビューヘルパーとして単独で使用することができます。このメソッドを使用すると、他のビューヘルパーは引き続きデフォルトの抽象クラスを継承してから、魔法の__call()メソッドを介してGeneralFunctionsビューヘルパーからメソッドを呼び出します。 –