将新列添加到sales_flat_order_grid


14

如何将新列添加到sales_flat_order_grid表中,并确保在其中正确插入值?

新列的“源”是我们添加到的自定义列sales_flat_order,我们称之为foo。AFAICT,可以通过三种方式foo出现在主订单网格中:

  1. JOINsales_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不知道如何进行更新,因此我不知道如何添加此新列。有什么想法吗?

Answers:


18

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
Eric Seastrand 2015年

使用grid = true属性,安装脚本会在slas_flat_order和sales_flat_order_grid表中创建属性。这将使订单更新将其保存到两个表中。
弗拉基米尔·科克霍夫(Fladimir Kerkhoff),2015年

9

我做过同样的事情。按顺序添加了“ order_type”字段,并将其显示在网格中。它在Magento 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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.