setSaveParametersInSession()在非对象上


14

我越来越 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是正确的。

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

在google和stack上搜索后,我发现通常是_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>

也添加您的config.xml 文件。
马吕斯

请查看编辑
tony09uk

1
乍一看配置看起来不错。尝试使用__constructmethod代替_construct
马吕斯

这没有奏效
tony09uk

Answers:


27

您提供的信息很难说,但这是我调试的方式。

您没有提到存在此问题的文件,但问题可能出在基本小部件网格容器的这一部分

#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无法从此类别名实例化对象,这将导致方法出现非对象错误。

因此,第一步是向其中添加一些调试代码 _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为空或false,则表示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有错字


1

$this->_blockGroup是一个非常混乱的名称,但它应该是文件夹名称,而不是模块。在你的情况下,我认为应该$this->_blockGroup = 'distributor';

如果Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbol以示例为例,blockGroup是文件夹名称,而不是config.xml中的模块名称。

// Mage_Currencysymbol_Block_Adminhtml_System_Currencysymbol
$this->_blockGroup = 'currencysymbol_system';

感谢您的建议,我已经尝试过,但是没有成功。
tony09uk 2013年

你尝试了distributor_distributor吗?
David Manners 2013年

例子之后,你建议我尝试“training_distributor”,“总代理”,“distributor_distributor”,“training_distributor_distributor”
tony09uk

@DavidManners +1对您有用,对我
有用

0

再检查一次文件夹结构,以确保所有文件都位于正确的路径。

对于我这个问题,文件放置在错误的位置。我把Grid.phpcontroller/Adminhtml文件夹中,而该Block/Adminhtml/Grid.php


命名约定非常重要。因此,在命名您的名称空间和模块时,请确保它们正确并符合magento标准……
devJsha 2014年

0

检查您的distributor.xml文件路径。应将其放在app / design / adminhtml / default / default / layout / distributor.xml中。

在与您发布的config.xml相关的代码中显示

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

而不是这个,应该是这样

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

并且文件应放在app / design / adminhtml / default / default / layout / distributor.xml中

如果不是您当前的情况,请尝试执行此操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.