setSaveParametersInSession () su un non oggetto


14

Sto ottenendo setSaveParametersInSession() on a non-object

È su un modulo admin il percorso è

Training/Distributor/Block/Adminhtml/ in questa cartella ho

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

Perché visualizzo questo errore?

Non riesco a vedere alcun refuso e sono sicuro che $ this -> _ blockGroup e $ this -> _ controller hanno ragione.

Ci sono altre cose che devo cercare? o ho perso qualcosa?

Dopo una ricerca su Google e Stack ho trovato persone di solito _blockGroup o _controller, ma questo non sembra essere il caso per me

===

MODIFICARE

===

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

Aggiungi anche il tuo config.xml file.
Marius

Si prega di vedere modifica
tony09uk

1
La configurazione sembra a prima vista ok. Prova a utilizzare il __constructmetodo anziché _construct.
Marius

che non ha funzionato
tony09uk,

Risposte:


27

È difficile dirlo con le informazioni che hai fornito, ma ecco come farei il debug di questo.

Non hai menzionato in quale file hai riscontrato questo problema, ma probabilmente è questa parte del contenitore della griglia del widget di base che è il tuo problema

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

il che significa che Magento sta provando a creare un'istanza della classe block

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

O nel tuo caso

createBlock('training_distributor/adminhtml_distributor_grid')

Per qualche motivo, sul tuo sistema Magento non è in grado di creare un'istanza di un oggetto da questo alias di classe, che provoca il metodo su un errore non oggetto.

Quindi, il primo passo è l'aggiunta di un po 'di codice di debug a _prepareLayout

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

per assicurarsi che _blockGroupe _controllersiano impostati correttamente.

Supponendo che lo siano, ora stai solo eseguendo il debug di una normale ricerca di classe. Prova a eseguire il codice seguente per vedere quale classe PHP Magento pensa dovrebbe usare per il tuo alias di classe

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

Dando un'occhiata alla tua configurazione, dovrebbe essere qualcosa del genere

Training_Distributor_Block_Adminhtml_Distributor_Grid

Se $classè vuoto o falso, significa che hai un errore nel tuo config.xmlfile. Puoi eseguire il debug saltando al getGroupedClassNamemetodo.

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

Questo è il metodo in cui Magento fa riferimento alla configurazione unita ed estrae un nome di classe.

Infine, se $class fa contenere un nome di classe, significa caricatore automatico di Magento non riesce a trovare la classe. Prova a creare un'istanza direttamente di questa classe (di nuovo, come esercizio di debug)

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

Probabilmente otterrai una sorta di errore di classe non trovata, sia perché

  1. La tua classe non è nella posizione corretta (app/code/[codepool]/Training/Distributor/Block/Adminhtml/Distributor/Grid.php

  2. La classe definita in Grid.phpha un refuso in essa


1

Il $this->_blockGroupè un nome molto confusa ma dovrebbe essere il nome della cartella e non il modulo. Nel tuo caso penso che dovrebbe essere$this->_blockGroup = 'distributor';

Se guardi Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbolcome esempio blockGroup è il nome della cartella e non il nome del modulo in config.xml

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

Grazie per il tuo suggerimento, l'ho provato ma non ho avuto successo.
tony09uk,

hai provato distributor_distributor?
David Manners,

Dopo l'esempio che mi hai suggerito, ho provato "training_distributor", "distributors", "distribut_distributor", "training_distributor_distributor"
tony09uk

@DavidManners +1 per te funziona per me ... grazie ...
Keyur Shah

0

Controlla ancora una volta la struttura delle cartelle per assicurarti che tutti i file si trovino nel percorso corretto.

Nel mio caso per questo problema, il file è stato posizionato in una posizione errata. Ho messo l' Grid.phpin controller/Adminhtmlcartella piuttosto cheBlock/Adminhtml/Grid.php


Le convenzioni di denominazione sono molto importanti. Quindi, mentre assegni un nome al tuo spazio dei nomi e ai moduli, assicurati che siano corretti e secondo gli standard magento ...
devJsha,

0

Controlla il percorso del file distributore.xml. Dovrebbe essere inserito in app / design / adminhtml / default / default / layout / distributori.xml.

Nel codice relativo a config.xml che hai pubblicato mostra che

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

piuttosto che questo dovrebbe essere così

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

e il file dovrebbe essere posizionato in app / design / adminhtml / default / default / layout / distribut.xml

Prova a farlo se non è il tuo scenario attuale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.