1

私は製品の売り上げを数えるための拡張機能を書きました-目標はベストセラーを獲得することです。

すべての製品の新しい静的属性を作成しました(つまり、catalog_product_entityテーブルに列を追加しました)items_sold

sales_order_save_beforeイベントに参加します

public function salesOrderSaveBefore(Varien_Event_Observer $observer)
{
    /* @var $order Mage_Sales_Model_Order */
    $order = $observer->getOrder();

    // if the order will be created and has no id yet
    if(!$order->getId()) {
        $productIds = array();
        foreach($order->getAllItems() as $item) {
            /* @var $item Mage_Sales_Model_Order_Item */
            $productIds[] = $item->getProductId();
        }
    }

    // what to do here :-)

}

今私は2つの方法を見ます:

  1. 商品コレクションを読み込み、すべての商品をループし、items_sold(+1)を上げて、すべての商品を保存します
  2. 私は次のようなクエリを起動しますUPDATE catalog_product_entity SET items_sold = items_sold + 1 WHERE entity_id IN $productIds

助言がありますか?

4

2 に答える 2

2

magentoでこれまでどおりレポートモデルを使用すると、これを実現する方法がいくつかあります。1つの方法は次のようになります(これはadminhtmlで使用される方法であり、複雑な製品タイプを考慮していません)。

$limit = 5;
$storeId = Mage::app()->getStore()->getId();
$bestSellers = Mage::getResourceModel('sales/report_bestsellers_collection')
    ->setModel('catalog/product')
    ->addStoreFilter($storeId)
    ->setPageSize($limit)
    ->setCurPage(1);

あなたの質問に基づいて、あなたは代わりに以下を探しているかもしれません:

$limit = 5;
$storeId = Mage::app()->getStore()->getId();
$bestSellers = Mage::getResourceModel('reports/product_sold_collection')
    ->addOrderedQty()
    ->addAttributeToSelect('name')
    ->addStoreFilter($storeId)
    ->setOrder('ordered_qty', 'desc')
    ->setPageSize($limit)
    ->setCurPage(1);

ブロックキャッシングを適用するには(これには、block / htmlタグを更新する必要があります)、cache_lifetimeを快適な数値に変更します。

protected function _construct()
{
    $this->addData(array (
        'cache_lifetime' => false,
        'cache_tags'     => array(Mage_Core_Model_Store::CACHE_TAG)
    ));
}

さらに進んで、モジュール/ベストセラーのカスタムキャッシュタグを追加できます。

于 2012-12-31T16:09:07.473 に答える
1

Magentoレポートシステムについて考えますか?フラットテーブルに書き込む別のインデックスプロセス。/ admin / report_sales /bestsellers/の下の管理者に移動します

于 2012-12-31T14:43:23.017 に答える