비 객체의 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가 올바른지 확신합니다.

내가 찾아야 할 다른 것들이 있습니까? 아니면 내가 놓친 것이 있습니까?

구글과 스택에서 검색 한 후 사람들이 일반적으로 _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 파일도 추가하십시오 .
Marius

편집 참조
tony09uk

1
구성은 언뜻보기에 좋아 보입니다. __construct대신 방법을 사용하십시오 _construct.
Marius

작동하지 않는
tony09uk

답변:


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는이 클래스 별명에서 오브젝트를 인스턴스화 할 수 없으므로 오브젝트가 아닌 오류에 대한 메소드가 생성됩니다.

1 단계는 디버깅 코드를 _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

당신은 시도 distributor_distributor했습니까?
David Manners

예 후에 당신은 내가 'training_distributor', '유통', 'distributor_distributor', 'training_distributor_distributor'시도 제안
tony09uk

@DavidManners +1 당신을 위해 그것은 작동 ... 감사합니다 ...
Keyur Shah

0

폴더 구조를 한 번 더 확인하여 모든 파일이 올바른 경로에 있는지 확인하십시오.

이 문제의 경우 파일이 잘못된 위치에 배치되었습니다. 나는 배치 Grid.phpcontroller/Adminhtml오히려 해당 폴더Block/Adminhtml/Grid.php


명명 규칙은 매우 중요합니다. 따라서 네임 스페이스와 모듈의 이름을 지정하는 동안 이름이 올 바르고 magento 표준을 준수하는지 확인하십시오.
devJsha

0

distribution.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에 있어야합니다.

현재 시나리오가 아닌 경우이 작업을 수행하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.