setSaveParametersInSession () sur un non-objet

14

Je suis en train setSaveParametersInSession() on a non-object

C'est sur un module d'administration que le chemin est

Training/Distributor/Block/Adminhtml/ dans ce dossier j'ai

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

Pourquoi ai-je cette erreur?

Je ne vois aucune faute de frappe et je suis sûr que $ this -> _ blockGroup et $ this -> _ controller ont raison.

Y a-t-il d'autres choses que je dois rechercher? ou ai-je raté quelque chose?

Après une recherche sur google et stack, j'ai trouvé des gens généralement _blockGroup ou _controller, mais cela ne semble pas être le cas pour moi

===

ÉDITER

===

<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>
tony09uk
la source
Ajoutez également votre config.xml fichier.
Marius
S'il vous plaît voir modifier
tony09uk
1
La configuration semble correcte au premier coup d'œil. Essayez d'utiliser la __constructméthode au lieu de _construct.
Marius
qui n'a pas fonctionné
tony09uk

Réponses:

27

C'est difficile à dire avec les informations que vous avez fournies, mais voici comment je déboguerais cela.

Vous n'avez pas mentionné le fichier dans lequel vous rencontriez ce problème, mais c'est probablement cette partie du conteneur de grille de widget de base qui est votre problème

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

ce qui signifie que Magento essaie d'instancier la classe de bloc

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

Ou dans votre cas

createBlock('training_distributor/adminhtml_distributor_grid')

Pour une raison quelconque, sur votre système, Magento ne peut pas instancier un objet de cet alias de classe, ce qui entraîne la méthode sur une erreur non liée à un objet.

Donc, la première étape consiste à ajouter du code de débogage à _prepareLayout

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

pour vous assurer que _blockGroupet _controllersont correctement réglés.

En supposant qu'ils le soient, maintenant vous déboguez simplement une recherche de classe normale. Essayez d'exécuter le code suivant pour voir quelle classe PHP Magento pense qu'il devrait utiliser pour votre alias de classe

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

En jetant un œil à votre configuration, cela devrait être quelque chose comme

Training_Distributor_Block_Adminhtml_Distributor_Grid

Si $classest vide ou faux, cela signifie que vous avez une erreur dans votre config.xmlfichier. Vous pouvez déboguer cela en passant à la getGroupedClassNameméthode.

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

Il s'agit de la méthode dans laquelle Magento référence la configuration fusionnée et extrait un nom de classe.

Enfin, si $class ne contient un nom de classe, cela signifie que le chargeur automatique de Magento ne peut pas trouver votre classe. Essayez d'instancier directement cette classe (à nouveau, comme exercice de débogage)

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

Vous obtiendrez probablement une sorte d'erreur de classe non trouvée, soit parce que

  1. Votre classe n'est pas au bon endroit (app/code/[codepool]/Training/Distributor/Block/Adminhtml/Distributor/Grid.php

  2. La classe définie dans Grid.phpcontient une faute de frappe

Alan Storm
la source
1

Le nom $this->_blockGroupest très déroutant mais il doit s'agir du nom du dossier et non du module. Dans votre cas, je pense que ça devrait être$this->_blockGroup = 'distributor';

Si vous regardez Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbolcomme un exemple, le blockGroup est le nom du dossier et non le nom du module dans le config.xml

// Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbol
$this->_blockGroup = 'currencysymbol_system';
David Manners
la source
Merci pour votre suggestion, je l'ai essayé mais sans succès.
tony09uk
as-tu essayé distributor_distributor?
David Manners
Après l'exemple que vous avez suggéré, j'ai essayé "training_distributor", "distributeur", "distributeur_distributor", "training_distributor_distributor"
tony09uk
@DavidManners +1 pour votre ça marche pour moi ... merci ...
Keyur Shah
0

Vérifiez une fois de plus la structure de votre dossier pour vous assurer que tous les fichiers se trouvent au bon chemin.

Dans mon cas pour ce problème, le fichier a été placé au mauvais endroit. J'ai placé le Grid.phpdans controller/Adminhtmlplutôt dossierBlock/Adminhtml/Grid.php

devJsha
la source
Les conventions de dénomination sont très importantes. Donc, tout en nommant votre espace de noms et vos modules, assurez-vous qu'ils sont corrects et conformes aux normes de magento ...
devJsha
0

Vérifiez votre chemin d'accès au fichier distributeur.xml. Il doit être placé dans app / design / adminhtml / default / default / layout / distribution.xml.

Dans le code lié à config.xml que vous avez publié, montrez que

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

plutôt que cela, il devrait être comme ça

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

et le fichier doit être placé dans app / design / adminhtml / default / default / layout / distribution.xml

Essayez de faire cela si ce n'est pas votre scénario actuel.

devJsha
la source