Tambahkan kolom baru ke sales_flat_order_grid

14

Bagaimana saya bisa menambahkan kolom baru ke sales_flat_order_gridtabel dan memastikan bahwa nilai dimasukkan dengan benar di sana?

"Sumber" untuk kolom baru adalah kolom khusus yang telah kami tambahkan sales_flat_order, sebut saja foo. AFAICT, ada tiga cara foountuk tampil di kisi pesanan utama:

  1. JOINyang sales_flat_order_gridkoleksi ke sales_flat_order.
    • Masalah: Filter tidak lagi berfungsi karena kolom ambigu (karena kedua tabel memiliki nama kolom yang sama)
  2. Minta grid menggunakan sales_flat_orderdata sebagai ganti sales_flat_order_grid.
    • Masalah: Kolom tidak diindeks, jadi penyaringan sangat lambat. Tampaknya konyol untuk menambahkan indeks data yang sama diindeks dalam sales_flat_order_gridtabel yang tidak digunakan .
  3. Tambahkan kolom baru ke sales_flat_order_grid dan pastikan pembaruan nilai di sana

Saya tidak tahu cara sales_flat_order_gridmemperbarui, oleh karena itu saya tidak tahu cara menambahkan kolom baru ini. Adakah pikiran?

Colin O'Dell
sumber

Jawaban:

17

The sales_flat_order_gridtabel diperbarui pada setiap order save tindakan. Anda dapat menambahkan kolom khusus ke tabel dalam ekstensi Anda sendiri, jika Anda menambahkan nama kolom yang sudah digunakan dalam tabel sales_flat_order Anda tidak perlu menambahkan apa-apa, pada setiap tindakan penyelamatan pesanan, kolom diperbarui (jika diperlukan) . Jika Anda ingin memasukkan data dari tabel yang berbeda, Anda perlu membuat pengamat untuk sales_order_resource_init_virtual_grid_columnsmengumpulkan dan menyiapkan acara.

Untuk detail lebih lanjut dan contoh yang berfungsi lihat jawaban saya di Tambahkan Kolom ke kisi (pengamat) - Kolom 'store_id' di mana klausa merupakan masalah ambigu

Vladimir Kerkhoff
sumber
Apakah Anda yakin bahwa pembaruan ini hanya didasarkan pada nama kolom? Dalam kasus saya, itu tidak berfungsi sampai saya menghapus dan membuat ulang atribut dengan "grid" => true. Cukup MENGUBAH kedua tabel untuk menambahkan kolom yang identik tidak cukup, juga tidak memanggil updateAttribute () pada atribut yang ada. (Saya mendapat ide dari pertanyaan ini: stackoverflow.com/a/11254067/884734 )
Eric Seastrand
Dengan kisi = atribut benar skrip penyetelan membuat attribue sesuai dengan slas_flat_order dan tabel sales_flat_order_grid. Ini akan membuat pembaruan pesanan menyimpannya ke kedua tabel.
Vladimir Kerkhoff
9

Saya telah melakukan hal yang sama. Menambahkan bidang 'order_type' secara berurutan dan ditampilkan dalam kisi. Ini berfungsi dengan baik di Magento ver 1.7.0.2

Bagaimana cara menambahkan bidang Jenis Pesanan dalam kisi pesanan penjualan di admin?

1) Kita harus membuat satu instal file sql dengan kode di bawah ini.

<?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) Ganti file Mage_Adminhtml_Block_Sales_Order_Grid dan tambahkan kode di bawah ini di dalamnya.

<?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) Buat satu peristiwa pengamat untuk menambah / memperbarui nilai bidang jenis pesanan

Buka modul Anda / 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) Buat satu file pengamat kelas Mycompany_Mymodule_Model_Adminhtml_Observer

<?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;
    }
}
?>
Bijal Bhavsar
sumber
2

Saya menggunakan kode berikut yang serupa. Ini bekerja dengan baik.

$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();
Praful Rajput
sumber