0


1

Magentoカスタムバックエンドモジュールグリッドの並べ替え/フィルターの問題

カスタム属性に基づいて顧客のリストを表示するカスタム管理モジュールに取り組んでおり、グリッドは正常にロードされますが、グリッドを並べ替える/フィルタリングしようとするたびに問題が発生します。

これは私が得ているエラーです:

Fatal error:  Call to a member function toHtml() on a non-object in /***/***/public_html/***/app/code/local/BelVG/Events/controllers/CodesController.php on line 28

これは、CodesControllerファイルでエラーを引き起こすコードです。

public function customerGridAction() {
    $this->loadLayout();
    $this->getResponse()->setBody($this->getLayout()->getBlock('events.codes.edit.customer')->toHtml());
}
  • XMLレイアウトファイル*:


グリッドのクラスファイル:

class BelVG_Events_Block_Codes_Edit_Customer extends Mage_Adminhtml_Block_Widget_Grid
{

public function __construct() {
    parent::__construct();
    $this->setId('events_codes_edit_product');
    $this->setUseAjax(true);
    $this->setDefaultSort('entity_id');
    $this->setDefaultDir('asc');
    $this->setSaveParametersInSession(true);
}

protected function _prepareCollection()
{
    $current_code = Mage::registry('current_code');
    $code = $current_code->getCode();
    $collection = Mage::getResourceModel('customer/customer_collection')
        ->addNameToSelect()
        ->addAttributeToSelect('email')
        ->addAttributeToSelect('i_code')
        ->addAttributeToSelect('gender')
        ->addFieldToFilter('i_code', $code)
        ->joinAttribute('billing_postcode', 'customer_address/postcode', 'default_billing', null, 'left')
        ->joinAttribute('billing_city', 'customer_address/city', 'default_billing', null, 'left')
        ->joinAttribute('billing_telephone', 'customer_address/telephone', 'default_billing', null, 'left')
        ->joinAttribute('billing_region', 'customer_address/region', 'default_billing', null, 'left')
        ->joinAttribute('billing_country_id', 'customer_address/country_id', 'default_billing', null, 'left');

    $this->setCollection($collection);

    return parent::_prepareCollection();
}

 protected function _prepareColumns() {
    $this->addColumn('entity_id', array(
        'header'    => Mage::helper('customer')->__('ID'),
        'width'     => '50px',
        'index'     => 'entity_id',
        'type'  => 'number'
    ));
    $this->addColumn('name', array(
        'header'    => Mage::helper('customer')->__('Name'),
        'index'     => 'name'
    ));
    $this->addColumn('email', array(
        'header'    => Mage::helper('customer')->__('Email'),
        'width'     => '150',
        'index'     => 'email'
    ));
    $this->addColumn('Telephone', array(
        'header'    => Mage::helper('customer')->__('Telephone'),
        'width'     => '100',
        'index'     => 'billing_telephone'
    ));

    $this->addColumn('billing_postcode', array(
        'header'    => Mage::helper('customer')->__('ZIP'),
        'width'     => '90',
        'index'     => 'billing_postcode'
    ));

    $this->addColumn('billing_country_id', array(
        'header'    => Mage::helper('customer')->__('Country'),
        'width'     => '100',
        'index'     => 'billing_country_id'
    ));

    $this->addColumn('billing_region', array(
        'header'    => Mage::helper('customer')->__('State/Province'),
        'width'     => '100',
        'index'     => 'billing_region'
    ));

    $this->addColumn('gender', array(
        'header'    => Mage::helper('customer')->__('Gender'),
        'align'     => 'center',
        'index'     => 'gender'
    ));


    return parent::_prepareColumns();
}

public function getGridUrl() {
    return $this->getUrl('*/*/customergrid', array('_current'=> true));
}

}

このグリッドは最初に別のブロック(Edit.php)内で呼び出され、テンプレートファイルedit.phtmlから呼び出されます

  • Edit.phpブロッククラス*:

class BelVG_Events_Block_Codes_Edit extends Mage_Core_Block_Template {

    public function getGridHtml() {
        return $this->getChild('customer')->toHtml();
    }

}
  • edit.phtml内の顧客グリッドを呼び出すためのコード*:

            getGridHtml() ?>

私はこれがなぜ起こっているのか分かりません、コントローラーのブロック名とレイアウトファイルをダブルチェックし、一致しているようです、getBlock()の代わりにcreateBlock()を使用しようとしてブロックを直接ポイントファイルが、それでもまったく同じエラーを示しました。

誰かが私を正しい方向に向けることができますか?

1 Answer


0


あなたのモジュール/コントローラー/アクションのパスがどのように見えるかはわかりませんが、あなたはあなたのxmlで何か間違ったことをしたと言います:


これは言うべきだと思う


とにかく。 特定のブロックのhtmlを取得する場合、これは実際には必要ありません。 私がお勧めするのは、レイアウトクラスを使用してブロックを作成してから表示することです。

これは通常、すべてのグリッドブロックに対して機能します。これらのブロックには、クラス内で定義されたCollectionインスタンスがあるためです。

使用してみてください

$this->getResponse()->setBody($this->getLayout()->createBlock('events/codes_edit_customer')->toHtml());