2009-07-08 51 views
1

當我打我的模塊上這個網址http://localhost/xxx/index.php/TradeEnquiry我得到這個錯誤55Magento的自定義模塊,致命錯誤:調用一個成員函數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

線路是這樣的:

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

這是從我的佈局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> 

我沒有得到什麼問題是?該塊被正確命名爲「tradeenquiryView」。我能想到的唯一的事情是佈局XML緩存不知何故?因爲我必須在/ TradeEnquiry而不是/ tradeenquiry上打開模塊,就像我在佈局xml中聲明的那樣,所以它幾乎就像使用舊版本一樣?

+0

你有沒有找到這個解決方案?我有和你一樣的確切問題。 – CoolGravatar 2009-08-02 18:44:32

+0

順便說一句,我試圖安裝Alan的模塊,並通過了GET變量,但沒有出現。 – CoolGravatar 2009-08-02 19:03:17

回答

7

像所有Magento一樣,這可能會發生很多原因。

首先,我會避免在命名塊時使用大寫字母「V」。雖然我不認爲認爲這會導致一個問題(因爲名稱是對URI(核心/文本列表等)和模板文件路徑(/path/to/template.phtml)的引用),但事實上有一個事實上的命名約定在小寫字母/下劃線名稱的佈局系統中,某人(即Varien)可能決定的某個人是強制性約定。

其次,有你,你嘗試設置表單的動作前行稱爲

$this->loadLayout(); 
在你的控制器動作

?直到你做你的佈局對象將不會實例化和/或有一個參考你的塊對象,這意味着

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

將始終返回false。

其他調試技巧。嘗試以下措施以確保您恢復您認爲您應該參加的課程。

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

最後,如果所有的失敗,去佈局對象

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

的來源,看看該getBlock方法

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

,並開始調試語句拋看看你是否可以找出爲什麼系統沒有返回對你的塊的引用。不要忘記刪除/不簽入你的調試語句,因爲這是核心系統代碼。

相關問題