8

Zend_View_Helper_FormVarsモジュールの 1 つで使用される というヘルパーがあります。私も共通のヘルパーを持っていますapplication/common/helpers/GeneralFunctions.php

Zend_View_Helper_FormVarsにある関数を 呼び出そうとしていますGeneralFunctions.php

の短いバージョンは次の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また、次のように Bootstrap にヘルパーが自動ロードされており、既にすべてのモジュールで利用できることを忘れていました。

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

これが私が試したものですが、エラーが発生しています:

// 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();
//-------------------->

私が得るエラーメッセージ:

致命的なエラー: 2 行目の /Applications/MAMP/htdocs/mysite/application/modules/dashboard/views/helpers/DashboardHelper.php にクラス 'Common_Helper_General' が見つかりません

4

4 に答える 4

14

別の View Helper を呼び出すのは、実はとても簡単です。

Zend_View_Helper_Abstractにアクセスできるように、ビュー ヘルパーが を拡張していることを確認してください$view。次に、ビューから行う場合と同じように、単純にヘルパーを呼び出すことができます。

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

上記の例に基づいて:

<?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;
    }
}
于 2009-11-27T18:10:12.480 に答える
0

application/common/helpers/フォルダーからクラスをロードするようにオートローダーを構成していない可能性があります。

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

于 2009-11-26T02:15:49.970 に答える
0

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

  1. キーワードを省略したため、クラスメソッドとして宣言されているときに静的メソッドとして呼び出そうとしてZend_View_Helper_GeneralFunctions::generalFunctions()います (つまり、それを使用するにはクラスのインスタンスをインスタンス化する必要があります) 。static
  2. 実際に静的メソッドとして使用generalFunctions()してこれを修正する場合はbaseUrl、静的プロパティを作成するか、クラスのインスタンスをインスタンス化してからそのインスタンスを返す必要があります。
  3. 直接呼び出される静的メソッドのコンテナーとしてクラスを使用するという考えは、GeneralFunctions実際にはより深刻な問題の兆候であり、正しくコード臭と呼ばれています。私が嘘をついていると思われる場合は、Zend Framework 2.0 の優先度の高い項目を見てください (ヒント: フレームワークからすべての静的メソッドを削除する必要があります)。または、いつでもSOに静的メソッドについてどう思うか尋ねることができます:-)。

一般関数クラスの指定されたクラス名を見て、別のヘルパー内でヘルパーZend_View_Helper_GeneralFunctionsを使用しようとしている現在のシナリオを考えると、本当に 2 つのことのいずれかを行う必要があると思います。GeneralFunctions

  1. すべてのヘルパー クラスがクラスをサブクラス化してGeneralFunctions、すべてのヘルパーがこれらの関数を使用できるようにする必要があります。GeneralFunction基本的に、すべてのヘルパーが拡張機能を備えたヘルパーとして生活を始めるかどうかを自問してください。このソリューションでは、継承を使用して問題を解決します。
  2. すべてのビュー ヘルパーには、操作対象の View オブジェクトのインスタンスが含まれている必要があります。したがって、理論的には、魔法の方法を介して他のビューヘルパーにアクセスできるはずです__call(明示的な方法もあると思いますが、私は常に魔法の方法を使用します)。シナリオでは次のようになります。

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

    このシナリオでは、__callメソッドはヘルパーをロードし、ヘルパーからメソッドGeneralFunctionsを呼び出します。progressMeter()GeneralFunctions

    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;
        }
    }
    
于 2009-11-26T05:46:53.930 に答える
0

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

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

1 つのオプションは、プログレス メーターを静的関数に設定し、次のように直接呼び出します。

Zend_View_Helper_GeneralFunctions::progressMeter();

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

于 2009-11-26T04:50:49.317 に答える