2012-06-01 20 views
1

我正在關注本教程http://codemagento.com/2011/03/creating-custom-magento-reports/創建簡單報告模塊。我已經具備了所有的代碼和XML,但我收到此錯誤未在magento中找到已定義的塊

2012-05-31T21:48:43+00:00 ERR (3): Recoverable Error: Argument 1 passed to Mage_Adminhtml_Controller_Action::_addContent() must be an instance of Mage_Core_Block_Abstract, boolean given, called in /var/www/magento/app/code/local/Super/Awesome/controllers/Adminhtml/Report/ExampleController.php on line 22 and defined in /var/www/magento/app/code/core/Mage/Adminhtml/Controller/Action.php on line 112 

的結構看起來像這樣

Super 
    |_ Awesome 
     |_Block 
     | |_Adminhtml 
     |  |_Report 
     |   |_Simple 
     |   | |_Grid.php 
     |   |_Simple.php 
     |_controllers 
     | |_Adminhtml 
     |  |_Report 
     |   |_ExampleController.php 
     |_etc 
     | |_adminhtml.xml 
     | |_config.xml 
     |_Helper 
     | |_Data.php 
     |_Model 
      |_Mysql4 
      | |_Report 
      | | |_Simple 
      | |  |_Collection.php 
      | |_Simple.php 
      |_Simple.php 

我認爲它是沒有找到塊代碼,但爲什麼呢?

編輯

<?xml version="1.0"?> 
<config> 
    <modules> 
    <Super_Awesome> 
     <version>0.1.0</version> 
    </Super_Awesome> 
    </modules> 
    <admin> 
    <!-- 
     Here we are telling the Magento router to look for the controllers in the Super_Awesome_controllers_Adminhtml before we look in the 
     Mage_Adminhtml module for all urls that begin with /admin/controller_name 
    --> 
    <routers> 
     <adminhtml> 
     <args> 
      <modules> 
      <awesome before="Mage_Adminhtml">Super_Awesome_Adminhtml</awesome> 
      </modules> 
     </args> 
     </adminhtml> 
    </routers> 
    </admin> 
    <models> 
    <awesome> 
     <class>Super_Awesome_Model</class> 
     <resourceModel>awesome_mysql4</resourceModel> 
    </awesome> 
    <awesome_mysql4> 
     <class>Super_Awesome_Model_Mysql4</class> 
     <entities> 
     <simple> 
      <table>super_awesome_example_simple</table> 
     </simple> 
     </entities> 
    </awesome_mysql4> 
    </models> 
    <global> 
    <resources> 
     <awesome_setup> 
     <setup> 
      <module>Super_Awesome</module> 
      <class>Super_Awesome_Model_Mysql4_Setup</class> 
     </setup> 
     <connection> 
      <use>core_setup</use> 
     </connection> 
     </awesome_setup> 
     <awesome_write> 
     <connection> 
      <use>core_write</use> 
     </connection> 
     </awesome_write> 
     <awesome_read> 
     <connection> 
      <use>core_read</use> 
     </connection> 
     </awesome_read> 
    </resources> 
    <helpers> 
     <awesome> 
     <class>Super_Awesome_Helper</class> 
     </awesome> 
    </helpers> 
    </global> 
</config> 

文件:應用程序/代碼/本地/超級/真棒/座/ Adminhtml /報告/ Simple.php

class Super_Awesome_Block_Adminhtml_Report_Simple extends Mage_Adminhtml_Block_Widget_Grid_Container 
{ 
    public function __construct() 
    { 
     $this->_blockGroup = 'awesome'; 
     $this->_controller = 'adminhtml_report_simple'; 
     $this->_headerText = Mage::helper('awesome')->__('Simple Report'); 
     parent::__construct(); 
     $this->_removeButton('add'); 
    } 
} 
+0

似乎

Mage::log((string) $collection->getSelect(), NULL, 'export-all.log'); Mage::log(var_export($collection->getData(), TRUE), NULL, 'export-coll.log'); 

並在必要時,使法師顯示通過改變錯誤的index.php:

所以下面法師::日誌更好的使用是非常重要和有益的就像錯誤非常簡單。所需的參數類型是Mage_Core_Block_Abstract,但是您將它傳遞給布爾值。它似乎找到你的課程,但它有這個錯誤。你確定教程和你的法師版本是兼容的嗎?將代碼第22行放在控制器中以獲得進一步的幫助... – Bosworth99

