setSaveParametersInSession () pada non-objek

14

Saya mengerti setSaveParametersInSession() on a non-object

Itu ada di modul admin jalannya

Training/Distributor/Block/Adminhtml/ dalam folder ini yang saya miliki

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

Mengapa saya mendapatkan kesalahan ini?

Saya tidak dapat melihat kesalahan ketik dan saya yakin $ this -> _ blockGroup dan $ this -> _ controller benar.

Apakah ada hal lain yang perlu saya cari? atau apakah saya melewatkan sesuatu?

Setelah pencarian di google dan stack saya telah menemukan orang-orang biasanya _blockGroup atau _controller, tetapi ini tampaknya tidak menjadi masalah bagi saya

===

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>
tony09uk
sumber
Tambahkan config.xml file Anda juga.
Marius
Silakan lihat edit
tony09uk
1
Konfigurasi terlihat ok pada pandangan pertama. Coba gunakan __constructmetode, bukan _construct.
Marius
itu tidak berhasil
tony09uk

Jawaban:

27

Sulit untuk mengatakan dengan informasi yang Anda berikan, tapi beginilah cara saya men-debug ini.

Anda tidak menyebutkan file tempat Anda mengalami masalah ini, tetapi mungkin ini bagian dari wadah kotak widget dasar yang menjadi masalah Anda

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

yang berarti Magento mencoba untuk membuat kelas blok

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

Atau dalam kasus Anda

createBlock('training_distributor/adminhtml_distributor_grid')

Untuk beberapa alasan, pada sistem Anda Magento tidak dapat membuat instance objek dari alias kelas ini, yang menghasilkan metode pada kesalahan non-objek.

Jadi, langkah pertama adalah menambahkan beberapa kode debug _prepareLayout

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

untuk memastikan _blockGroupdan _controllerdiatur dengan benar.

Dengan asumsi mereka, sekarang Anda hanya men-debug pencarian kelas normal. Coba jalankan kode berikut untuk melihat apa yang menurut pendapat kelas PHP Magento harus digunakan untuk alias kelas Anda

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

Melirik konfigurasi Anda, ini harusnya seperti

Training_Distributor_Block_Adminhtml_Distributor_Grid

Jika $classkosong atau salah, itu berarti Anda memiliki kesalahan dalam config.xmlfile Anda . Anda dapat men-debug ini dengan melompat ke getGroupedClassNamemetode.

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

Ini adalah metode di mana Magento mereferensikan konfigurasi gabungan dan mengeluarkan nama kelas.

Akhirnya, jika $class ada mengandung nama kelas, itu berarti autoloader Magento tidak dapat menemukan kelas Anda. Coba instantiate kelas ini secara langsung (sekali lagi, sebagai latihan debugging)

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

Anda mungkin akan mendapatkan semacam kelas yang tidak ditemukan kesalahan, baik karena

  1. Kelas Anda tidak di lokasi yang tepat (app/code/[codepool]/Training/Distributor/Block/Adminhtml/Distributor/Grid.php

  2. Kelas yang didefinisikan Grid.phpmemiliki salah ketik di dalamnya

Alan Storm
sumber
1

Itu $this->_blockGroupadalah nama yang sangat membingungkan tetapi harus nama folder dan bukan modul. Jika Anda pikir saya harus$this->_blockGroup = 'distributor';

Jika Anda melihatnya Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbolsebagai contoh, blockGroup adalah nama folder dan bukan nama modul di config.xml

// Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbol
$this->_blockGroup = 'currencysymbol_system';
David Manners
sumber
Terima kasih atas saran Anda, saya sudah mencobanya tetapi tidak berhasil.
tony09uk
Apakah kamu sudah mencoba distributor_distributor?
David Manners
Setelah contoh yang Anda sarankan, saya telah mencoba 'training_distributor', 'distributor', 'distributor_distributor', 'training_distributor_distributor'
tony09uk
@DavidManners +1 untuk Anda itu berfungsi untuk saya ... terima kasih ...
Keyur Shah
0

Periksa struktur folder Anda sekali lagi untuk memastikan bahwa semua file berada di jalur yang benar.

Dalam kasus saya untuk masalah ini file ditempatkan di lokasi yang salah. Saya menempatkan folder Grid.phpdi controller/Adminhtmlbukan ituBlock/Adminhtml/Grid.php

devJsha
sumber
Konvensi Penamaan sangat penting. Jadi ketika menamai namespace dan modul Anda pastikan bahwa mereka benar dan sesuai dengan standar
magento
0

Periksa jalur Anda ke file distributor.xml. Itu harus ditempatkan di app / design / adminhtml / default / default / layout / distributor.xml.

Dalam kode yang terkait dengan config.xml yang Anda posting menunjukkan hal itu

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

daripada ini seharusnya seperti ini

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

dan file tersebut harus ditempatkan di app / design / adminhtml / default / default / layout / distributor.xml

Coba lakukan ini jika itu bukan skenario Anda saat ini.

devJsha
sumber