当前位置: 首页>>技术解读>>正文


non-object上的setSaveParametersInSession()

webfans 技术解读 , , 去评论

问题描述

我得到了setSaveParametersInSession() on a non-object

它位于管理模块的路径上

我有这个文件夹中的Training/Distributor/Block/Adminhtml/

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

为什么我会收到此错误?

我看不到任何拼写错误,我确定$ this-> _blockGroup和$ this-> _controller是对的。

还有其他我需要寻找的东西吗?还是我错过了什么?

在搜索谷歌和堆栈后我发现人们通常是_blockGroup或_controller,但这对我来说似乎不是这样的

===

编辑

===

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

最佳解决方法

很难说你提供的信息,但这是我如何调试这个。

您没有提到您遇到此问题的文件,但可能是基本窗口小部件网格容器的这部分是您的问题

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

这意味着Magento试图实例化块类

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

或者在你的情况下

createBlock('training_distributor/adminhtml_distributor_grid')

出于某种原因,在您的系统上,Magento无法从此类别名实例化对象,从而导致该方法出现non-object错误。

因此,第一步是向_prepareLayout添加一些调试代码

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

确保正确设置_blockGroup_controller

假设它们是,现在你只是调试正常的类查找。尝试运行以下代码,看看Magento认为它应该用于类别名的PHP类

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

看看你的配置,这应该是这样的

Training_Distributor_Block_Adminhtml_Distributor_Grid

如果$class为空或假,则表示您的config.xml文件中有错误。您可以通过跳转到getGroupedClassName方法来调试它。

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

这是Magento引用合并配置并提取类名的方法。

最后,如果$class确实包含类名,则意味着Magento的自动加载器无法找到您的类。尝试直接实例化此类(再次,作为调试练习)

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

你可能会得到某种类找不到的错误,因为

  1. 您的班级不在适当的位置(app/code/[codepool]/Training/Distributor/Block/Adminhtml/Distributor/Grid.php

  2. Grid.php中定义的类中有一个拼写错误

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2476.html,转载请务必附带本地址声明。