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>
config.xml
również swój plik.__construct
metody zamiast_construct
.Odpowiedzi:
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
co oznacza, że Magento próbuje utworzyć instancję klasy blokowej
Lub w twoim przypadku
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
aby upewnić się, że
_blockGroup
i_controller
są 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
Spoglądając na twoją konfigurację, powinno to być coś w rodzaju
Jeśli
$class
jest puste lub fałszywe, oznacza to, że masz błąd wconfig.xml
pliku. Możesz to debugować, przechodząc dogetGroupedClassName
metody.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)Prawdopodobnie wystąpi błąd polegający na tym, że nie znaleziono klasy
Twoja klasa nie znajduje się we właściwej lokalizacji (
app/code/[codepool]/Training/Distributor/Block/Adminhtml/Distributor/Grid.php
Klasa zdefiniowana w
Grid.php
zawiera literówkęźródło
$this->_blockGroup
To 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_Currencysymbol
przykład, blockGroup to nazwa folderu, a nie nazwa modułu w pliku config.xmlźródło
distributor_distributor
?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.php
wcontroller/Adminhtml
folderzeBlock/Adminhtml/Grid.php
źródło
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
zamiast tego powinno tak być
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.
źródło