使用Magento中的订单保存额外数据

时间:2010-12-06 19:38:26

标签: schema magento

我必须在订单页面添加一列,这意味着向sales_flat_order_grid添加一列。这两个都是可能的,但我不知道如何添加一个值,以便它保存在我的新列中。

我是否也必须注册一个新属性? 该值不在报价中,因此我想我不需要在config/global/fieldsets/sales_convert_quote下注册,因为该值不是要转换的。

使用Magento Enterprise 1.8。

3 个答案:

答案 0 :(得分:23)

经过大量的试验和错误 - 很多的错误 - 我想我现在有了。

首先在sales_flat_order_grid中更新Mage_Sales_Model_Mysql4_Order_Abstract::updateGridRecords(),按照我制定的路径检查“主”表(sales_flat_order)和主表+“_grid “(sales_flat_order_grid),获取其列的交集并从中构造查询。因此,网格表中所需的任何列也必须位于主表中。它不是EAV风格的实体,因此不需要创建属性 这是我的设置脚本:

<?php

/* @var $this Nexxt_Booth_Model_Entity_Setup */
$installer = $this;

$installer->getConnection()->addColumn($installer->getTable('sales_flat_order'), 'box_num', 'varchar(255)');
$installer->getConnection()->addColumn($installer->getTable('sales_flat_order_grid'), 'box_num', 'varchar(255)');

接下来,我需要在admin中的所有订单表中显示额外列。为此,我覆盖了每个相关的块。

<?xml version="1.0"?>
<config>
    ....

    <global>
        <blocks>
            <adminhtml>
                <rewrite>
                    <customer_edit_tab_view_orders>
                    <!-- Recent 5 orders on customer page -->
                        My_Module_Block_Adminhtml_Customer_Edit_Tab_View_Orders
                    </customer_edit_tab_view_orders>
                    <customer_edit_tab_orders>
                    <!-- All orders on customer tab -->
                        My_Module_Block_Adminhtml_Customer_Edit_Tab_Orders
                    </customer_edit_tab_orders>
                    <sales_order_grid>
                    <!-- All orders in Sales menu -->
                        My_Module_Block_Adminhtml_Sales_Order_Grid
                    </sales_order_grid>
                </rewrite>
            </adminhtml>
        </blocks>
    </global>
</config>

My/Module/Block/Adminhtml/Sales/Order/Grid.php我做了以下内容:

<?php

class My_Module_Block_Adminhtml_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid

    protected function _prepareColumns()
    {
        $this->addColumn('box_num', array(
            'header'    => $this->__('Box #'),
            'index'     => 'box_num',
            'width'     => '100px'
        ));
        $this->addColumnsOrder('box_num', 'shipping_name');
        return parent::_prepareColumns();
    }

}

同样,在My/Module/Block/Adminhtml/Customer/Edit/Tab/Orders.phpMy/Module/Block/Adminhtml/Customer/Edit/Tab/View/Orders.php中我添加了此功能:

    protected function _prepareColumns()
    {
        $this->addColumn('box_num', array(
            'header'    => $this->__('Box #'),
            'index'     => 'box_num',
            'width'     => '100px'
        ));
        $this->addColumnsOrder('box_num', (Mage::app()->isSingleStoreMode() ? 'grand_total' : 'store_id'));
        return parent::_prepareColumns();
    }

最后,为了完成,在事件sales_convert_quote_to_order中我填充了新字段。只要在保存订单之前的某个点添加数据,此位就不那么重要了。

$order->setBoxNum('DATA GOES HERE');

答案 1 :(得分:1)

您必须添加属性,最好的方法是通过扩展更新或设置脚本。由于订单和报价基于平面表结构,它实际上意味着向这些表添加更多字段

另见ALTER TABLE in Magento setup script without using SQL

答案 2 :(得分:0)

此外,你可以使用它来添加新的“属性”(实际上是一个列因为是平的),sales_flat和sales_flat_ _grid

$installer->addAttribute('order', 'box_num', array(
'label'    => 'Box Number',
'type'     => 'varchar',
'grid'     => true      // this is important
));

您的安装程序必须是:Mage_Sales_Model_Entity_Setup才能使用网格键。

请记住,如果要将sales_flat_order中存在的columnd添加到sales_flat_order_grid,则需要重新同步sales_flat_order_grid表:

In Magento, how do I populate a new column in sales_order_grid with data from sales_flat_order?