Thêm cột mới vào sales_flat_order_grid


14

Làm cách nào tôi có thể thêm một cột mới vào sales_flat_order_gridbảng và đảm bảo rằng các giá trị được chèn đúng vào đó?

"Nguồn" cho cột mới là cột tùy chỉnh mà chúng tôi đã thêm vào sales_flat_order, hãy gọi nó foo. AFAICT, có ba cách foođể xuất hiện trong lưới thứ tự chính:

  1. JOINcác sales_flat_order_gridbộ sưu tập lên sales_flat_order.
    • Vấn đề: Bộ lọc không còn hoạt động do các cột không rõ ràng (vì cả hai bảng có tên cột giống nhau)
  2. Có lưới sử dụng sales_flat_ordercho dữ liệu thay vì sales_flat_order_grid.
    • Vấn đề: Các cột không được lập chỉ mục, do đó quá trình lọc bị chậm một cách khủng khiếp. Có vẻ ngớ ngẩn khi thêm chỉ mục cùng một dữ liệu được lập chỉ mục trong sales_flat_order_gridbảng không sử dụng .
  3. Thêm một cột mới sales_flat_order_grid và đảm bảo cập nhật giá trị ở đó

Tôi không thể tìm ra cách sales_flat_order_gridcập nhật, do đó tôi không biết cách thêm cột mới này. Có suy nghĩ gì không?

Câu trả lời:


17

Các sales_flat_order_gridbảng được cập nhật tại mỗi đơn hàng tiết kiệm hành động. Bạn có thể thêm các cột tùy chỉnh vào bảng trong tiện ích mở rộng của riêng mình, nếu bạn thêm tên cột đã được sử dụng trong bảng sales_flat_order bạn không cần thêm bất cứ thứ gì, vào mỗi hành động lưu đơn hàng, các cột được cập nhật (nếu cần) . Nếu bạn muốn chèn dữ liệu từ một bảng khác, bạn sẽ cần tạo một người quan sát cho sales_order_resource_init_virtual_grid_columnssự kiện để thu thập và chuẩn bị tham gia.

Để biết thêm thông tin chi tiết và một ví dụ làm việc xem câu trả lời của tôi trong Add Column để một mạng lưới (quan sát viên) - Cột 'store_id' trong mệnh đề where là vấn đề nhập nhằng


Bạn có chắc chắn rằng bản cập nhật này chỉ dựa trên tên cột? Trong trường hợp của tôi, nó không hoạt động cho đến khi tôi xóa và tạo lại thuộc tính với "lưới" => true. Đơn giản chỉ cần THAY ĐỔI cả hai bảng để thêm một cột giống hệt nhau là không đủ, cũng không gọi updateAttribution () trên thuộc tính hiện có. (Tôi có ý tưởng từ câu hỏi này: stackoverflow.com/a/11254067/884734 )
Eric Seastrand

Với thuộc tính Grid = true, tập lệnh thiết lập sẽ tạo ra attribue inobith slas_flat_order và bảng sales_flat_order_grid. Điều này sẽ làm cho bản cập nhật của một đơn đặt hàng lưu nó vào cả hai bảng.
Vladimir Kerkhoff

9

Tôi đã làm điều tương tự. Đã thêm trường 'order_type' theo thứ tự và hiển thị nó trong lưới. Nó hoạt động hoàn hảo trong Magento ver 1.7.0.2

Làm cách nào để thêm trường Loại đơn hàng trong lưới đơn hàng trong admin?

1) Chúng ta phải tạo một tệp sql cài đặt với mã bên dưới.

<?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) Ghi đè tệp Mage_Adminhtml_Block_Sales_Order_Grid và thêm mã bên dưới vào đó.

<?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) Tạo một sự kiện quan sát để thêm / cập nhật giá trị trường loại đơn đặt hàng

Mở mô-đun của bạn / 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) Tạo một tệp quan sát của lớp 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;
    }
}
?>

2

Tôi đã sử dụng mã tương tự. Nó hoạt động tốt.

$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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.