在 Magento 中通过订单保存额外数据 [英] Saving extra data with an order in Magento
问题描述
我必须向订单页面添加一列,这意味着向sales_flat_order_grid
添加一列.这两个都是可能的,但我不知道如何添加一个值,以便将它保存在我的新列中.
I have to add a column to the orders page which means adding a column to sales_flat_order_grid
. Both of those are possible however I don't know how to add a value so that it gets saved in my new column.
我是否也必须注册一个新属性?
报价中不存在该值,所以我想我不需要在 config/global/fieldsets/sales_convert_quote
下注册,因为该值不存在要转换的地方.
Do I have to register a new attribute too?
The value is not present in the quote so I guess I don't need to register under config/global/fieldsets/sales_convert_quote
since the value isn't there to be converted.
使用 Magento Enterprise 1.8.
Using Magento Enterprise 1.8.
推荐答案
经过大量的反复试验 - 很多 的错误 - 我想我现在有它了.
After a lot of trial and error - a lot of error - I think I have it now.
首先在 Mage_Sales_Model_Mysql4_Order_Abstract::updateGridRecords()
中更新 sales_flat_order_grid
,按照我发现的路径,它会检查主"表(sales_flat_order
) 和主表 + "_grid" (sales_flat_order_grid
),获取它们列的交集并从中构造查询.因此,您需要在网格表中的任何列也必须在主表中.它不是 EAV 样式的实体,因此不需要创建属性.
这是我的设置脚本:
To begin with the sales_flat_order_grid
is updated in Mage_Sales_Model_Mysql4_Order_Abstract::updateGridRecords()
, by following the trail I worked out it inspects both the "main" table (sales_flat_order
) and the main table + "_grid" (sales_flat_order_grid
), takes the intersect of their columns and constructs a query from that. So any column you need in the grid table must also be in the main table. It's not an EAV-style entity so attributes don't need to be created.
Here is my setup script:
<?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 的所有订单表中显示额外的列.为此,我覆盖了每个相关块.
Next, I needed the extra column to show in all order tables in admin. To do this I overrode each relevant block.
<?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
中,我做了以下内容:
In My/Module/Block/Adminhtml/Sales/Order/Grid.php
I made the following:
<?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.php
和 My/Module/Block/Adminhtml/Customer/Edit/Tab/View/Orders.php
我加了这个功能:
Similarly, in My/Module/Block/Adminhtml/Customer/Edit/Tab/Orders.php
and My/Module/Block/Adminhtml/Customer/Edit/Tab/View/Orders.php
I added this function:
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
中,我填充了新字段.这一点并不重要,只要您在保存订单之前的某个时间点添加数据即可.
Finally, to finish off, in the event sales_convert_quote_to_order
I populated the new field. This bit isn't as important, so long as you add the data at a point before the order is saved.
$order->setBoxNum('DATA GOES HERE');
这篇关于在 Magento 中通过订单保存额外数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!