2009-11-25 7 views
7

Ich habe einen Helfer namens Zend_View_Helper_FormVars, die von einem meiner Module verwendet wird. Ich habe auch einen gemeinsamen Helfer in application/common/helpers/GeneralFunctions.phpZend Framework Call-View-Helfer von einem Zend_View_Helper

Ich versuche, eine Funktion von Zend_View_Helper_FormVars aufzurufen, die in GeneralFunctions.php sind.

Hier ist die kurze Version von Zend_View_Helper_FormVars ist:

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

Hier ist der Code in 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; 
    } 
} 

auch vergessen, zu erwähnen, dass ich die GeneralFunctions Helfer Auto in der Bootstrap geladen haben wie dies und es ist für alle meine Module bereits verfügbar:

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

ist, was ich versucht, aber ich erhalte eine Fehlermeldung:

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

Fehlermeldung erhalte ich:

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

+0

ich empfehlen würde Namensräume View Helfer mit Ihrem eigenen Präfix und das Hinzufügen von (nicht Zend!) der Hilfspfad dafür. –

Antwort

13

Es ist eigentlich ganz einfach eine andere View Helfer zu rufen.

Stellen Sie sicher, dass Ihr View Helper Zend_View_Helper_Abstract erweitert, so dass es Zugriff auf die $view hat. Dann rufen Sie können einfach Helfer, wie man es aus einer Sicht, dh

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

Basierend auf dem obigen Beispiel:

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

Danke David. Das hat auch funktioniert. Es scheint so viele Möglichkeiten zu geben, Dinge mit dem Zend Framework zu tun. Ich mag es, aber es kann manchmal verwirrend sein. – EricP

+0

Der Trick hier war, Zend_View_Helper_Abstract abzuleiten, etwas, das im Handbuch schwer zu erkennen ist. Sobald Sie eine Ansichtsreferenz haben, werden Sie feststellen, dass Sie Funktionen wie gewohnt aufrufen können. In ZF gibt es oft mehrere Möglichkeiten, Objektreferenzen abzurufen. In diesem Fall könnten Sie die Ansicht aus dem ViewRendered oder einer Registry abrufen. Mein Beispiel ist am besten. –

0

Sie haben möglicherweise nicht Ihre Autoloader konfiguriert Klassen aus dem application/common/helpers/ zu laden Mappe.

Siehe Zend_Application_Module_Autoloader für Standardpfade. Sie sollten dazu Ihren neuen Ordner hinzufügen.

0

Sie rufen Ihre Klasse an, ohne sie zu instanziieren.

Ihre generalFunctions() Funktion verwendet den Zeiger $this, der nicht funktioniert; es ist auch keine statische Methode.

Eine Option ist Statusanzeige eine statische Funktion und nennen es direkt so sein: erste

Zend_View_Helper_GeneralFunctions::progressMeter(); 

Eine weitere Möglichkeit, Ihre Klasse zu instanziiert ist.

+0

Ich habe vergessen zu erwähnen, dass ich den GeneralFunctions-Helfer automatisch im Bootstrap geladen habe, wie dieser und er ist für alle meine Module bereits verfügbar: $ view-> addHelperPath (APPLICATION_PATH. '/ Common/helpers', 'View_Helper'); Hallo Jai, ich habe es funktioniert wie du gesagt hast indem du es zuerst so instanziiert hast: $ genFun = new Zend_View_Helper_GeneralFunctions(); $ html. = $ GenFun-> progressMeter(); – EricP

0

Ich sehe mehrere Probleme mit Ihrem bereitgestellten Code.

  1. Sie versuchen Zend_View_Helper_GeneralFunctions::generalFunctions() als statische Methode zu nennen, wenn sie als Klassenmethode deklariert wird (dh Sie haben eine Instanz der Klasse zu instanziiert, es zu benutzen) aufgrund Ihrer Weglassen des static Schlüsselwort.
  2. Wenn Sie tatsächlich generalFunctions() als statische Methode verwenden und dies korrigieren möchten, müssen Sie entweder baseUrl eine statische Eigenschaft erstellen, oder Sie müssen eine Instanz der Klasse instanziieren und dann diese Instanz zurückgeben.
  3. Die Idee, Ihre GeneralFunctions Klasse als Container für statische Methoden zu verwenden, die direkt aufgerufen werden, ist wirklich ein Symptom für tiefere Probleme und wird zu Recht als Code-Geruch bezeichnet. Wenn Sie denken, dass ich lüge, werfen Sie einen Blick auf die Elemente mit hoher Priorität für das Zend Framework 2.0 (Hinweis: Es beinhaltet das Entfernen aller statischen Methoden aus dem Framework). Oder Sie können SO immer fragen, was sie von statischen Methoden halten :-).

Ein Blick auf Ihren gegebenen Klassennamen für die allgemeinen Funktionen Klasse Zend_View_Helper_GeneralFunctions und das aktuelle Szenario gegeben, wo Sie die GeneralFunctions Helfer in einem anderen Helfer versuchen, zu verwenden, würde ich vermuten, dass Sie wirklich ein von zwei Dingen tun müssen.

  1. Sie müssen jede Unterklasse der Hilfsklasse GeneralFunctions haben, damit alle Ihre Helfer diese Funktionen zur Verfügung haben. Im Grunde fragen Sie sich, ob Ihre Helfer alle das Leben als GeneralFunction Helfer mit erweiterter Funktionalität beginnen. Diese Lösung verwendet Vererbung, um Ihr Problem zu lösen.
  2. Jeder View-Helper sollte eine Instanz des View-Objekts enthalten, das bearbeitet wird. Theoretisch sollte man also über die magische Methode __call auf jeden anderen View-Helfer zugreifen können (ich denke, es gibt auch eine explizite Methode, aber ich benutze immer die magische Methode). Es könnte so aussehen, so in Ihrem Szenario:

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

    In diesem Szenario die __call Methode, um die GeneralFunctions Helfer laden würde und würde die progressMeter() Methode aus dem GeneralFunctions Helfer dann rufen.

    Jetzt würde Ihre GeneralFunctions Helfer Klasse wahrscheinlich so aussehen:

    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

Aber ich bin daran interessiert, meinen Code besser zu machen, indem Sie Noah sagen. Also, was Sie sagen, ist, dass ich alle Helfer meiner Ansicht wie diese erweitern können: Klasse Zend_View_Helper_FormVars erstreckt Zend_View_Helper_GeneralFunctions Und wenn ich eine Funktion aus einer dieser Klassen in einem View Skript zum Beispiel brauchen, würde ich $ nennen dies-> formVars() -> someFunction(); Und SomeFunction() kann in der FormVars-Klasse oder der GeneralFunctions-Klasse sein? danke – EricP

+0

@EricP - Sie können die GeneralFunctions View Helper-Klasse mit all Ihren View Helper-Klassen erweitern, wie Sie vorschlagen. Oder Sie können den GeneralFunctions-View-Helper ganz einfach als View-Helper verwenden, wie ich im Beispielcode angegeben habe.Wenn Sie diese Methode verwenden, erben Ihre anderen View-Helfer immer noch die Standard-Abstract-Klasse, und Sie rufen Methoden aus dem View-Helper von GeneralFunctions über die magische __call() -Methode auf. –