nesne olmayan bir nesne üzerinde setSaveParametersInSession ()


14

Ben alıyorum setSaveParametersInSession() on a non-object

Bir yönetici modülünde yol

Training/Distributor/Block/Adminhtml/ bu klasörde var

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

Neden bu hatayı alıyorum?

Herhangi bir yazım hatası göremiyorum ve eminim $ this -> _ blockGroup ve $ this -> _ denetleyici doğru.

Aramam gereken başka şeyler var mı? ya da bir şey mi kaçırdım?

Google ve yığın üzerinde bir arama yaptıktan sonra genellikle _blockGroup veya _controller kullanıcıları buldum, ancak bu benim için böyle görünmüyor

===

DÜZENLE

===

<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 Dosyanızı da ekleyin .
Marius

Lütfen düzenlemeye bakın
tony09uk

1
Yapılandırma ilk bakışta iyi görünüyor. __constructBunun yerine yöntemi kullanmayı deneyin _construct.
Marius

işe yaramadı
tony09uk

Yanıtlar:


27

Verdiğiniz bilgilerle söylemek zor, ama bunu nasıl hata ayıklayacağım.

Bu sorunu hangi dosyada yaşadığınızdan bahsetmediniz, ancak muhtemelen temel widget ızgarası konteynerinin bu kısmı sizin probleminiz

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

yani Magento'nun blok sınıfını somutlaştırmaya çalışması

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

Veya senin durumunda

createBlock('training_distributor/adminhtml_distributor_grid')

Bazı nedenlerden dolayı, sisteminizde Magento bu sınıf diğer adından bir nesne başlatamaz ve bu da yöntemin nesne olmayan bir hataya neden olmasıyla sonuçlanır.

Yani, birinci adım, hata ayıklama kodunu _prepareLayout

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

emin olmak için _blockGroupve _controllerdoğru olarak ayarlanır.

Var olduklarını varsayarak, artık normal bir sınıf aramasında hata ayıklama yapıyorsunuz. Sınıf takma adınız için hangi PHP sınıfının kullanması gerektiğini düşündüğünü görmek için aşağıdaki kodu çalıştırmayı deneyin

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

Yapılandırmanıza göz atmak, bunun gibi bir şey olmalı

Training_Distributor_Block_Adminhtml_Distributor_Grid

Eğer $classboş veya yanlış, bu sizin bir hata var demektir config.xmldosyası. getGroupedClassNameYönteme atlayarak bunu hata ayıklayabilirsiniz .

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

Bu, Magento'nun birleştirilmiş yapılandırmaya başvurduğu ve bir sınıf adı çıkardığı yöntemdir.

Son olarak, eğer $class does bir sınıf adını içeren, bu Magento'nın autoloader sınıfınızı bulamıyorum anlamına gelir. Bu sınıfı doğrudan başlatmayı deneyin (yine bir hata ayıklama egzersizi olarak)

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

Muhtemelen bir tür sınıf bulunamadı hatası alırsınız, çünkü

  1. Sınıfınız uygun yerde değil (app/code/[codepool]/Training/Distributor/Block/Adminhtml/Distributor/Grid.php

  2. Grid.phpİçinde tanımlanan sınıfın bir yazım hatası var


1

$this->_blockGroupÇok kafa karıştırıcı adıdır ama klasör adı değil modülü olmalıdır. Senin durumunda bence olmalı$this->_blockGroup = 'distributor';

Mage_Currencysymbol_Block_Adminhtml_System_CurrencysymbolÖrnek olarak bakarsanız , blockGroup config.xml dosyasındaki modül adı değil klasör adıdır

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

Öneriniz için teşekkürler, denedim ama başarısız oldu.
tony09uk

denedin distributor_distributormi
David Manners


@DavidManners +1 bunun için benim için çalışıyor ... teşekkürler ...
Keyur Shah

0

Tüm dosyaların doğru yolda bulunduğundan emin olmak için klasör yapınızı bir kez daha kontrol edin.

Benim durumumda bu dosya yanlış yere yerleştirildi. Verdiğim Grid.phpiçinde controller/Adminhtmloldukça bu klasöreBlock/Adminhtml/Grid.php


Adlandırma Kuralları çok önemlidir. Bu nedenle, ad alanınızı ve modüllerinizi adlandırırken bunların doğru ve
eflatun

0

Distributor.xml dosyasının yolunu kontrol edin. App / design / adminhtml / default / default / layout / distributor.xml dosyasına yerleştirilmelidir.

Gönderdiğiniz config.xml ile ilgili kodda şunu gösterir:

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

bundan ziyade böyle olmalı

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

ve dosya app / design / adminhtml / default / default / layout / distributor.xml dosyasına yerleştirilmelidir

Şu anki senaryonuz değilse bunu deneyin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.