sales_flat_order_gridに新しい列を追加します


14

sales_flat_order_gridテーブルに新しい列を追加して、値が適切に挿入されるようにするにはどうすればよいですか?

新しい列の「ソース」は、追加したカスタム列です。sales_flat_orderこれを呼び出しましょうfoo。AFAICT、fooメインオーダーグリッドに表示する方法は3つあります。

  1. JOIN上のsales_flat_order_gridコレクションsales_flat_order
    • 問題:あいまいな列のためにフィルターが機能しなくなりました(両方のテーブルの列名が似ているため)
  2. グリッドのsales_flat_order代わりにデータを使用しますsales_flat_order_grid
    • 問題:列はインデックス付けされていないため、フィルタリングは非常に遅くなります。未使用のsales_flat_order_gridテーブルでインデックス付けされた同じデータにインデックスを追加するのはばかげているようです。
  3. 新しい列を追加し、 sales_flat_order_grid そこに値が更新されることを確認します

どのようsales_flat_order_gridに更新されているのかわからないため、この新しい列を追加する方法がわかりません。何かご意見は?

回答:


17

sales_flat_order_gridテーブルは、アクションの保存すべてのために更新されます。独自の拡張機能でテーブルにカスタム列を追加できます。sales_flat_orderテーブルで既に使用されている列名を追加する場合、追加の必要はありません。注文保存アクションごとに列が更新されます(必要な場合) 。別のテーブルからデータを挿入する場合は、sales_order_resource_init_virtual_grid_columnsイベントの結合を収集して準備するためのオブザーバーを作成する必要があります。

詳細と実際の例については、グリッドへの列の追加(オブザーバー)-where句の列 'store_id'の私の回答を参照してください


この更新が列名のみに基づいていることは確かですか?私の場合、「grid」=> trueで属性を削除して再作成するまで機能しませんでした。両方のテーブルを変更して同一の列を追加するだけでは不十分であり、既存の属性でupdateAttribute()を呼び出すこともできませんでした。(この質問からアイデアを得た:stackoverflow.com/a/11254067/884734
エリックイーストランド

grid = true属性を使用して、セットアップスクリプトは、slas_flat_orderおよびsales_flat_order_gridテーブルに属性を作成します。これにより、注文の更新により両方のテーブルに保存されます。
ウラジミールケルホフ

9

私も同じことをしました。「order_type」フィールドを順番に追加し、グリッドに表示しました。Magento ver 1.7.0.2で完全に動作しています

管理者の販売注文グリッドに注文タイプフィールドを追加する方法は?

1)以下のコードで1つのインストールsqlファイルを作成する必要があります。

<?php 
/* @var $installer Mage_Sales_Model_Entity_Setup */
$installer = $this;
$installer->startSetup();
$installer->run(" 
ALTER TABLE `{$installer->getTable('sales/order')}` ADD `order_type` VARCHAR(255) NOT NULL;
ALTER TABLE `{$installer->getTable('sales/order_grid')}` ADD `order_type` VARCHAR(255) NOT NULL;
ALTER TABLE `{$installer->getTable('sales/quote')}` ADD `order_type` VARCHAR(255) NOT NULL; 
");
$installer->endSetup();
?>

2)Mage_Adminhtml_Block_Sales_Order_Gridファイルをオーバーライドし、その中に以下のコードを追加します。

<?php

class Mycompany_Mymodule_Block_Adminhtml_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid
{
    protected function _prepareColumns()
    {

        $options = array(
        'ordertypeID1' => 'order type label1',
        'ordertypeID2' => 'order type label2',
        'ordertypeID3' => 'order type label3',
        ); 
        $this->addColumn('order_type', array(
            'header'    =>  Mage::helper('customer')->__('Order Type'),
            'width'     =>  '100',
            'index'     =>  'order_type',
            'type'      =>  'options',
            'options'   =>   $options
        ));
        $this->addColumnsOrder('order_type', 'grand_total');
        return parent::_prepareColumns();
    }
}
?>

3)1つのオブザーバーイベントを作成して、注文タイプフィールド値を追加/更新します

module / etc / config.xmlを開きます

<config>
    <adminhtml> 
         <events>
            <adminhtml_sales_order_create_process_data>
                <observers>
                    <modulename>
                        <class>Mycompany_Mymodule_Model_Adminhtml_Observer</class>
                        <method>adminhtml_sales_order_create_process_data</method>
                    </modulename>
                </observers>
            </adminhtml_sales_order_create_process_data>
            <sales_convert_quote_to_order>
                <observers>
                    <modulename>
                        <type>model</type>
                        <class>Mycompany_Mymodule_Model_Adminhtml_Observer</class>
                        <method>sales_convert_quote_to_order</method> 
                    </modulename>
                </observers>
            </sales_convert_quote_to_order>
        </events>  
    </adminhtml>
</config>

4)クラスMycompany_Mymodule_Model_Adminhtml_Observerのオブザーバーファイルを1つ作成します

<?php
class Mycompany_Mymodule_Model_Adminhtml_Observer 
{
    public function adminhtml_sales_order_create_process_data(Varien_Event_Observer $observer)
    { 
        try {
            $requestData = $observer->getEvent()->getRequest();

            if (isset($requestData['order']['order_type'])) {
                $observer->getEvent()->getOrderCreateModel()->getQuote()
                    ->addData($requestData['order']) 
                    ->save();
            } 

        } catch (Exception $e) {
            Mage::logException($e);
        }
        return $this;
    }


    /** 
     *
     * @param Varien_Event_Observer $observer
     * @return Mycompany_Mymodule_Model_Adminhtml_Observer
     */
    public function sales_convert_quote_to_order(Varien_Event_Observer $observer)
    {
        if ($ordertype = $observer->getEvent()->getQuote()->getOrderType()) {
            try {  
                $observer->getEvent()->getOrder()
                    ->setOrderType($ordertype);

            } catch (Exception $e) {
                Mage::logException($e);
            }
        }       

        return $this;
    }
}
?>

2

次の同様のコードを使用しました。それはうまく機能しています。

$installer = $this;
$installer->startSetup();

$installer->run("ALTER TABLE  sales_flat_order ADD COLUMN barcode  VARCHAR(255) NOT NULL;");

$installer->run("ALTER TABLE  sales_flat_order_grid ADD COLUMN barcode  VARCHAR(255) NOT NULL;");

$installer->run("ALTER TABLE  sales_flat_quote ADD COLUMN barcode  VARCHAR(255) NOT NULL;");

$installer->endSetup();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.