setSaveParametersInSession () en un no objeto

14

Me estoy poniendo setSaveParametersInSession() on a non-object

Está en un módulo de administración, la ruta es

Training/Distributor/Block/Adminhtml/ en esta carpeta tengo

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

¿Por qué recibo este error?

No puedo ver ningún error tipográfico y estoy seguro de que $ this -> _ blockGroup y $ this -> _ controller son correctos.

¿Hay otras cosas que necesito buscar? o me he perdido algo?

Después de una búsqueda en google y stack, he encontrado personas generalmente _blockGroup o _controller, pero este no parece ser el caso para mí

===

EDITAR

===

<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
fuente
Agregue su config.xml archivo también.
Marius
Ver edición
tony09uk
1
La configuración se ve bien a primera vista. Intenta usar el __constructmétodo en lugar de _construct.
Marius
eso no ha funcionado
tony09uk

Respuestas:

27

Es difícil decirlo con la información que proporcionó, pero así es como depuraría esto.

No mencionó en qué archivo estaba teniendo este problema, pero probablemente sea esta parte del contenedor de la cuadrícula de widgets base ese sea su 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();
}

lo que significa que Magento está tratando de instanciar la clase de bloque

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

O en tu caso

createBlock('training_distributor/adminhtml_distributor_grid')

Por alguna razón, en su sistema, Magento no puede crear instancias de un objeto de este alias de clase, lo que da como resultado que el método tenga un error que no sea de objeto.

Entonces, el primer paso es agregar un código de depuración a _prepareLayout

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

para asegurarse de que _blockGroupy _controllerestén configurados correctamente.

Suponiendo que lo sean, ahora solo está depurando una búsqueda de clase normal. Intente ejecutar el siguiente código para ver qué clase de PHP Magento cree que debería usar para su alias de clase

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

Echando un vistazo a su configuración, esto debería ser algo así como

Training_Distributor_Block_Adminhtml_Distributor_Grid

Si $classestá vacío o es falso, significa que tiene un error en su config.xmlarchivo. Puede depurar esto saltando al getGroupedClassNamemétodo.

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

Este es el método donde Magento hace referencia a la configuración fusionada y extrae un nombre de clase.

Por último, si $class lo hace contener un nombre de clase, significa cargador automático de Magento no puede encontrar su clase. Intente crear instancias de esta clase directamente (nuevamente, como un ejercicio de depuración)

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

Probablemente obtendrá algún tipo de error de clase no encontrada, ya sea porque

  1. Tu clase no está en la ubicación adecuada (app/code/[codepool]/Training/Distributor/Block/Adminhtml/Distributor/Grid.php

  2. La clase definida en Grid.phptiene un error tipográfico

Alan Storm
fuente
1

El $this->_blockGroupes un nombre muy confuso, pero debe ser el nombre de la carpeta y no el módulo. En tu caso, creo que debería ser$this->_blockGroup = 'distributor';

Si observa Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbolcomo ejemplo, blockGroup es el nombre de la carpeta y no el nombre del módulo en config.xml

// Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbol
$this->_blockGroup = 'currencysymbol_system';
David modales
fuente
Gracias por su sugerencia, lo he intentado pero no tuve éxito.
tony09uk
intentaste distributor_distributor?
David Manners
Después del ejemplo que sugirió, probé 'training_distributor', 'distribuidor', 'distributor_distributor', 'training_distributor_distributor'
tony09uk
@DavidManners +1 por tu me funciona ... gracias ...
Keyur Shah
0

Verifique la estructura de su carpeta una vez más para asegurarse de que todos los archivos estén ubicados en la ruta correcta.

En mi caso para este problema, el archivo se colocó en una ubicación incorrecta. Coloqué la carpeta Grid.phpen controller/Adminhtmllugar de esoBlock/Adminhtml/Grid.php

devJsha
fuente
Las convenciones de nomenclatura son muy importantes. Así, mientras que el nombramiento de su espacio de nombres y módulos de asegurarse de que son correctos y de acuerdo con las normas de Magento ...
devJsha
0

Verifique su ruta al archivo distribuidor.xml. Debe colocarse en app / design / adminhtml / default / default / layout / distributor.xml.

En el código relacionado con config.xml que publicaste, muestra que

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

en lugar de esto debería ser así

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

y el archivo debe colocarse en app / design / adminhtml / default / default / layout / distributor.xml

Intente hacer esto si no es su escenario actual.

devJsha
fuente