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

मुझे यह त्रुटि क्यों मिली?

मैं किसी भी टाइपो को नहीं देख सकता और मुझे यकीन है कि यह $ -> _ ब्लॉकग्रुप और इस $ -> _ नियंत्रक सही हैं।

क्या कोई और चीज है जिसकी मुझे तलाश करनी है? या मुझसे कोई चीज चूक रही है?

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>

अपनी 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)
{
    ...
}

यह वह विधि है जहां मैगनेटो मर्ज किए गए कॉन्फ़िगरेशन को संदर्भित करता है और एक क्लास नाम को बाहर निकालता है।

अंत में, यदि $class करता है एक वर्ग के नाम होते हैं, तो इसका मतलब है Magento के autoloader अपने वर्ग नहीं मिल रहा। इस वर्ग को तुरंत (फिर से डिबगिंग अभ्यास के रूप में) आज़माकर देखें

$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एक उदाहरण के रूप में देखते हैं तो ब्लॉकग्रुप फ़ोल्डर नाम है न कि 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


नामकरण परंपराएँ बहुत महत्वपूर्ण हैं। तो अपने नाम स्थान और मॉड्यूल का नामकरण करते समय सुनिश्चित करें कि वे सही हैं और Magento के मानकों के अनुसार ...
devJsha

0

डिस्ट्रीब्यूटर के लिए अपना रास्ता जांचें। xml फ़ाइल। इसे ऐप / डिज़ाइन / adminhtml / डिफ़ॉल्ट / डिफ़ॉल्ट / लेआउट / डिस्ट्रीब्यूटर। 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>

और फ़ाइल को ऐप / डिज़ाइन / व्यवस्थापक / डिफ़ॉल्ट / डिफ़ॉल्ट / लेआउट / डिस्ट्रीब्यूटर। xml पर रखा जाना चाहिए

ऐसा करने की कोशिश करें यदि यह आपका वर्तमान परिदृश्य नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.