【问题标题】:Saving extra data with an order in Magento在 Magento 中使用订单保存额外数据
【发布时间】:2011-05-21 04:36:46
【问题描述】:

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

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

使用 Magento Enterprise 1.8。

【问题讨论】:

    标签: schema magento


    【解决方案1】:

    经过多次尝试和错误 - 很多错误 - 我想我现在有了。

    首先sales_flat_order_gridMage_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');
    

    【讨论】:

    • 我正在尝试做同样的事情,我在sales_flat_order_grid 中创建了一个新列作为barcode_no 并使用Grid.php 在magento 订单网格中显示了该列。现在如何将 barcode_no 值从 magento 后端存储到 sales_flat_order_grid 表?
    • @ShujaatShaikh 您遇到了哪一点问题?
    • 找不到教程,解释如何从 magento 管理后端向我的 php 数据库插入自定义值。任何文章都会有很大帮助!
    • 我认为您想在订单视图页面中添加一个输入。这太复杂了,无法在这里解释。它本身就值得提出一个完整的问题。我建议从查看礼品消息框开始,并尝试了解它所需的所有内容。它在订单页面上有一个表单、一个 AJAX 脚本和一个更新订单的控制器。
    【解决方案2】:

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

    另见ALTER TABLE in Magento setup script without using SQL

    【讨论】:

      【解决方案3】:

      此外,您可以使用它向 sales_flat 和 sales_flat_ _grid 添加新的“属性”(at 确实是一列,因为它是平的)

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

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

      请记住,如果您要将现有列从 sales_flat_order 添加到 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?

      【讨论】:

      • 就我而言,我必须为此使用Mage_Sales_Model_Resource_Setup 类。使用 Mage_Sales_Model_Entity_Setup 类创建属性似乎什么也没做(没有创建新的 db 列,但也没有错误。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多