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 -> _ верны.

Есть ли что-то еще, что мне нужно искать? или я что то пропустил?

После поиска в Google и в стеке я нашел людей, обычно _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>
tony09uk
источник
Добавьте свой config.xml файл также.
Мариус
Пожалуйста, смотрите edit
tony09uk
1
Конфиг выглядит нормально на первый взгляд. Попробуйте использовать __constructметод вместо _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 не может создать экземпляр объекта из псевдонима этого класса, что приводит к методу при ошибке, не связанной с объектом.

Итак, первый шаг - добавление кода отладки в _prepareLayout

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

чтобы убедиться, что _blockGroupи _controllerустановлены правильно.

Предполагая, что это так, теперь вы просто отлаживаете обычный поиск классов. Попробуйте запустить следующий код, чтобы увидеть, что PHP-класс Magento думает использовать в качестве псевдонима класса.

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

Взглянув на свой конфиг, это должно быть что-то вроде

Training_Distributor_Block_Adminhtml_Distributor_Grid

Если $classпусто или неверно, это означает, что у вас есть ошибка в вашем config.xmlфайле. Вы можете отладить это, перейдя к getGroupedClassNameметоду.

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

Это метод, в котором Magento ссылается на объединенную конфигурацию и извлекает имя класса.

Наконец, если $class оно содержит имя класса, это означает, что автозагрузчик Magento не может найти ваш класс. Попробуйте создать экземпляр этого класса напрямую (опять же, как упражнение по отладке)

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

Вы, вероятно, получите какую-то ошибку класса not found, либо потому что

  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_distributor», «training_distributor_distributor»
tony09uk
@DavidManners +1 за ваше, это работает для меня ... спасибо ...
Кейур Шах
0

Проверьте структуру папок еще раз, чтобы убедиться, что все файлы расположены по правильному пути.

В моем случае для этой проблемы файл был помещен в неправильное место. Я поместил Grid.phpв controller/Adminhtmlпапку скорее чтоBlock/Adminhtml/Grid.php

devJsha
источник
Соглашения об именах очень важны. Поэтому, называя ваше пространство имен и модули, убедитесь, что они правильные и соответствуют стандартам
magento
0

Проверьте свой путь к файлу distributor.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

Попробуйте сделать это, если это не ваш настоящий сценарий.

devJsha
источник