setSaveParameterInSession () trên một đối tượng không


14

tôi nhận được setSaveParametersInSession() on a non-object

Đó là trên một mô-đun quản trị, đường dẫn là

Training/Distributor/Block/Adminhtml/ trong thư mục này tôi có

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

Tại sao tôi nhận được lỗi này?

Tôi không thể thấy bất kỳ typo nào và tôi chắc chắn $ this -> _ blockgroup và $ this -> _ bộ điều khiển là đúng.

Có điều gì khác tôi cần tìm không? hoặc tôi đã bỏ lỡ một cái gì đó?

Sau khi tìm kiếm trên google và stack, tôi đã tìm thấy mọi người thường là _blockgroup hoặc _controll, nhưng dường như đây không phải là trường hợp của tôi

===

BIÊN TẬP

===

<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>

Thêm config.xml tập tin của bạn cũng.
Marius

Vui lòng xem chỉnh sửa
tony09uk

1
Cấu hình có vẻ ổn ngay từ cái nhìn đầu tiên. Hãy thử sử dụng __constructphương pháp thay vì _construct.
Marius

điều đó đã không làm việc
tony09uk

Câu trả lời:


27

Thật khó để nói với thông tin bạn cung cấp, nhưng đây là cách tôi gỡ lỗi này.

Bạn đã không đề cập đến tập tin nào bạn gặp phải vấn đề này, nhưng có lẽ đây là một phần của bộ chứa lưới widget cơ sở, đó là vấn đề của bạn

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

có nghĩa là Magento đang cố gắng khởi tạo lớp khối

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

Hoặc trong trường hợp của bạn

createBlock('training_distributor/adminhtml_distributor_grid')

Vì một số lý do, trên hệ thống của bạn, Magento không thể khởi tạo một đối tượng từ bí danh lớp này, dẫn đến phương thức xảy ra lỗi không phải đối tượng.

Vì vậy, bước một là thêm một số mã gỡ lỗi vào _prepareLayout

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

để đảm bảo _blockGroup_controllerđược đặt chính xác.

Giả sử là họ, bây giờ bạn chỉ cần gỡ lỗi một tra cứu lớp bình thường. Hãy thử chạy đoạn mã sau để xem Magento lớp PHP nghĩ gì nên sử dụng cho bí danh lớp của bạn

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

Nhìn vào cấu hình của bạn, đây sẽ là một cái gì đó như

Training_Distributor_Block_Adminhtml_Distributor_Grid

Nếu $classtrống hoặc sai, điều đó có nghĩa là bạn có lỗi trong config.xmltệp của mình . Bạn có thể gỡ lỗi này bằng cách nhảy đến getGroupedClassNamephương thức.

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

Đây là phương thức mà Magento tham chiếu cấu hình được hợp nhất và lấy ra một tên lớp.

Cuối cùng, nếu $class không có tên lớp, điều đó có nghĩa là trình tải tự động của Magento không thể tìm thấy lớp của bạn. Hãy thử khởi tạo trực tiếp lớp này (một lần nữa, như một bài tập gỡ lỗi)

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

Bạn có thể sẽ nhận được một số loại lớp không tìm thấy lỗi, bởi vì

  1. Lớp học của bạn không ở đúng vị trí (app/code/[codepool]/Training/Distributor/Block/Adminhtml/Distributor/Grid.php

  2. Lớp được định nghĩa trong Grid.phpcó một lỗi đánh máy trong đó


1

Đây $this->_blockGrouplà một tên rất khó hiểu nhưng nó phải là tên thư mục chứ không phải mô-đun. Trong trường hợp của bạn, tôi nghĩ rằng nó nên được$this->_blockGroup = 'distributor';

Nếu bạn xem Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbolnhư một ví dụ, blockgroup là tên thư mục chứ không phải tên mô-đun trong tệp config.xml

// Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbol
$this->_blockGroup = 'currencysymbol_system';

Cảm ơn đề nghị của bạn, tôi đã thử nó nhưng không thành công.
tony09uk

bạn đã thử distributor_distributorchưa
David Manners

Sau ví dụ bạn đề xuất, tôi đã thử 'training_distinator', 'nhà phân phối', 'nhà phân phối', 'training_distinator_distinator'
tony09uk

@DavidManners +1 cho bạn, nó hoạt động với tôi ... cảm ơn ...
Keyur Shah

0

Kiểm tra cấu trúc thư mục của bạn một lần nữa để đảm bảo rằng tất cả các tệp được đặt ở đúng đường dẫn.

Trong trường hợp của tôi cho vấn đề này, tập tin được đặt ở vị trí sai. Tôi đã đặt thư mục Grid.phptrong controller/AdminhtmlđóBlock/Adminhtml/Grid.php


Quy ước đặt tên rất quan trọng. Vì vậy, trong khi đặt tên cho không gian tên và mô-đun của bạn, hãy đảm bảo rằng chúng đúng và theo tiêu chuẩn magento ...
devJsha

0

Kiểm tra đường dẫn của bạn đến tập tin nhà phân phối. Nó nên được đặt trong app / design / adminhtml / default / default / layout / nhà phân phối.

Trong mã liên quan đến config.xml mà bạn đã đăng cho thấy

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

thay vì nó nên như thế này

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

và tệp phải được đặt tại app / design / adminhtml / default / default / layout / nhà phân phối

Hãy thử làm điều này nếu nó không phải là kịch bản hiện tại của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.