【问题标题】:Add custom column to Magento report and sales dashboard将自定义列添加到 Magento 报告和销售仪表板
【发布时间】:2016-04-29 21:22:54
【问题描述】:

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

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

为了让这种情况正常发生,我会制作一个贷项通知单,其中包含 30 美元的调整退款。

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

对于这个特定任务,我们还安装了一个名为“Iksanika 的高级订单管理器”的模块,但这似乎只能获取数据库中已经存在的数据,并且不允许我们使用变量进行减法运算。

同样在 Magento 报告中,我们使用报告 > 销售 > 订单,但它只给我们提供了总数字,我们无法在任何地方找到可以为我们提供确切最终数字 (80 美元) 的“收取的总金额”。

这是网上商店会计部门的特殊要求。

【问题讨论】:

  • 您是想编写自己的解决方案还是只是在寻找扩展?
  • @Enigmativity 都可以

标签: magento report


【解决方案1】:

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

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

【讨论】:

  • 能否请您更新您的答案并指出需要编辑的文件的位置?
  • @mugur:我已经添加了文件路径,但请不要直接编辑核心文件。您需要按照此处所述用自己的方式重写核心块:inchoo.net/magento/…
  • 由于某种原因无法正常工作。在 Grid.php pastebin.com/GkRtxmiY 和 Renderer 文件夹 pastebin.com/fCgWGcc1 的新文件中添加了这个。日志很干净,所以没有语法错误,也没有任何逻辑问题。
  • 'renderer' 是显示数据所必需的。我相应地更新了答案。
  • @mugur 确切地说,那是缺失的。我已经更新了答案并添加了工作示例文件。
猜你喜欢
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
相关资源
最近更新 更多