非オブジェクトのsetSaveParametersInSession()


14

私は得ています setSaveParametersInSession() on a non-object

管理モジュール上にあり、パスは

Training/Distributor/Block/Adminhtml/ このフォルダに私は持っています

Distributor/Grid.php そして Distributor.php

class Training_Distributor_Block_Adminhtml_Distributor
extends Mage_Adminhtml_Block_Widget_Grid_Container
{

/**
* my understanding:
* $this->_blockGroup . '/' . $this->_controller . '_grid'
* i.e. training_distributor/adminhtml_distributor_grid
*/
public function _construct()
{
    $this->_blockGroup = 'training_distributor';
    $this->_controller = 'adminhtml_distributor';
    $this->_headerText = $this->__('List Distributors');
    $this->_addButtonLabel = $this->__('Add Distributor');

    parent::_construct();
}
}

なぜこのエラーが発生するのですか?

タイプミスは見当たらず、$ this-> _ blockGroupと$ this-> _ controllerが正しいと確信しています。

他に探す必要があるものはありますか?または私は何かを見逃しましたか?

グーグルとスタックで検索した後、私は通常_blockGroupまたは_controllerの人々を見つけましたが、これは私には当てはまらないようです

===

編集

===

<config>
<modules>
    <Training_Distributor>
        <version>0.0.2</version>
    </Training_Distributor>
</modules>
<global>
    <resources>
        <training_distributor_setup>
            <setup>
                <module>Training_Distributor</module>
            </setup>
        </training_distributor_setup>
    </resources>

    <models>
        <training_distributor>
            <class>Training_Distributor_Model</class>
            <resourceModel>training_distributor_resource</resourceModel>
        </training_distributor>

        <training_distributor_resource>
            <class>Training_Distributor_Model_Resource</class>
            <entities>
                <distributor>
                    <table>training_distributor_entity</table>
                </distributor>
            </entities>
        </training_distributor_resource>
    </models>
    <blocks>
        <training_distributor>
            <class>Training_Distributor_Block</class>
        </training_distributor>
    </blocks>
    <helpers>
        <training_distributor>
            <class>Training_Distributor_Helper</class>
        </training_distributor>                
    </helpers>
</global>

<admin>
    <routers>
        <adminhtml>
            <args>
                <modules>
                    <training_distributor before="Mage_Adminhtml">Training_Distributor_Adminhtml</training_distributor>
                </modules>
            </args>
        </adminhtml>
    </routers>
</admin>

<adminhtml>
    <layout>
        <updates>
            <training_distributor>
                <file>training/distributor.xml</file>
            </training_distributor>
        </updates>
    </layout>
</adminhtml>

</config>

config.xml ファイルも追加します。
マリウス

編集を参照してください
tony09uk

1
構成は一見問題なく見えます。の__construct代わりにmethod を使用してみてください_construct
マリウス

うまくいかなかった
-tony09uk

回答:


27

あなたが提供した情報で言うのは難しいですが、私はこれをどのようにデバッグしますか

どのファイルにこの問題が発生しているかは言及しませんでしたが、おそらく、ベースウィジェットグリッドコンテナーのこの部分が問題です

#File: app/code/core/Mage/Adminhtml/Block/Widget/Grid/Container.php
protected function _prepareLayout()
{
    $this->setChild( 'grid',
        $this->getLayout()->createBlock( $this->_blockGroup.'/' . $this->_controller . '_grid',
        $this->_controller . '.grid')->setSaveParametersInSession(true) );
    return parent::_prepareLayout();
}

これは、Magentoがブロッククラスをインスタンス化しようとしていることを意味します

createBlock($this->_blockGroup.'/' . $this->_controller . '_grid')

またはあなたの場合

createBlock('training_distributor/adminhtml_distributor_grid')

何らかの理由で、システム上でMagentoはこのクラスエイリアスからオブジェクトをインスタンス化できません。その結果、非オブジェクトエラーのメソッドが発生します。

したがって、ステップ1では、デバッグコードを _prepareLayout

#File: app/code/core/Mage/Adminhtml/Block/Widget/Grid/Container.php
protected function _prepareLayout()
{
    var_dump($this->_blockGroup.'/' . $this->_controller . '_grid');
    ...
}

_blockGroupおよび_controllerが正しく設定されていることを確認します。

それらがそうであると仮定すると、今は通常のクラス検索をデバッグしているだけです。次のコードを実行して、Magentoがクラスエイリアスに使用すべきPHPクラスを確認してください。

$class = Mage::getConfig()->getBlockClassName('training_distributor/adminhtml_distributor_grid')
var_dump($class);

あなたの設定を見ると、これは次のようになります

Training_Distributor_Block_Adminhtml_Distributor_Grid

$classが空またはfalseの場合、config.xmlファイルにエラーがあることを意味します。getGroupedClassNameメソッドにジャンプして、これをデバッグできます。

public function getGroupedClassName($groupType, $classId, $groupRootNode=null)
{
    ...
}

これは、Magentoがマージされた構成を参照し、クラス名を引き出すメソッドです。

最後に、クラス名$class 含まれている場合、Magentoのオートローダーがクラスを見つけられないことを意味します。このクラスを直接インスタンス化してみてください(もう一度、デバッグの練習として)

$o = new Training_Distributor_Block_Adminhtml_Distributor_Grid;
var_dump($o);

おそらく、何らかのクラスが見つからないというエラーが発生します。

  1. クラスが適切な場所にありません(app/code/[codepool]/Training/Distributor/Block/Adminhtml/Distributor/Grid.php

  2. で定義されたクラスにGrid.phpはタイプミスがあります


1

$this->_blockGroup非常に紛らわしい名称ですが、それはフォルダ名ではなく、モジュールでなければなりません。あなたの場合、私はそれがあるべきだと思う$this->_blockGroup = 'distributor';

Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbol例として見ると、blockGroupはconfig.xmlのモジュール名ではなくフォルダー名です

// Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbol
$this->_blockGroup = 'currencysymbol_system';

あなたの提案をありがとう、私はそれを試してみましたが、失敗しました。
tony09uk

試しましたdistributor_distributorか?
デビッドマナーズ

例の後には、私が「training_distributor」、「販売代理店」、「distributor_distributor」、「training_distributor_distributor」しようとした提案
tony09uk

@DavidMannersそれは私のために働くあなたのための1 ...ありがとう...
Keyurシャー

0

フォルダ構造をもう一度確認して、すべてのファイルが正しいパスにあることを確認してください。

この問題の私の場合、ファイルは間違った場所に置かれました。私が置かGrid.phpcontroller/Adminhtml、むしろそのフォルダBlock/Adminhtml/Grid.php


命名規則は非常に重要です。したがって、名前空間とモジュールに名前を付けながら、それらが正しいものであり、Magentoの基準に従っていることを確認してください...
Magentoの

0

distribution.xmlファイルへのパスを確認してください。app / design / adminhtml / default / default / layout / distributor.xmlに配置する必要があります。

投稿したconfig.xmlに関連するコードでは、

<adminhtml>
    <layout>
        <updates>
            <training_distributor>
                <file>training/distributor.xml</file>
            </training_distributor>
        </updates>
    </layout>
</adminhtml>

これよりもこのようになります

<adminhtml>
    <layout>
        <updates>
            <training_distributor>
                <file>distributor.xml</file>
            </training_distributor>
        </updates>
    </layout>
</adminhtml>

ファイルはapp / design / adminhtml / default / default / layout / distributor.xmlに配置する必要があります

現在のシナリオではない場合は、これを試してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.