2009-07-08 5 views
1

Als ich mein Modul auf dieser URL getroffen http://localhost/xxx/index.php/TradeEnquiry Ich erhalte diesen FehlerMagento benutzerdefinierte Module, Fatal error: Call auf eine Elementfunktion setFormAction()

Fatal error: Call to a member function setFormAction() on a non-object in C:\wamp\www\stockdisplays\app\code\local\Stock\Tradeenquiry\controllers\IndexController.php on line 55

55 ist diese:

$this->getLayout()->getBlock('tradeenquiryView') 
      ->setFormAction(Mage::getUrl('*/*/post')); 

Dies ist ein Fragment von meinem Layout xml:

<default> 
    <reference name="footer_links"> 
     <action method="addLink" translate="label title" module="tradeenquiry"> 
       <label>Trade Enquiry</label> 
       <url>tradeenquiry</url> 
       <title>Trade Enquiry</title> 
       <prepare>true</prepare> 
      </action> 
    </reference> 
</default> 

<tradeenquiry_index_index> 
    <reference name="root"> 
     <action method="setTemplate"><template>page/2columns-right.phtml</template></action> 
     <action method="setHeaderTitle" translate="title" module="tradeenquiry"><title>Trade Enquiry</title></action> 
    </reference> 
    <reference name="content"> 
     <block type="core/template" name="tradeenquiryView" template="tradeenquiry/view.phtml"/> 
    </reference> 
</tradeenquiry_index_index> 

Ich verstehe nicht, was das Problem ist? Der Block heißt korrekt "tradenquiryView". Das einzige, was mir einfällt, ist, dass das Layout-XML irgendwie zwischengespeichert wird? Wie muss ich das Modul auf/TradeAnfrage und nicht/tradenAnfrage wie ich in meinem Layout xml gesagt habe, so ist es fast so, als ob es eine ältere Version verwendet?

+0

Haben Sie jemals eine Lösung gefunden? Ich habe genau das gleiche Problem, das du hast. – CoolGravatar

+0

BTW, ich habe versucht, Alans Modul zu installieren und die GET-Variablen zu übergeben, aber nichts ist erschienen. – CoolGravatar

+0

Ja, für mich stellte sich heraus, dass es sich um einen kleinen Fehler in einer der XML-Dateien handelte. Ich, wenn durch sie alle mit Beyond Compare, und machte alle Abstände und Kapitalisierungen die gleiche wie das Kontaktmodul und es funktionierte. – Dan

Antwort

7

Wie alles Magento gibt es zahlreiche Gründe dafür.

Erstens würde ich vermeiden, einen Großbuchstaben "V" zu verwenden, wenn Sie Ihre Blöcke benennen. Obwohl ich nicht denke dies würde ein Problem verursachen (wie Namen sind Verweise auf URIs (Kern/Textliste, etc.) und Vorlage Dateipfad (/path/to/template.phtml)), gibt es eine De-facto-Namenskonvention im Layout-System von Kleinbuchstaben/Unterstrichen Namen, die jemand, irgendwo (dh Varien) entscheiden kann, ist eine erzwungene Konvention.

Zweitens haben Sie

$this->loadLayout(); 

in Ihrer Controller-Aktion vor der Zeile genannt, wo Sie die Form Aktion zu setzen versuchen? Bis Sie das Ihr Layout-Objekt tun nicht haben instanziiert und/oder haben einen Verweis auf Ihre Blockobjekte, was bedeutet,

$this->getLayout()->getBlock('...') 

wird immer false zurück.

Weitere Tipps zum Debuggen. Versuchen Sie Folgendes, um sicherzustellen, dass Sie die Kurse zurückbekommen, von denen Sie glauben, dass Sie sie sollten.

die(get_class($this->getLayout()->getBlock('root')));         
die(get_class($this->getLayout()));   

schließlich alle, wenn das nicht funktioniert, gehen Sie auf die Quelle des Layoutobjekts

app/code/core/Mage/Core/Model/Layout.php 

und einen Blick auf die Methode getBlock nehmen

public function getBlock($name) 
{ 
    if (isset($this->_blocks[$name])) { 
     return $this->_blocks[$name]; 
    } else { 
     return false; 
    } 
} 

und starten in Debug-Anweisungen zu werfen um zu sehen, ob Sie herausfinden können, warum das System keine Referenz auf Ihren Block zurückgibt. Vergessen Sie nicht, Ihre Debugging-Anweisungen zu entfernen/nicht zu überprüfen, da dies der Kernsystemcode ist.

+0

Nochmals vielen Dank für eine weitere Ihrer umfassenden Antworten. Ihre Punkte über $ this-> loadLayout(); und die Hauptstadt V, ich bin sicher, aber so ist das Magento Contacts Modul? Ill debug wie Sie sagen und dann sehen, was ich bekomme – Dan

+0

Ich debuggte getBlock und mein Block ist nicht gesetzt, so dass es eine falsche zurückgibt. Wie kann das sein? Es ist im Layout-XML festgelegt, gibt es woanders muss ich suchen? – Dan

+0

Wenn _blocks leer ist, liegt das daran, dass Sie die loadLayout-Methode des Controllers noch nicht aufgerufen haben. Wenn _blocks nicht leer ist, aber keine "tratenenquiryView" enthält, bedeutet dies, dass das abschließende "Seitenlayout" Ihren threenquiryView-Block nicht enthält. Können Sie das Modul unter http://stackoverflow.com/questions/1087733/magento-my-account-layout-xml-problem/1088107#1088107 greifen und die Ergebnisse von showLayout = Seite und showLayout = Handles? –

Verwandte Themen