我一直在寻找一个模块或方法来处理这种情况:
客户订购100美元的产品并支付10美元的运费.这将使他收取总额110美元.到产品到货时,他注意到产品有点划伤,而不是发回产品,他接受折扣.
为了正确发生这种情况,我会制作一份贷项通知单,其中包括30美元的调整退款.
我需要在报告或销售仪表板的单独列中查看完成此操作后剩余的总金额(80美元).
对于这个特殊的任务,我们还安装了一个名为"Iksanika的高级订单管理器"的模块,但这似乎只能获取数据库中已经存在的数据,并且不允许我们使用变量来代替减法.
同样在Magento报告中我们使用报告>销售>订单,但这只给我们总数,我们找不到任何"收取的总金额",这将给我们确切的最终数字(80美元).
这是在线商店的会计dpt的特殊要求.
您想要做的是将自定义网格列添加到销售订单网格中。
Magento 使用数据库表sales_flat_order来填充销售订单网格中的值。不幸的是,sales_flat_order表没有提供您需要的信息(grandtotal 减去退款金额),而是分别提供两个值(grand_total 和total_refunded)。因此,您有多种选择:
正如这个世界上的一切一样,这两种方法都有优点和缺点。
如果扩展 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()中,您首先要添加父类中的列。最后,添加您的自定义列:
注意:您可以下载示例模块。
$this->addColumn('my_column', array(
'header' => Mage::helper('sales')->__('My Column'),
'index' => 'my_column',
'type' => 'text',
'renderer' => 'XX_ModuleName_Block_Adminhtml_Order_Grid'
));
Run Code Online (Sandbox Code Playgroud)
示例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>
Run Code Online (Sandbox Code Playgroud)
自定义销售订单网格块示例:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
第 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;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以下载示例模块。