在Magento的1.7/1.12版本中更改仪表板图形


Change the Dashboard Graph in version 1.7/1.12 of Magento

在Magento的早期版本中(CE的1.6及之前版本,EE的1.11及之前版本),管理仪表板上的图表将反映所采取的总订单计数。自1.7/1.12以来,这已被更改为反映已开具发票的订单。我们使用自定义状态,并将仪表板图形作为快速心跳类型的销售报告。然而,由于我们处理后端订单处理的方式(不是通过Magento),我们的订单没有一个达到发票状态

我如何更改仪表板图形以报告订单的处理、发票和自定义状态?我们的自定义状态已经绑定到Processing,所以我可能只需要查询Processing和Invoiced。根据Magento支持这种修改是可能的,但我不确定从哪里开始寻找除了/app/design/Adminhtml/default/default/template/dashboard/graph。phtml文件。谢谢!

Oleg Ishenko的答案为你指出了正确的方向,但不是很全面。
1. 在您创建的模块中,您需要覆盖Mage_Reports_Model_Resource_Order_Collection:因此在config.xml中放置:

...
    <global>
        <models>
            <yourmodule>
                <class>Namespace_Yourmodule_Model</class>
            </yourmodule>
            <reports_resource>
                <rewrite>
                    <order_collection>Namespace_Yourmodule_Model_Reports_Resource_Order_Collection</order_collection>
                </rewrite>
            </reports_resource>
        </models>
    </global>
...

2。然后创建类(尊重路径),在这个类中你需要重写2个方法:

<?php
/**
 * Show all orders, not only the invoiced one
 */
class Namespace_Yourmodule_Model_Reports_Resource_Order_Collection extends Mage_Reports_Model_Resource_Order_Collection
{
    protected function _prepareSummaryLive($range, $customStart, $customEnd, $isFilter = 0)
    {
        $this->setMainTable('sales/order');
        $adapter = $this->getConnection();
        /**
         * Reset all columns, because result will group only by 'created_at' field
         */
        $this->getSelect()->reset(Zend_Db_Select::COLUMNS);
        $expression = sprintf('%s - %s - %s - (%s - %s - %s)',
            $adapter->getIfNullSql('main_table.base_total_invoiced', 0),
            $adapter->getIfNullSql('main_table.base_tax_invoiced', 0),
            $adapter->getIfNullSql('main_table.base_shipping_invoiced', 0),
            $adapter->getIfNullSql('main_table.base_total_refunded', 0),
            $adapter->getIfNullSql('main_table.base_tax_refunded', 0),
            $adapter->getIfNullSql('main_table.base_shipping_refunded', 0)
        );
        if ($isFilter == 0) {
            $this->getSelect()->columns(array(
                'revenue' => new Zend_Db_Expr(
                    sprintf('SUM((%s) * %s)', $expression,
                        $adapter->getIfNullSql('main_table.base_to_global_rate', 0)
                    )
                 )
            ));
        } else {
            $this->getSelect()->columns(array(
                'revenue' => new Zend_Db_Expr(sprintf('SUM(%s)', $expression))
            ));
        }
        $dateRange = $this->getDateRange($range, $customStart, $customEnd);
        $tzRangeOffsetExpression = $this->_getTZRangeOffsetExpression(
            $range, 'created_at', $dateRange['from'], $dateRange['to']
        );
        $this->getSelect()
            ->columns(array(
                'quantity' => 'COUNT(main_table.entity_id)',
                'range' => $tzRangeOffsetExpression,
            ))
            //BOF modification
//            ->where('main_table.state NOT IN (?)', array(
//                Mage_Sales_Model_Order::STATE_PENDING_PAYMENT,
//                Mage_Sales_Model_Order::STATE_NEW)
//            )
            //EOF modification
            ->order('range', Zend_Db_Select::SQL_ASC)
            ->group($tzRangeOffsetExpression);
        $this->addFieldToFilter('created_at', $dateRange);
        return $this;
    }
    protected function _calculateTotalsLive($isFilter = 0)
    {
        $this->setMainTable('sales/order');
        $this->removeAllFieldsFromSelect();
        $adapter = $this->getConnection();
        $baseTotalInvoiced    = $adapter->getIfNullSql('main_table.base_grand_total', 0);
        $baseTotalRefunded    = $adapter->getIfNullSql('main_table.base_discount_refunded', 0);
        $baseTaxInvoiced      = $adapter->getIfNullSql('main_table.base_tax_amount', 0);
        $baseTaxRefunded      = $adapter->getIfNullSql('main_table.base_tax_refunded', 0);
        $baseShippingInvoiced = $adapter->getIfNullSql('main_table.base_shipping_amount', 0);
        $baseShippingRefunded = $adapter->getIfNullSql('main_table.base_shipping_refunded', 0);
        $revenueExp = sprintf('%s - %s - %s - (%s - %s - %s)',
            $baseTotalInvoiced,
            $baseTaxInvoiced,
            $baseShippingInvoiced,
            $baseTotalRefunded,
            $baseTaxRefunded,
            $baseShippingRefunded
        );
        $taxExp = sprintf('%s - %s', $baseTaxInvoiced, $baseTaxRefunded);
        $shippingExp = sprintf('%s - %s', $baseShippingInvoiced, $baseShippingRefunded);
        if ($isFilter == 0) {
            $rateExp = $adapter->getIfNullSql('main_table.base_to_global_rate', 0);
            $this->getSelect()->columns(
                array(
                    'revenue'  => new Zend_Db_Expr(sprintf('SUM((%s) * %s)', $revenueExp, $rateExp)),
                    'tax'      => new Zend_Db_Expr(sprintf('SUM((%s) * %s)', $taxExp, $rateExp)),
                    'shipping' => new Zend_Db_Expr(sprintf('SUM((%s) * %s)', $shippingExp, $rateExp))
                )
            );
        } else {
            $this->getSelect()->columns(
                array(
                    'revenue'  => new Zend_Db_Expr(sprintf('SUM(%s)', $revenueExp)),
                    'tax'      => new Zend_Db_Expr(sprintf('SUM(%s)', $taxExp)),
                    'shipping' => new Zend_Db_Expr(sprintf('SUM(%s)', $shippingExp))
                )
            );
        }
        $this->getSelect()->columns(array(
            'quantity' => 'COUNT(main_table.entity_id)'
        ));
        //BOF modification
//        ->where('main_table.state NOT IN (?)', array(
//            Mage_Sales_Model_Order::STATE_PENDING_PAYMENT,
//            Mage_Sales_Model_Order::STATE_NEW)
//         );
        //EOF modification
        return $this;
    }
}

