schema - 在 Magento 中通过订单保存额外数据

标签 schema magento

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

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

使用 Magento 企业版 1.8。

最佳答案

经过大量的反复试验 - 很多错误 - 我想我现在拥有它。

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');

关于schema - 在 Magento 中通过订单保存额外数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4370235/

相关文章:

Magento,向客户地址添加自定义属性

magento - magento 购物车页面中的 Paypal 付款标准?

xml - Spring Security XML 错误 - cvc-complex-type.2.4.a : Invalid content was found starting with element 'csrf'

mysql - Yii2 迁移以增加列长度

mySQL Schema 设计建议

html - Magento 的自定义 header

magento - nginx/varnish/magento - 更改端口时出现 500 错误

Git忽略除子文件夹以外的所有内容

sql - 错误 1826 : Duplicate foreign key constraint name

MySQL:需要架构帮助 - 如何处理列表?