Bir Zend_View_Helper Zend Framework çağrısı görünümü yardımcı

4 Cevap php

I have a helper called Zend_View_Helper_FormVars that's used by one of my modules. I also have a common helper in application/common/helpers/GeneralFunctions.php

I Zend_View_Helper_FormVars o GeneralFunctions.php öyle bir işlevi çağırmak çalışıyorum.

İşte kısa versiyonu 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;
    }
}

Burada kodu 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;
    }
}

Ayrıca, ben GeneralFunctions yardımcı otomatik böyle Bootstrap yüklenen ve zaten tüm modülleri mevcut bulunuyor olması söylemeyi unutmuşum:

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

İşte ne denedim, ancak bir hata alıyorum:

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

Hata mesajı alıyorum:

Ölümcül hata: Sınıfı 'Common_Helper_General' on line 2 / Applications / MAMP / htdocs / mysite / uygulama / modules / pano / views / yardımcıları / DashboardHelper.php bulunamadı

4 Cevap

Başka görüntüle Yardımcısı aramak için aslında gerçekten basit.

O $view erişimi vardır böylece görünüm yardımcı, Zend_View_Helper_Abstract uzanır emin olun. O zaman sadece bir görünümden, yani olduğu gibi yardımcılarını çağırabilir

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

Yukarıdaki örneğe göre:

<?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;
    }
}

Muhtemelen application/common/helpers/ klasöründen sınıfları yüklemek için autoloader yapılandırılmamış değil.

Zend_Application_Module_Autoloader varsayılan yolları için bkz. Bunu için yeni bir klasör eklemek gerekir.

Ben senin sağlanan kodu ile çeşitli sorunları görebilirsiniz.

  1. O {[(1 sizin ihmal nedeniyle bir sınıf yöntemi (yani bunu kullanmak için sınıfın bir örneğini var) olarak ilan edilmiştir zaman statik bir yöntem olarak Zend_View_Helper_GeneralFunctions::generalFunctions() aramak için çalışıyorsunuz )]} anahtar kelime.
  2. Siz aslında statik bir yöntem olarak generalFunctions() kullanmak ve bu düzeltmek istiyorsanız o zaman baseUrl, bir statik özellik yapmak ya gerekir veya sınıfının bir örneğini zorunda ve olacaktır o örneğini döndürür.
  3. Denir statik yöntemler için bir kap olarak GeneralFunctions sınıfını kullanarak fikri doğrudan gerçekten derin sorunların bir belirtisi olduğunu ve haklı bir kod koku etiketli. (: Bu çerçevede tüm statik yöntemler kaldırarak içerir ipucu) Eğer ben Zend Framework 2.0 için yüksek öncelikli öğeleri bir göz atın yalan olduğumu düşünüyorum. Yoksa her zaman :-) onlar statik yöntemler ne düşündüğünü SO sorabilirsiniz.

Genel fonksiyonlar sınıfının Zend_View_Helper_GeneralFunctions için verilen sınıf adı bakıyor ve başka yardımcısı içindeki GeneralFunctions yardımcıyı kullanın çalıştığınız verilen senaryo, ben gerçekten ihtiyacınız olduğunu tahmin ediyorum iki şeyden birini yapın.

  1. Sen yardımcıların tüm bu fonksiyonlar bulunmaktadır, böylece her yardımcı sınıf alt sınıfını GeneralFunctions sınıf olması gerekir. Sizin yardımcıları tüm ötesinde genişletilmiş işlevsellik ile GeneralFunction yardımcıları olarak yaşam başlamadı Temelde, kendinize sorun. Bu çözüm sorunu çözmek için miras kullanır.
  2. Her görünüm yardımcı etkinmektedir View nesnesi bir örneğini içermelidir. Bu nedenle teoride size büyü __call yöntemi (Ben açık bir yöntem de olduğunu düşünüyorum ama ben her zaman sihirli yöntemini kullanabilirsiniz) üzerinden başka bir görünümü yardımcısı erişmek gerekir. Bu senaryo çok gibi görünebilir:

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

    Bu senaryoda __call yöntemi GeneralFunctions yardımcısı yük olur ve ardından GeneralFunctions helper gelen progressMeter() yöntemini çağırır olurdu.

    Şimdi GeneralFunctions yardımcı sınıf Muhtemelen şöyle olacaktır:

    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;
        }
    }
    

Bunu başlatmasını olmadan sınıf çağırıyor.

Sizin generalFunctions() işlevi çalışmaz $this işaretçi kullanır; Ayrıca statik bir yöntem değildir.

Bir seçenek ilerleme metre statik bir fonksiyonu olabilir ve doğrudan bu gibi aramak için ayarlanır:

Zend_View_Helper_GeneralFunctions::progressMeter();

Başka bir seçenek ilk sınıf örneğini etmektir.