问题描述
我得到了setSaveParametersInSession() on a non-object
它位于管理模块的路径上
我有这个文件夹中的Training/Distributor/Block/Adminhtml/
Distributor/Grid.php
和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();
}
}
为什么我会收到此错误?
我看不到任何拼写错误,我确定$ 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);
你可能会得到某种类找不到的错误,因为
-
您的班级不在适当的位置(
app/code/[codepool]/Training/Distributor/Block/Adminhtml/Distributor/Grid.php
-
Grid.php
中定义的类中有一个拼写错误