+0

您正確的是它沒有找到塊。 '$ this-> getLayout() - > createBlock('awesome/adminhtml_report_simple')'返回'false'。您需要發佈您的'config.xml'和'Super_Awesome_Block_Adminhtml_Report_Simple'代碼,並確認文件名/路徑是否正確,然後才能提供幫助。 – nachito

+0

Config.xml和Super_Awesome_Block_Adminhtml_Report_Simple類添加了 – Clutch

回答

6

當你(或Magento的)使用下面的代碼

$this->getLayout()->createBlock('awesome/adminhtml_report_simple') 

你說

請從awesome

創建 adminhtml_report_simple

Magento需要k現在是用於來自真棒組的塊的類的基本名稱。如果你不告訴Magento這個真棒組中的塊的基類名稱,它不能實例化一個塊。這就是爲什麼對方法的調用返回false而不是返回一個塊對象,這就是爲什麼你得到這個異常。

您需要爲您的模塊「打開」塊,方法是在配置中添加一節。根據你上面的例子,你已經爲助手類做了類似的事情。

<config> 
    <global> 
     <helpers> 
      <awesome> 
       <class>Super_Awesome_Helper</class> 
      </awesome> 
     </helpers> 
    </global> 
</config> 

這就是爲什麼你的模塊可以使用助手類。你只需要做同樣的事情

<config> 
    <global> 
     <blocks> 
      <awesome> 
       <class>Super_Awesome_Helper</class> 
      </awesome> 
     </blocks> 
    </global> 
</config> 

這和緩存明確應該設置你的權利。如果不起作用,請跟蹤createBlock以確定它在blocks/awesome節點的配置中查找的位置。這通常足以讓我注意到我已經開始了兩個小時的錯字。

1

你​​3210缺少一些關鍵信息,即<blocks>部分告訴Magento在哪裏尋找你的街區。我不確定爲什麼這是隱藏在教程的「複雜」部分,但哦。這應該做的伎倆:

<config> 
    ... 
    <global> 
    ... 
    <blocks> 
     <awesome> 
      <class>Super_Awesome_Block</class> 
     </awesome> 
    </blocks> 
    ... 
3

剛剛得到這個錯誤,但解決方案是不同的。

一切都宣告權,因爲索引頁面中被稱爲以同樣的方式,使用

$this->getLayout()->createBlock('') 

,我可以看得很清楚了。

但是,我有錯誤的頁面,該塊返回false。正如艾倫所建議的那樣,我去了Mage_Core_Model_Layout::createBlock()。我一直在尋找的功能,這樣做,

public function createBlock($type, $name='', array $attributes = array()) 
{ 
    echo $name; // ADDED ECHO HERE 
    try { 
     $block = $this->_getBlockInstance($type, $attributes); 
    } catch (Exception $e) { 
     echo $e; // ADDED ECHO HERE 
     Mage::logException($e); 
     return false; 
    } 

所以返航這是顯示,must be an instance of Mage_Core_Block_Abstract, boolean given假的,因此錯誤有沒有在嘗試錯誤。實際錯誤的回聲顯示我在我的塊中有錯誤,調用了未聲明的變量。它在一個新的/編輯窗體上,所以如果它是一個新項目,變量不存在。我經歷並修復了錯誤,直到頁面加載沒有錯誤。

希望這可以幫助有類似問題的人,試圖找到在實際上並不存在的聲明中的拼寫錯誤,我知道我正在做這個。

+0

YEP,幫助我找到真正的錯誤真的很有幫助。 –

0

好吧,我張貼我的經驗在這裏幫助別人。

RYAN的回答是非常有用的,並指導我找到我的模塊的錯誤並修復它。

我拿到後,自定義一個網格模塊在一個類似的錯誤:

Recoverable Error: Argument 1 passed to Mage_Adminhtml_Controller_Action:: 
_addContent() must be an instance of Mage_Core_Block_Abstract, boolean given, 
called in /var/www/html/magento2/app/c..... 

這是系統錯誤消息,並且幾乎看起來像法師加載失敗,創造塊!

但實際上,由於在塊中使用了一些輔助函數而導致錯誤。因爲這個幫手還沒有定義。如下

#if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE'])) { 
    Mage::setIsDeveloperMode(true); 
#} 

ini_set('display_errors', 1);