我正在按照本教程http://codemagento.com/2011/03/creating-custom-magento-reports/创建简单的报告模块。我已经有了所有的代码和XML,但是我收到了这个错误
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>
文件:app / code / local / Super / Awesome / Block / Adminhtml / Report / 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 :(得分:6)
当您(或Magento)使用以下代码
时$this->getLayout()->createBlock('awesome/adminhtml_report_simple')
你说的是
请从
创建adminhtml_report_simple
群组awesome
块
Magento需要知道要用于来自awesome组的块的类的基本名称。如果你没有告诉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 :(得分: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;
}
尝试中出现错误,因此返回false,因此显示错误must be an instance of Mage_Core_Block_Abstract, boolean given
。实际错误的回显告诉我,我的块中有错误,调用未声明的变量。它是在新的/编辑表单上,因此如果它是一个新项目,则变量不存在。我经历并修复了错误,直到页面加载没有错误。
希望这可以帮助有类似问题的人,尝试在实际上并不存在的声明中找到拼写错误,我知道我这样做了一段时间。
答案 2 :(得分:1)
您的config.xml
缺少一些关键信息,即<blocks>
部分,告诉Magento在哪里寻找您的积木。我不确定为什么这个隐藏在本教程的“复杂”部分,但是哦。这应该可以解决问题:
<config>
...
<global>
...
<blocks>
<awesome>
<class>Super_Awesome_Block</class>
</awesome>
</blocks>
...
答案 3 :(得分:0)
好的,我在这里发布我的经验来帮助别人。
RYAN的回答非常有帮助,并指导我找到我的模块的bug并修复它。
自定义一个网格模块时出现了类似的错误:
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.....
这是系统错误消息,看起来像mage无法加载和创建阻止!
但实际上,错误是由于在块中使用了一些辅助函数引起的。因为尚未定义此助手。
因此,更好地使用Mage :: log非常重要且有用:
Mage::log((string) $collection->getSelect(), NULL, 'export-all.log');
Mage::log( var_export($collection->getData(), TRUE), NULL, 'export-coll.log');
必要时,启用Mage以更改index.php显示错误,如下所示
#if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE'])) {
Mage::setIsDeveloperMode(true);
#}
ini_set('display_errors', 1);