将自定义列添加到 Magento 报告和销售仪表板

Add custom column to Magento report and sales dashboard

我一直在寻找一个模块或一种方法来处理休闲情况:

一位客户订购了价值 100 美元的产品并支付了 10 美元的运费。这将向他收取总计 110 美元的费用。当产品到达时,他注意到产品有一点划痕,因此他没有退货,而是接受了折扣。

为了让这一切顺利进行,我会制作一个贷项通知单,其中包含 30 美元的调整退款。

我需要在报告或销售仪表板的单独列中查看此操作完成后剩余的总金额 (80$)。

对于这个特定的任务,我们还安装了一个名为 "Advanced Orders Manager by Iksanika" 的模块,但这似乎只能获取数据库中已经存在的数据,并且不允许我们使用变量来进行减法。

同样在 Magento 报告中,我们使用“报告”>“销售”>“订单”,但这只给了我们总数字,我们无法在任何地方找到 "total amount charged" 可以给我们确切的最终数字(80 美元)。

这是在线商店会计部门的特殊要求。

您要做的是向销售订单网格添加自定义网格列。

Magento 使用数据库 table sales_flat_order 来填充销售订单网格中的值。不幸的是,sales_flat_order table 没有提供您需要的信息(总计减去退款金额),而是分别提供两个值(grand_total 和 total_refunded).因此,您有多种选择:

  • 扩展 table sales_flat_order.
  • 为您的自定义销售订单网格列添加一个自定义渲染器

世间万事万物,各有利弊。

如果您扩展 sales_flat_order table,您必须确保在创建新订单时设置新数据库列的值。另一方面,由于该值保存在您的数据库中,您可以将该列用于其他扩展。

使用自定义渲染器,您不必关心持久性。您有机会进行操作,return 您的结果将显示在您的自定义销售订单网格列中。由于我们已经保存了 grand_total 和 total_refunded,您可以 return 总计减去退款金额。

我将介绍如何添加自定义销售订单网格列并向 return grandtotal 减去退款金额的值添加自定义渲染器。

第 1 部分:如何在后端向销售订单网格添加自定义列?

要向销售订单网格添加自定义列,请先添加您自己的销售订单网格块XX_ModuleName_Block_Adminhtml_Order_Grid.

重写 magentos *Mage_Adminhtml_Block_Sales_Order_Grid (app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php) 并使用您的销售订单网格对其进行扩展。

添加自定义列重写 _prepareColumns() 方法。在覆盖的 _prepareColumns() 中,您想首先添加来自父 class 的列。最后,添加您的自定义列:

注意:您可以download the example module

$this->addColumn('my_column', array(
    'header' => Mage::helper('sales')->__('My Column'),
    'index' => 'my_column',
    'type' => 'text',
    'renderer'  => 'XX_ModuleName_Block_Adminhtml_Order_Grid'
));

例子etc/config.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <EG_AdminSalesOrder>
            <version>1.0.0</version>
        </EG_AdminSalesOrder>
    </modules>
    <global>
        <blocks>
            <eg_adminsalesorder>
                <class>EG_AdminSalesOrder_Block</class>
            </eg_adminsalesorder>
            <adminhtml>
                <rewrite>
                    <sales_order_grid>EG_AdminSalesOrder_Block_Adminhtml_Order_Grid</sales_order_grid>
                </rewrite>
            </adminhtml>
        </blocks>
        <helpers>
            <eg_adminsalesorder>
                <class>EG_AdminSalesOrder_Helper</class>
            </eg_adminsalesorder>
        </helpers>
    </global>
</config>

示例自定义销售订单网格块:

class EG_AdminSalesOrder_Block_Adminhtml_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid
{
    /**
     * Add custom column to sales order grid
     *
     * @return Mage_Adminhtml_Block_Widget_Grid
     * @throws Exception
     */
    protected function _prepareColumns()
    {
        $this->addColumn('real_order_id', array(
            'header'=> Mage::helper('sales')->__('Order #'),
            'width' => '80px',
            'type'  => 'text',
            'index' => 'increment_id',
        ));

        if (!Mage::app()->isSingleStoreMode()) {
            $this->addColumn('store_id', array(
                'header'    => Mage::helper('sales')->__('Purchased From (Store)'),
                'index'     => 'store_id',
                'type'      => 'store',
                'store_view'=> true,
                'display_deleted' => true,
            ));
        }

        $this->addColumn('created_at', array(
            'header' => Mage::helper('sales')->__('Purchased On'),
            'index' => 'created_at',
            'type' => 'datetime',
            'width' => '100px',
        ));

        $this->addColumn('billing_name', array(
            'header' => Mage::helper('sales')->__('Bill to Name'),
            'index' => 'billing_name',
        ));

        $this->addColumn('shipping_name', array(
            'header' => Mage::helper('sales')->__('Ship to Name'),
            'index' => 'shipping_name',
        ));

        $this->addColumn('base_grand_total', array(
            'header' => Mage::helper('sales')->__('G.T. (Base)'),
            'index' => 'base_grand_total',
            'type'  => 'currency',
            'currency' => 'base_currency_code',
        ));

        $this->addColumn('grand_total', array(
            'header' => Mage::helper('sales')->__('G.T. (Purchased)'),
            'index' => 'grand_total',
            'type'  => 'currency',
            'currency' => 'order_currency_code',
        ));


        $this->addColumn('refunded', array(
            'header' => Mage::helper('sales')->__('Total - Refund'),
            'index' => 'refunded',
            'type' => 'text',
            'renderer'  => 'EG_AdminSalesOrder_Block_Adminhtml_Sales_Order_Grid_Widget_Renderer_Refunded'
        ));

        parent::_prepareColumns();
    }
}

第 2 部分:如何为我的自定义列添加自定义渲染器?

现在您可以添加自定义呈现器以将值填充到您的自定义销售订单网格列中。

首先添加自定义渲染器classXX_ModuleName_Block_Adminhtml_Sales_Order_Grid_Widget_Renderer_MyColumn.

然后扩展Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract.

覆盖 render(Varien_Object $row) 方法。在这里你可以做你的特定操作和 return 应该在你的网格中显示的字符串。在您的情况下,您想要加载当前 $row 参数的订单集合,获取总退款金额,减去总计退款金额和 return 价值。

示例自定义渲染器块:

class EG_AdminSalesOrder_Block_Adminhtml_Sales_Order_Grid_Widget_Renderer_Refunded
    extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
{
    /**
     * @param Varien_Object $row
     * @return string
     */
    public function render(Varien_Object $row)
    {
        $currentOrderId = $row->getId();
        $currentOrderGrandTotal = $row->getGrandTotal();

        $orderCollection = Mage::getModel('sales/order')->getCollection();
        $orderCollection->addFieldToSelect('total_refunded');
        $orderCollection->addFieldToFilter('entity_id', array('eq' => $currentOrderId));
        $orderCollectionItem = $orderCollection->getFirstItem();
        $refundedAmount = $orderCollectionItem->getTotalRefunded();

        $grandTotalWithoutRefundedAmount = (float)$currentOrderGrandTotal - (float)$refundedAmount;
        $grandTotalWithoutRefundedAmount = Mage::helper('core')->currency($grandTotalWithoutRefundedAmount);

        return (string)$grandTotalWithoutRefundedAmount;
    }
}

你可以download the example module.