setSaveParametersInSession () für ein Nicht-Objekt


14

Ich erhalte setSaveParametersInSession() on a non-object

Es ist auf einem Admin-Modul der Pfad

Training/Distributor/Block/Adminhtml/ In diesem Ordner habe ich

Distributor/Grid.php und 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();
}
}

Warum bekomme ich diesen Fehler?

Ich kann keine Tippfehler sehen und bin sicher, dass $ this -> _ blockGroup und $ this -> _ controller richtig sind.

Gibt es noch andere Dinge, nach denen ich suchen muss? oder habe ich was verpasst

Nach einer Suche in Google und Stack habe ich normalerweise _blockGroup oder _controller gefunden, aber das scheint bei mir nicht der Fall zu sein

===

BEARBEITEN

===

<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>

Fügen Sie config.xml auch Ihre Datei hinzu.
Marius

Bitte siehe edit
tony09uk

1
Die Konfiguration sieht auf den ersten Blick ok aus. Versuchen Sie es mit __constructMethode statt _construct.
Marius

das hat nicht funktioniert
tony09uk

Antworten:


27

Es ist schwer zu sagen mit den Informationen, die Sie zur Verfügung gestellt haben, aber hier ist, wie ich das debuggen würde.

Sie haben nicht erwähnt, in welcher Datei Sie dieses Problem hatten, aber es ist wahrscheinlich der Teil des Basis-Widget-Grid-Containers, der Ihr Problem ist

#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();
}

was bedeutet, dass Magento versucht, die Blockklasse zu instanziieren

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

Oder in deinem Fall

createBlock('training_distributor/adminhtml_distributor_grid')

Aus irgendeinem Grund kann Magento auf Ihrem System kein Objekt aus diesem Klassenalias instanziieren, wodurch die Methode einen Nicht-Objekt-Fehler verursacht.

Also, Schritt eins ist das Hinzufügen von Debug-Code _prepareLayout

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

um sicherzustellen, dass die _blockGroupund _controllerrichtig eingestellt sind.

Angenommen, dies ist der Fall, dann debuggen Sie gerade eine normale Klassensuche. Versuchen Sie, den folgenden Code auszuführen, um festzustellen, welche PHP-Klasse Magento für Ihren Klassenalias verwenden sollte

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

Wenn Sie sich Ihre Konfiguration ansehen, sollte dies in etwa so aussehen

Training_Distributor_Block_Adminhtml_Distributor_Grid

Wenn $classleer oder falsch ist, liegt ein Fehler in Ihrer config.xmlDatei vor. Sie können dies debuggen, indem Sie zur getGroupedClassNameMethode springen .

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

Dies ist die Methode, bei der Magento auf die zusammengeführte Konfiguration verweist und einen Klassennamen abruft.

Wenn schließlich $class hat einen Klassennamen enthält, bedeutet dies , Magento Autoloader- nicht Ihre Klasse finden. Versuchen Sie, diese Klasse direkt zu instanziieren (erneut als Debugging-Übung).

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

Sie werden wahrscheinlich eine Art Fehler erhalten, der nicht gefunden wurde, auch weil

  1. Ihre Klasse ist nicht am richtigen Ort (app/code/[codepool]/Training/Distributor/Block/Adminhtml/Distributor/Grid.php

  2. Die in definierte Klasse Grid.phpenthält einen Tippfehler


1

Der $this->_blockGroupName ist sehr verwirrend, sollte aber der Ordnername und nicht das Modul sein. In deinem Fall denke ich sollte es sein$this->_blockGroup = 'distributor';

Wenn Sie sich Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbolals Beispiel ansehen, ist die blockGroup der Ordnername und nicht der Modulname in der config.xml

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

Vielen Dank für Ihren Vorschlag, ich habe es versucht, war aber erfolglos.
Tony09uk

haben Sie versucht distributor_distributor?
David Manners

Nach dem von Ihnen vorgeschlagenen Beispiel habe ich versucht, 'training_distributor', 'distributor', 'distributor_distributor', 'training_distributor_distributor'
tony09uk 15.11.13

@ DavidManners +1 für Ihre es funktioniert für mich ... danke ...
Keyur Shah

0

Überprüfen Sie die Ordnerstruktur noch einmal, um sicherzustellen, dass sich alle Dateien im richtigen Pfad befinden.

In meinem Fall für dieses Problem wurde die Datei am falschen Ort platziert. Ich habe den Grid.phpin controller/AdminhtmlOrdner eher so abgelegtBlock/Adminhtml/Grid.php


Namenskonventionen sind sehr wichtig. Stellen Sie also beim Benennen Ihres Namespaces und Ihrer Module sicher, dass sie korrekt und gemäß den Magento-Standards sind ...
devJsha

0

Überprüfen Sie Ihren Pfad zur Datei distributor.xml. Es sollte in app / design / adminhtml / default / default / layout / distributor.xml abgelegt werden.

Zeigen Sie dies in dem Code, der mit config.xml zusammenhängt, den Sie gepostet haben

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

eher als das sollte es so sein

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

und die Datei sollte unter app / design / adminhtml / default / default / layout / distributor.xml abgelegt werden

Versuchen Sie dies, wenn es nicht Ihr derzeitiges Szenario ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.