Dziękujemy za opublikowanie tego przykładowego kodu! Udało mi się go użyć do stworzenia rozwiązania, które powinno działać dobrze dla nas obu.
Zauważyłem, że sprzedaż produktów konfigurowalnych jest sumowana poprawnie, ale nie jest uwzględniana w wynikach; zamiast tego pojawiają się ich produkty podrzędne. Moje rozwiązanie polegało na dołączeniu konfigurowalnych produktów, zrób lewe sprzężenie na catalog_product_super_link
tabeli i odfiltruj wszystko, co ma parent_id
. Oto zmiany, które musisz wprowadzić:
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 - Znajdź następujące dwie linie...
$bestsellers->addOrderedQty($startDate, $todayDate, true);
$bestsellers->addOrderedQty('', '', true);
... i zmień je na:
$bestsellers->addOrderedQty($startDate, $todayDate, true, false, false);
$bestsellers->addOrderedQty('', '', true, false, false);
Moje zmiany dodały dwa nowe opcjonalne parametry, które domyślnie mają wartość true
, aby nie naruszać istniejącej funkcjonalności.
- Kiedy
$getComplexChildProducts
jest ustawione nafalse
, wszystkie elementy podrzędne konfigurowalnego produktu zostaną usunięte z wyników. $getRemovedProducts
określa, czy wcześniej zamówione produkty (które zostały usunięte z Magento) również powinny się pojawić.
Należy pamiętać, że statystyki raportu muszą być aktualne, aby uzyskać dokładne wyniki.
Mam nadzieję że to pomoże! Daj mi znać, jeśli masz jakieś pytania.