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 :-)

}

现在我看到了两种方法:

  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 一样,有几种方法可以实现这一点。一种方法可能是(这是 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);

要应用块缓存(这将需要刷新块/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 回答