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 -> _ controller นั้นถูกต้อง

มีสิ่งอื่นใดอีกที่ฉันต้องค้นหาอีกหรือไม่ หรือฉันพลาดอะไรไป

หลังจากค้นหาใน google และ stack ฉันพบผู้คนโดยทั่วไปแล้ว _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>

เพิ่มconfig.xml ไฟล์ของคุณด้วย
Marius

โปรดดูการแก้ไข
tony09uk

1
การกำหนดค่าดูโอเคอย่างรวดเร็วก่อน ลองใช้วิธีการแทน__construct _construct
Marius

ที่ไม่ได้ทำงาน
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();
}

ซึ่งหมายความว่าวีโอไอพีกำลังพยายามยกระดับบล็อก

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

หรือในกรณีของคุณ

createBlock('training_distributor/adminhtml_distributor_grid')

ด้วยเหตุผลบางอย่างในระบบของคุณวีโอไอพีไม่สามารถยกตัวอย่างวัตถุจากนามแฝงคลาสนี้ซึ่งส่งผลให้เกิดข้อผิดพลาดที่ไม่ใช่วัตถุ

ดังนั้นขั้นตอนที่หนึ่งคือการเพิ่มรหัสการแก้จุดบกพร่อง _prepareLayout

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

เพื่อให้แน่ใจว่า_blockGroupและ_controllerตั้งค่าไว้ถูกต้อง

สมมติว่าพวกเขาเป็นตอนนี้คุณเพียงแค่แก้จุดบกพร่องการค้นหาชั้นเรียนปกติ ลองใช้รหัสต่อไปนี้เพื่อดูว่าวีโอไอพีคลาสใดที่คิดว่าควรใช้กับนามแฝงของคลาส

$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)
{
    ...
}

นี่คือวิธีการที่วีโอไอพีอ้างอิงการกำหนดค่าที่ผสานและดึงชื่อคลาสออกมา

สุดท้ายหาก$class ไม่มีชื่อชั้นก็หมายความโหลดวีโอไอพีไม่สามารถหาชั้นเรียนของคุณ ลองสร้างอินสแตนซ์ของคลาสนี้โดยตรง (อีกครั้งเป็นแบบฝึกหัดการดีบัก)

$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', 'Distributor', '
dealer_distributor

@DavidManners +1 สำหรับคุณมันใช้ได้กับฉัน ... ขอบคุณ ...
Keyur Shah

0

ตรวจสอบโครงสร้างโฟลเดอร์ของคุณอีกครั้งเพื่อให้แน่ใจว่าไฟล์ทั้งหมดอยู่ในเส้นทางที่ถูกต้อง

ในกรณีของฉันสำหรับปัญหานี้ไฟล์ถูกวางผิดตำแหน่ง ฉันวางไว้Grid.phpในcontroller/Adminhtmlโฟลเดอร์แทนที่จะเป็นBlock/Adminhtml/Grid.php


อนุสัญญาการตั้งชื่อมีความสำคัญมาก ดังนั้นในขณะที่ตั้งชื่อ namespace และโมดูลของคุณตรวจสอบให้แน่ใจว่าถูกต้องและเป็นไปตามมาตรฐานคุณภาพเยี่ยม ...
devJsha

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 / layout.xml

ลองทำเช่นนี้หากไม่ใช่สถานการณ์ปัจจุบันของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.