4

テーブルにカスタム属性を追加しました。sales_order_flatこの属性を のグリッドに表示しようとしていますsales_order/index

顧客属性でこれを正常に実行しましたが、注文データで同じことをしようとするとエラーが発生します。

<global>
    <blocks>
        <adminhtml>
            <rewrite>
                <sales_order_grid>WACI_AdminHtmlExt_Block_Sales_Order_Grid</sales_order_grid>
            </rewrite>
        </adminhtml>
    </blocks>
 <!-- etc  -->

アプリ/コード/ローカル/名前空間/モジュール/ブロック/販売/注文/Grid.php

class WACI_AdminHtmlExt_Block_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid
{

    protected function _prepareColumns()
    {

        $this->addColumn('dynamics_ord', array(
            'header'    => $this->__('Dynamics ID'),
            'width'     => '75px',
            'index'     => 'dynamics_ord',
        ));

        $this->addColumnsOrder('dynamics_ord','entity_id');

        return parent::_prepareColumns();
    }
}

時々使用されること_prepareCollectionがわかりますが、他に何もないとしても、単純さのためにコレクションを修正しようとしています。setCollection

いずれにせよ、列は表示されますが、データは生成されません。(そして、ソートしようとするとページがエラーになります)。

これに関するアイデアはありますか?

アップデート

この投稿は、モジュールの現在のステータスに合わせて更新したこの SO スレッドの拡張です。つまり、 と の両方sales_flat_orderに列を追加していますsales_flat_order_grid

その投稿から、この属性値を設定するために行われるアクションがあります (注文が完了した後)。

この時点での私の質問は、どのようupdateGridRecords()に機能するのですか?

=> $order->save() が呼び出されると、updateGridRecords が自動的に呼び出されるように見えます (注文が完了した後に手動で行っていること)。

他のモデルからデータを取得していないため、これを正しく理解していれば、_prepareColumns必要なのは呼び出しだけです。

=>はい。属性が保存された後、適切に表示およびソートされます。勝つ!

4

2 に答える 2

4

顧客コレクションと注文グリッドコレクションの違いは、顧客コレクションはMage_Eav_Model_Entity_Collection_Abstractから派生し、sales_flat_order_gridコレクションはEAVではないMage_Sales_Model_Resource_Abstractから派生することです。

そのため、通常EAVで実行できるように、選択する属性を追加することはできません。使用するすべての属性は、フラットテーブルのテーブル列として表す必要があります。

呼び出している関数addAttributeToSelectは、Mage_Sales_Model_Resource_Collection_Abstractクラスに実装され、バックグラウンドでaddFieldToSelectを使用するため、この場合、sales_flat_order_gridテーブルにdynamics_ordという名前の列が必要です。

属性値を注文EAVから注文グリッドに移動する関数はMage_Sales_Model_Resource_Order_Abstract::updateGridRecordsであり、この関数はsales_flat_order_gridテーブルの構造を読み取り、どの属性をsales_flat_order_gridテーブルに書き込む必要があるかを知るため、dynamics_ord列が欠落している場合はそれを追加する必要があります。モジュールのインストールスクリプト。

インストールスクリプトに列を追加してからグリッドに追加する方法について、このスタックオーバーフローソリューションに出くわしました。答えは少し時代遅れですが、うまくいくと思います。

また、注文グリッドで使用される属性を追加する方法について、これをすぐに使用できるソリューションであることがわかりましが、テストしていないため、機能するかどうかはわかりません。

于 2013-02-04T23:15:28.790 に答える
0

FLAT テーブルで結合 EAV テーブルを作成すると、グリッド内のデータをフィルタリングできません。私は以前に同じ問題に直面し、先輩と一緒に4日間投資しましたが、最終的に2つの結論に達しました....!!!

于 2013-02-05T06:07:20.203 に答える