1

我正在按照本教程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');
    }
}
4

4 回答 4

6

当您(或 Magento)使用以下代码时

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

你说

请从组中创建一个adminhtml_report_simpleawesome

Magento 需要知道用于来自 awesome 组的块的类的基本名称。如果你不告诉 Magento 类的基本名称用于来自 awesome 组的块,它就不能实例化一个块。这就是对方法的调用返回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节点配置中的位置。这通常足以让我注意到我已经开始两个小时的错字。

于 2012-06-01T22:35:10.610 回答
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. 实际错误的回声显示我的块中有错误,调用了未声明的变量。它位于新/编辑表单上,因此如果它是新项目,则变量不存在。我经历并修复了错误,直到页面加载没有错误。

希望这可以帮助有类似问题的人,试图在声明中找到实际上不存在的错字,我知道我这样做了一段时间。

于 2012-10-29T21:29:44.237 回答
1

config.xml缺少一些关键信息,即<blocks>告诉 Magento 在哪里寻找您的块的部分。我不确定为什么这被隐藏在教程的“复杂”部分,但是哦,好吧。这应该可以解决问题:

<config>
  ...
  <global>
    ...
    <blocks>
        <awesome>
            <class>Super_Awesome_Block</class>
        </awesome>
    </blocks>
    ...
于 2012-06-01T22:25:54.970 回答
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.....

这是系统错误消息,看起来法师无法加载和创建块!

但实际上,错误是由于在块中使用了一些辅助函数而引起的。因为这个助手还没有被定义。

因此,更好地使用 Mage::log 非常重要且很有帮助:

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

并在必要时通过更改 index.php 使 Mage 显示错误,如下所示

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

ini_set('display_errors', 1);
于 2015-01-15T11:18:07.787 回答