0

Sales > Order Gridにフィールドを追加する単純なモジュールを作成しました。それはうまく機能しますが、問題は<rewrites>、注文グリッドを使用してフィールドをグリッドに追加している別のモジュールです。代わりにイベントを使用するように変更しようとしました(さらに、より良い方法です)...

問題は、私が試行錯誤してきたが、それを実現できないことです. (イベント/オブザーバーの概念がまだ理解できていないだけかもしれません...)

これが私の現在のモジュール構造です:

app/code/local/Artizara/OrderGridAdditions/
app/code/local/Artizara/OrderGridAdditions/Block/Sales/Order/Grid.php
app/code/local/Artizara/OrderGridAdditions/etc/config.xml
app/code/local/Artizara/OrderGridAdditions/controllers [empty]
app/code/local/Artizara/OrderGridAdditions/Helper [empty]
app/code/local/Artizara/OrderGridAdditions/Model [empty]

Grid.phpファイル内で、メインの Grid.php ファイルの内容を Grid.php ファイルにコピーし_getCollectionClass()_prepareCollection()および_prepareColumns()関数を編集しました。

を次のように変更しまし_getCollectionClass()た。

//return 'sales/order_grid_collection';
return 'sales/order_collection';

を次のように変更しまし_prepareCollection()た。

$collection = Mage::getResourceModel($this->_getCollectionClass());

$collection->getSelect()->joinLeft(array('sfog' => 'sales_flat_order_grid'),'main_table.entity_id = sfog.entity_id',array('sfog.shipping_name','sfog.billing_name'));
$collection->getSelect()->joinLeft(array('sfo'=>'sales_flat_order'),'sfo.entity_id=main_table.entity_id',array('sfo.customer_email','sfo.weight','sfo.discount_description','sfo.increment_id','sfo.store_id','sfo.created_at','sfo.status','sfo.base_grand_total','sfo.grand_total','shipping_description','sfo.total_item_count'));
$collection->getSelect()->joinLeft(array('sfoa'=>'sales_flat_order_address'),'main_table.entity_id = sfoa.parent_id AND sfoa.address_type="shipping"',array('sfoa.street','sfoa.city','sfoa.region','sfoa.postcode','sfoa.telephone'));
//$collection->getSelect()->joinLeft(array('sfop' => 'sales_flat_order_payment'),'main_table.entity_id = sfop.entity_id',array('sfop.method'));

$this->setCollection($collection);

return parent::_prepareCollection();

このように列を追加しました_prepareColumns()(ここでは例として1つだけ追加しました):

$this->addColumn('total_item_count', array(
            'header' => Mage::helper('sales')->__('Total Items'),
            'index' => 'total_item_count',
            'filter_index' => 'sfo.total_item_count',
            'width' => '50px',
    ));

私のconfig.xmlファイルには単純なものがあります<rewrite>

<modules>
    <Artizara_OrderGridAdditions>
        <version>0.1.0</version>
    </Artizara_OrderGridAdditions>
</modules>

<global>
    <blocks>
        <adminhtml>
            <rewrite>
                <sales_order_grid>Artizara_OrderGridAdditions_Block_Sales_Order_Grid</sales_order_grid>
            </rewrite>
        </adminhtml>
        <ordergridadditions>
            <class>Artizara_OrderGridAdditions_Block</class>
        </ordergridadditions>
    </blocks>

</global>

イベント/オブザーバーに変更する

これをイベントを使用するモジュールに変更するために多くのことを試みてきましたが、それで壁にぶつかっています。私はここで他のいくつかの回答に従おうとしています(書き換えではないものですが、データベースからグリッドにカスタムテーブルを追加するために別の方法を使用しています)。私はすでに持っているのと同じセットアップを使用しようとしています。

/Helper/Data.phpこれを含むコンテナを追加しました:

class Artizara_OrderGridAdditions_Helper_Data extends Mage_Core_Helper_Abstract{ }

/etc/config.xml私は多くのことを試しました。これが私の最新の試みです:

<modules>
    <Artizara_OrderGridAdditions>
        <version>0.1.0</version>
    </Artizara_OrderGridAdditions>
</modules>

<adminhtml>
    <events>
        <adminhtml_block_html_before>
            <observers>
                <Artizara_OrderGridAdditions_Observer>
                    <class>Artizara_OrderGridAdditions_Model_Observer</class>
                    <method>addAdditionsToGrid</method>
                </Artizara_OrderGridAdditions_Observer>
            </observers>
        </adminhtml_block_html_before>
    </events>
</adminhtml>

<global>


    <models>
        <Artizara_OrderGridAdditions>
            <class>Artizara_OrderGridAdditions_Model</class>
        </Artizara_OrderGridAdditions>
    </models>

    <blocks>
        <Artizara_OrderGridAdditions>
            <class>Artizara_OrderGridAdditions_Block</class>
        </Artizara_OrderGridAdditions>
    </blocks>

    <helper>
        <Artizara_OrderGridAdditions>
            <class>Artizara_OrderGridAdditions_Helper</class>
        </Artizara_OrderGridAdditions>
    </helper>


</global>

それから/Model/Observer.php私は持っています:

class Artizara_OrderGridAdditions_Model_Observer {

    public function addAdditionsToGrid(Varien_Event_Observer $observer) {
            // code here
        }
}

内部では、ファイル全体をコピーするなど、さまざまなことを試しaddAdditionsToGrid()ましたが、何も機能していないようです(エラー):(Grid.php

イベントを使用してこの単純なモジュールを作り直すのを手伝ってください!

4

1 に答える 1

1

イベント呼び出しがないため、Observers を使用して Sales Order Grid に列を追加する (良い) 方法はありません。Mage::dispatchEvent内部Mage_Adminhtml_Block_Sales_Order_Gridとすべてのスーパークラスを自分で調べてください。

ベスト プラクティスは、次のようにグリッド クラスを拡張することだと思います。

class Artizara_OrderGridAdditions_Block_Sales_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid {
    protected function _prepareColumns() {
        $this->addColumn(/* your definition here */);
    }
}

オブザーバーが本当にこれを行う必要がある場合は、adminhtml_block_html_beforeイベントを見て抜け道を掘ることができますが、多くのブロックがこのイベントを呼び出します。

于 2012-04-18T20:36:10.970 に答える