您要做的是将自定义网格列添加到销售订单网格。
Magento 使用数据库表 sales_flat_order 来填充销售订单网格中的值。不幸的是,sales_flat_order 表没有提供您需要的信息(grandtotal 减去退款金额),而是分别提供了两个值(grand_total 和 total_refunded)。因此,您有多种选择:
-
扩展表格 sales_flat_order。
- 为您的自定义销售订单网格列添加自定义渲染器。
正如世界上的一切一样,这两种方法都有优点和缺点。
如果您扩展 sales_flat_order 表,您必须确保在创建新订单时设置新数据库列的值。另一方面,由于值保留在数据库中,您可以将该列用于其他扩展。
使用自定义渲染器,您不必关心持久性。您有机会进行操作并返回您的结果,该结果将显示在您的自定义销售订单网格列中。由于我们已经保存了 grand_total 和 total_refunded,您可以退还总计减去退款的金额。
我将介绍如何添加自定义销售订单网格列并添加自定义渲染器以返回总计减去退款金额的值。
第 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() 中,您要首先添加父类中的列。最后,添加您的自定义列:
注意:您可以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 部分:如何为我的自定义列添加自定义渲染器?
现在您可以添加自定义渲染器以将值填充到自定义销售订单网格列中。
首先添加一个自定义渲染器类XX_ModuleName_Block_Adminhtml_Sales_Order_Grid_Widget_Renderer_MyColumn。
然后扩展Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract。
覆盖 render(Varien_Object $row) 方法。在这里,您可以执行特定操作并返回应在网格中显示的字符串。在您的情况下,您想加载当前 $row 参数的订单集合,获取总退款金额,用退款金额减去总计并返回值。
示例自定义渲染器块:
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。