1

以前のバージョンの Magento (CE の場合は 1.6 以前、EE の場合は 1.11 以前) では、管理ダッシュボードのグラフに、合計注文数が反映されていました。1.7/1.12 以降、これは請求済みの注文を反映するように変更されました。私たちはカスタム ステータスを使用し、ダッシュボード グラフを売り上げに関するクイック ハート ビート タイプのレポートとして表示するのが好きです。ただし、バックエンドの注文処理を (Magento 経由ではなく) 処理する方法が原因で、注文が請求済みステータスに達することはありません。

ダッシュボード グラフを変更して、注文の処理中、請求済み、およびカスタム ステータスをレポートするにはどうすればよいですか? 私たちのカスタム ステータスは Processing に関連付けられているので、Processing と Invoiced のクエリのみが必要な場合があります。Magento Support によると、この種の変更は可能ですが、/app/design/Adminhtml/default/default/template/dashboard/graph.phtml ファイル以外のどこから始めればよいかわかりません。ありがとう!

4

3 に答える 3

3

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

于 2013-01-25T08:17:05.367 に答える
1

掘り下げてみたところ、コレクションが組み込まれているようMage_Reports_Model_Resource_Order_Collection::_prepareSummaryLive()です。Mage_Sales_Model_Order::STATE_PENDING_PAYMENTMagento 1.7.0.2 では、制限は、statiまたはにない注文に基づいていMage_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);

もちろん、提案された操作はすべてクラスの書き換えです:)

于 2013-01-24T17:45:09.183 に答える
0

提案された解決策を 1 つ見つけましたが、それを適用することにあまり成功していません。他の誰かがこれが可能な解決策であることを確認できた場合は、そのように反映してこの回答を変更します。また、コア ファイルを変更せずに変更を適切に適用するように回答を変更します。


/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();
于 2013-01-18T15:51:12.170 に答える