setSaveParametersInSession () em um não-objeto

14

Estou entendendo setSaveParametersInSession() on a non-object

No módulo de administração, o caminho é

Training/Distributor/Block/Adminhtml/ nesta pasta eu tenho

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

Por que eu recebo esse erro?

Não vejo erros de digitação e tenho certeza que $ this -> _ blockGroup e $ this -> _ controller estão corretos.

Preciso procurar outras coisas? ou eu perdi alguma coisa?

Após uma pesquisa no google e na pilha, encontrei pessoas geralmente _blockGroup ou _controller, mas isso não parece ser o meu caso

===

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
fonte
Adicione seu config.xml arquivo também.
Marius
Por favor, veja edit
tony09uk
1
A configuração parece bem à primeira vista. Tente usar o __constructmétodo em vez de _construct.
Marius
Isso não funcionou #
11443 tony09uk

Respostas:

27

É difícil dizer com as informações que você forneceu, mas aqui está como eu depurava isso.

Você não mencionou em qual arquivo estava tendo esse problema, mas provavelmente é essa parte do contêiner da grade do widget base que é o seu 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();
}

o que significa que o Magento está tentando instanciar a classe de bloco

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

Ou no seu caso

createBlock('training_distributor/adminhtml_distributor_grid')

Por alguma razão, no seu sistema, o Magento não pode instanciar um objeto desse alias de classe, o que resulta no método de um erro que não é objeto.

Portanto, a primeira etapa é adicionar um código de depuração ao _prepareLayout

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

para garantir que o _blockGroupe_controller estão definidos corretamente.

Supondo que sejam, agora você está apenas depurando uma pesquisa de classe normal. Tente executar o código a seguir para ver qual classe PHP Magento acha que deve usar para o alias de sua classe

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

Olhando para a sua configuração, isso deve ser algo como

Training_Distributor_Block_Adminhtml_Distributor_Grid

Se $classestiver vazio ou falso, significa que há um erro no seu config.xmlarquivo. Você pode depurar isso saltando para o getGroupedClassNamemétodo

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

Este é o método em que o Magento faz referência à configuração mesclada e extrai um nome de classe.

Finalmente, se $class faz conter um nome de classe, significa carregador automático de Magento não consegue encontrar sua classe. Tente instanciar essa classe diretamente (novamente, como um exercício de depuração)

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

Você provavelmente receberá algum tipo de erro de classe não encontrado, ou porque

  1. Sua turma não está no local adequado (app/code/[codepool]/Training/Distributor/Block/Adminhtml/Distributor/Grid.php

  2. A classe definida em Grid.phppossui um erro de digitação

Alan Storm
fonte
1

O nome $this->_blockGroupé muito confuso, mas deve ser o nome da pasta e não o módulo. No seu caso, acho que deveria ser$this->_blockGroup = 'distributor';

Se você olhar Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbolcomo exemplo, blockGroup é o nome da pasta e não o nome do módulo no arquivo config.xml

// Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbol
$this->_blockGroup = 'currencysymbol_system';
David Manners
fonte
Obrigado pela sua sugestão, tentei, mas não obtive sucesso.
tony09uk
você tentou distributor_distributor?
precisa
Após o exemplo, você sugeriu que eu tentei 'training_distributor', 'distribuidor', 'distributor_distributor', 'training_distributor_distributor'
tony09uk
@DavidManners +1 para o seu ele trabalha para mim ... obrigado ...
Keyur Shah
0

Verifique a estrutura da pasta mais uma vez para garantir que todos os arquivos estejam localizados no caminho correto.

No meu caso para esse problema, o arquivo foi colocado no local errado. Eu coloquei a pasta Grid.phpna controller/Adminhtmlvez queBlock/Adminhtml/Grid.php

devJsha
fonte
Convenções de nomenclatura são muito importantes. Assim, enquanto a nomeação de seu namespace e módulos de se certificar de que eles estão corretos e de acordo com normas Magento ...
devJsha
0

Verifique seu caminho para o arquivo distributor.xml. Ele deve ser colocado em app / design / adminhtml / default / default / layout / distributor.xml.

No código relacionado ao config.xml que você postou, mostre que

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

ao invés disso, deve ser assim

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

e o arquivo deve ser colocado em app / design / adminhtml / default / default / layout / distributor.xml

Tente fazer isso se não for o seu cenário atual.

devJsha
fonte