setSaveParametersInSession () na obiekcie niebędącym obiektem

14

Dostaję setSaveParametersInSession() on a non-object

Ścieżka znajduje się w module administratora

Training/Distributor/Block/Adminhtml/ w tym folderze mam

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

Dlaczego dostaję ten błąd?

Nie widzę literówek i jestem pewien, że kontroler $ this -> _ blockGroup i $ this -> _ mają rację.

Czy są jeszcze inne rzeczy, których muszę szukać? czy coś przeoczyłem?

Po wyszukiwaniu w google i stosie znalazłem ludzi zwykle _blockGroup lub _controller, ale nie wydaje mi się, że tak jest w moim przypadku

===

EDYTOWAĆ

===

<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>
tony09uk
źródło
Dodaj config.xml również swój plik.
Marius
Proszę zobaczyć edycję
tony09uk
1
Konfiguracja na pierwszy rzut oka wygląda dobrze. Spróbuj użyć __constructmetody zamiast _construct.
Marius
to nie zadziałało
tony09uk

Odpowiedzi:

27

Trudno powiedzieć na podstawie dostarczonych informacji, ale oto jak to debuguję.

Nie wspomniałeś, w którym pliku miałeś ten problem, ale prawdopodobnie to ta część podstawowego kontenera siatki widżetów jest twoim problemem

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

co oznacza, że ​​Magento próbuje utworzyć instancję klasy blokowej

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

Lub w twoim przypadku

createBlock('training_distributor/adminhtml_distributor_grid')

Z jakiegoś powodu w twoim systemie Magento nie może utworzyć instancji obiektu z tego aliasu klasy, co powoduje metodę na błędzie nieobiektywnym.

Zatem krok pierwszy polega na dodaniu kodu debugującego do _prepareLayout

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

aby upewnić się, że _blockGroupi _controllersą ustawione poprawnie.

Zakładając, że tak, teraz debugujesz zwykłe wyszukiwanie klas. Spróbuj uruchomić następujący kod, aby zobaczyć, jaka klasa PHP Magento uważa, że ​​powinna ona używać dla twojego aliasu klasy

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

Spoglądając na twoją konfigurację, powinno to być coś w rodzaju

Training_Distributor_Block_Adminhtml_Distributor_Grid

Jeśli $classjest puste lub fałszywe, oznacza to, że masz błąd w config.xmlpliku. Możesz to debugować, przechodząc do getGroupedClassNamemetody.

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

Jest to metoda, w której Magento odwołuje się do scalonej konfiguracji i wyciąga nazwę klasy.

Wreszcie, jeśli $class nie zawierają nazwę klasy, oznacza to autoloader Magento nie może znaleźć swoją klasę. Spróbuj bezpośrednio utworzyć instancję tej klasy (ponownie jako ćwiczenie debugowania)

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

Prawdopodobnie wystąpi błąd polegający na tym, że nie znaleziono klasy

  1. Twoja klasa nie znajduje się we właściwej lokalizacji (app/code/[codepool]/Training/Distributor/Block/Adminhtml/Distributor/Grid.php

  2. Klasa zdefiniowana w Grid.phpzawiera literówkę

Alan Storm
źródło
1

$this->_blockGroupTo nazwa bardzo mylące, ale powinna być nazwa folderu, a nie moduł. W twoim przypadku myślę, że tak powinno być$this->_blockGroup = 'distributor';

Jeśli popatrzysz na Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbolprzykład, blockGroup to nazwa folderu, a nie nazwa modułu w pliku config.xml

// Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbol
$this->_blockGroup = 'currencysymbol_system';
David Manners
źródło
Dziękuję za sugestię, próbowałem, ale nie powiodło się.
tony09uk
próbowałeś distributor_distributor?
David Manners,
Po zasugerowanym przez ciebie przykładzie wypróbowałem „training_distributor”, „dystrybutor”, „distributor_distributor”, „training_distributor_distributor”
tony09uk
@DavidManners +1 dla ciebie to działa dla mnie ... dzięki ...
Keyur Shah
0

Jeszcze raz sprawdź strukturę folderów, aby upewnić się, że wszystkie pliki znajdują się we właściwej ścieżce.

W moim przypadku dla tego problemu plik został umieszczony w niewłaściwej lokalizacji. Zamiast tego umieściłem folder Grid.phpw controller/AdminhtmlfolderzeBlock/Adminhtml/Grid.php

devJsha
źródło
Konwencje nazewnictwa są bardzo ważne. Więc podczas nazywania przestrzeni nazw i modułów upewnij się, że są poprawne i zgodne ze standardami magento ...
devJsha
0

Sprawdź swoją ścieżkę do pliku distributor.xml. Powinien zostać umieszczony w app / design / adminhtml / default / default / layout / distributor.xml.

Pokaż to w kodzie związanym z plikiem config.xml

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

zamiast tego powinno tak być

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

a plik powinien zostać umieszczony w app / design / adminhtml / default / default / layout / distributor.xml

Spróbuj to zrobić, jeśli nie jest to twój obecny scenariusz.

devJsha
źródło