Terima kasih telah memposting kode sampel itu! Saya dapat menggunakannya untuk menciptakan solusi yang akan bekerja dengan baik untuk kita berdua.
Saya menemukan bahwa penjualan produk yang dapat dikonfigurasi dijumlahkan dengan benar tetapi tidak disertakan dalam hasil; produk anak mereka muncul sebagai gantinya. Solusi saya adalah memasukkan produk yang dapat dikonfigurasi, lakukan join kiri pada catalog_product_super_link
tabel, dan filter apa pun yang memiliki parent_id
. Berikut adalah perubahan yang perlu Anda lakukan:
Koleksi.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 - Temukan dua baris berikut...
$bestsellers->addOrderedQty($startDate, $todayDate, true);
$bestsellers->addOrderedQty('', '', true);
... dan ubah menjadi:
$bestsellers->addOrderedQty($startDate, $todayDate, true, false, false);
$bestsellers->addOrderedQty('', '', true, false, false);
Perubahan saya menambahkan dua parameter opsional baru, yang keduanya default ke true
, agar tidak merusak fungsi yang ada.
- Kapan
$getComplexChildProducts
disetel kefalse
, semua item turunan dari produk yang dapat dikonfigurasi akan dihapus dari hasil. $getRemovedProducts
menentukan apakah produk yang dipesan sebelumnya (yang telah dihapus dari Magento) juga akan muncul atau tidak.
Harap perhatikan bahwa statistik laporan Anda harus diperbarui untuk mendapatkan hasil yang akurat.
Semoga ini membantu! Beri tahu saya jika Anda memiliki pertanyaan.