在这个例子中,我根据订单的状态注释了过滤,但是你可以很容易地取消注释,并放入你不想被计算在内的订单状态。

HTH

我做了一些挖掘,它看起来像是在Mage_Reports_Model_Resource_Order_Collection::_prepareSummaryLive()中构建的集合。在Magento 1.7.0.2中,限制是基于不在Mage_Sales_Model_Order::STATE_PENDING_PAYMENTMage_Sales_Model_Order::STATE_NEW状态中的订单。

无论如何,集合过滤器可以在这里操作(也可以查看github上的类文件):

$this->getSelect()
            ->columns(array(
                'quantity' => 'COUNT(main_table.entity_id)',
                'range' => $tzRangeOffsetExpression,
            ))
            ->where('main_table.state NOT IN (?)', array(
                Mage_Sales_Model_Order::STATE_PENDING_PAYMENT,
                Mage_Sales_Model_Order::STATE_NEW)
            )
            ->order('range', Zend_Db_Select::SQL_ASC)
            ->group($tzRangeOffsetExpression);

当然,任何建议的操作都是类重写:)

我发现了一个建议的解决方案,但我没有成功地应用它。如果有人可以验证这是一个可能的解决方案,我会修改这个答案反映。我还将更改答案,以便在不修改核心文件的情况下正确应用更改。


打开/app/code/core/Mage/Adminhtml/Block/Dashboard/Orders/Grid.php,添加

$collection->addAttributeToFilter('state', Mage_Sales_Model_Order::STATE_PROCESSING);

$collection = Mage::getResourceModel('reports/order_collection')
            ->addItemCountExpr()
            ->joinCustomerName('customer')
            ->orderByCreatedAt();