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, але це, здається, не так для мене

===

EDIT

===

<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метод замість _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);

Ви, ймовірно, отримаєте якусь помилку класу, яку не знайшли, тому що

  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', 'distributer', 'distributeur_distributor', 'training_distributor_distributor'
tony09uk

@DavidManners +1 за те, що він працює для мене ... дякую ...
Кейур Шах

0

Перевірте структуру папки ще раз, щоб переконатися, що всі файли розташовані на правильному шляху.

У моєму випадку для цього питання файл був розміщений у неправильному місці. Я помістив Grid.phpв controller/Adminhtmlпапку , а щоBlock/Adminhtml/Grid.php


Названня конвенцій дуже важливі. Тож, називаючи свій простір імен та модулі, переконайтесь, що вони правильні та відповідають стандартам magento ...
devJsha,

0

Перевірте шлях до файлу distributeur.xml. Він повинен бути розміщений у app / design / adminhtml / default / default / layout / distribuitor.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 / distribuutor.xml

Спробуйте зробити це, якщо це не ваш теперішній сценарій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.