เพิ่มคอลัมน์ใหม่ไปที่ sales_flat_order_grid


14

ฉันจะเพิ่มคอลัมน์ใหม่ลงในsales_flat_order_gridตารางและตรวจสอบให้แน่ใจว่ามีการแทรกค่าอย่างถูกต้องได้อย่างไร

"การที่มา" สำหรับคอลัมน์ใหม่เป็นคอลัมน์ที่กำหนดเองที่เราได้เพิ่มการให้เรียกว่าsales_flat_order fooAFAICT มีสามวิธีที่fooจะปรากฏในตารางคำสั่งซื้อหลัก:

  1. JOINคอลเลกชันบน sales_flat_order_gridsales_flat_order
    • ปัญหา:ตัวกรองไม่ทำงานอีกต่อไปเนื่องจากคอลัมน์ที่ไม่ชัดเจน (เนื่องจากทั้งสองตารางมีชื่อคอลัมน์ที่คล้ายกัน)
  2. มีการใช้ตารางข้อมูลแทน sales_flat_ordersales_flat_order_grid
    • ปัญหา:คอลัมน์ไม่ได้ถูกจัดทำดัชนีดังนั้นการกรองช้ามาก ดูเหมือนว่าโง่ที่จะเพิ่มดัชนีข้อมูลเดียวกันที่จัดทำดัชนีไว้ในsales_flat_order_gridตารางที่ไม่ได้ใช้
  3. เพิ่มคอลัมน์ใหม่ไปที่ sales_flat_order_grid ให้แน่ใจว่ามีการอัปเดตค่าที่นั่น

ฉันไม่สามารถทราบได้ว่าsales_flat_order_gridมีการอัปเดตอย่างไรฉันจึงไม่รู้วิธีเพิ่มคอลัมน์ใหม่นี้ ความคิดใด ๆ

คำตอบ:


18

sales_flat_order_gridตารางมีการปรับปรุงในทุกคำสั่งบันทึกการกระทำ คุณสามารถเพิ่มคอลัมน์ที่กำหนดเองลงในตารางในส่วนขยายของคุณเองหากคุณเพิ่มชื่อคอลัมน์ที่ใช้ในตาราง sales_flat_order แล้วคุณไม่จำเป็นต้องเพิ่มอะไรเพิ่มเติมในทุก ๆ การดำเนินการตามคำสั่งบันทึกคอลัมน์จะถูกอัพเดต (ถ้าจำเป็น) . หากคุณต้องการแทรกข้อมูลจากตารางอื่นคุณจะต้องสร้างผู้สังเกตการณ์สำหรับsales_order_resource_init_virtual_grid_columnsเหตุการณ์เพื่อรวบรวมและเตรียมการเข้าร่วม

สำหรับรายละเอียดเพิ่มเติมและตัวอย่างการใช้งานดูคำตอบของฉันใน เพิ่มคอลัมน์ลงในกริด (ผู้สังเกตการณ์) - คอลัมน์ 'store_id' ในกรณีที่คำสั่งย่อยมีปัญหาที่ไม่ชัดเจน


คุณแน่ใจหรือว่าการอัปเดตนี้ใช้ชื่อคอลัมน์เท่านั้น ในกรณีของฉันมันไม่ทำงานจนกว่าฉันจะลบและสร้างแอตทริบิวต์ใหม่ด้วย "grid" => จริง เพียงแค่เปลี่ยนทั้งสองตารางเพื่อเพิ่มคอลัมน์ที่เหมือนกันไม่เพียงพอและไม่ได้เรียก updateAttribute () บนแอตทริบิวต์ที่มีอยู่ (ฉันได้ความคิดจากคำถามนี้: stackoverflow.com/a/11254067/884734 )
Eric Seastrand

ด้วยแอ็ตทริบิวต์ grid = true สคริปต์การตั้งค่าจะสร้าง attribue โดยใช้ตาราง slas_flat_order และตาราง sales_flat_order_grid สิ่งนี้จะทำให้การอัปเดตคำสั่งซื้อบันทึกลงในทั้งสองตาราง
Vladimir Kerkhoff

9

ฉันทำสิ่งเดียวกัน เพิ่มฟิลด์ 'order_type' ตามลำดับและแสดงในตาราง มันทำงานได้อย่างสมบูรณ์แบบใน Magento ver 1.7.0.2

วิธีเพิ่มฟิลด์ประเภทคำสั่งในตารางคำสั่งขายในผู้ดูแลระบบ?

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) สร้างเหตุการณ์ผู้สังเกตการณ์หนึ่งเหตุการณ์เพื่อเพิ่ม / อัปเดตค่าฟิลด์ประเภทคำสั่ง

เปิดโมดูล / 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

<?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.