Cảm ơn vì đã đăng mã mẫu đó! Tôi đã có thể sử dụng nó để tạo ra một giải pháp hoạt động tốt cho cả hai chúng tôi.
Tôi thấy rằng doanh số bán sản phẩm có thể định cấu hình đang được tổng hợp chính xác nhưng không được đưa vào kết quả; các sản phẩm con của họ xuất hiện thay thế. Giải pháp của tôi là bao gồm các sản phẩm có thể định cấu hình, thực hiện kết hợp bên trái trên catalog_product_super_link
bảng và lọc ra bất kỳ thứ gì có parent_id
. Dưới đây là những thay đổi bạn cần thực hiện:
Collection.php:
public function addOrderedQty($from = '', $to = '', $getComplexProducts=false, $getComplexChildProducts = true, $getRemovedProducts = true)
{
$qtyOrderedTableName = $this->getTable('sales/order_item');
$qtyOrderedFieldName = 'qty_ordered';
$productIdFieldName = 'product_id';
if (!$getComplexProducts) {
$compositeTypeIds = Mage::getSingleton('catalog/product_type')->getCompositeTypes();
$productTypes = $this->getConnection()->quoteInto(' AND (e.type_id NOT IN (?))', $compositeTypeIds);
} else {
$productTypes = '';
}
if ($from != '' && $to != '') {
$dateFilter = " AND `order`.created_at BETWEEN '{$from}' AND '{$to}'";
} else {
$dateFilter = "";
}
$this->getSelect()->reset()->from(
array('order_items' => $qtyOrderedTableName),
array(
'ordered_qty' => "SUM(order_items.{$qtyOrderedFieldName})",
'order_items_name' => 'order_items.name'
)
);
$_joinCondition = $this->getConnection()->quoteInto(
'order.entity_id = order_items.order_id AND order.state<>?', Mage_Sales_Model_Order::STATE_CANCELED
);
$_joinCondition .= $dateFilter;
$this->getSelect()->joinInner(
array('order' => $this->getTable('sales/order')),
$_joinCondition,
array()
);
// Add join to get the parent id for configurables
$this->getSelect()->joinLeft(
array('cpsl' => $this->getTable('catalog/product_super_link')),
'cpsl.product_id = order_items.product_id',
'cpsl.parent_id'
);
if(!$getComplexChildProducts)
$this->getSelect()->having('parent_id IS NULL');
if($getRemovedProducts)
{
$this->getSelect()
->joinLeft(array('e' => $this->getProductEntityTableName()),
"e.entity_id = order_items.{$productIdFieldName} AND e.entity_type_id = {$this->getProductEntityTypeId()}{$productTypes}")
->group('order_items.product_id');
}
else
{
$this->getSelect()
->joinInner(array('e' => $this->getProductEntityTableName()),
"e.entity_id = order_items.{$productIdFieldName} AND e.entity_type_id = {$this->getProductEntityTypeId()}{$productTypes}")
->group('e.entity_id');
}
$this->getSelect()->having('ordered_qty > 0');
// This line is for debug purposes, in case you'd like to see what the SQL looks like
// $x = $this->getSelect()->__toString();
return $this;
}
List.php - Tìm hai dòng sau ...
$bestsellers->addOrderedQty($startDate, $todayDate, true);
$bestsellers->addOrderedQty('', '', true);
... và thay đổi chúng thành:
$bestsellers->addOrderedQty($startDate, $todayDate, true, false, false);
$bestsellers->addOrderedQty('', '', true, false, false);
Các thay đổi của tôi đã thêm hai thông số tùy chọn mới, cả hai đều được mặc định thành true
, để không phá vỡ chức năng hiện có.
- Khi
$getComplexChildProducts
được đặt thànhfalse
, tất cả các mục con của sản phẩm có thể định cấu hình sẽ bị xóa khỏi kết quả. -
$getRemovedProducts
xác định xem các sản phẩm đã đặt hàng trước đó (đã bị xóa khỏi Magento) có xuất hiện hay không.
Xin lưu ý rằng thống kê báo cáo của bạn sẽ cần được cập nhật để có được kết quả chính xác.
Hi vọng điêu nay co ich! Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi nào.