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_simpleからブロックを作成してくださいawesome

Magentoは、すばらしいグループのブロックに使用するクラスのベース名を知っている必要があります。素晴らしいグループのブロックに使用するクラスの基本名を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ます。通常、2時間のタイプミスに気付くにはそれで十分です。

于 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の答えは本当に役に立ち、モジュールのバグを見つけて修正するように案内してくれます。

カスタム1グリッドモジュールの場合、同様のエラーが1つ発生しました。

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 に答える