Merci d'avoir posté cet exemple de code ! J'ai pu l'utiliser pour créer une solution qui devrait bien fonctionner pour nous deux.
J'ai constaté que les ventes de produits configurables sont additionnées correctement mais ne sont pas incluses dans les résultats ; leurs produits enfants apparaissent à la place. Ma solution était d'inclure des produits configurables, de faire une jointure à gauche sur le catalog_product_super_link
table et filtrez tout ce qui a un parent_id
. Voici les modifications que vous devrez apporter :
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 - Trouvez les deux lignes suivantes...
$bestsellers->addOrderedQty($startDate, $todayDate, true);
$bestsellers->addOrderedQty('', '', true);
... et changez-les en :
$bestsellers->addOrderedQty($startDate, $todayDate, true, false, false);
$bestsellers->addOrderedQty('', '', true, false, false);
Mes modifications ont ajouté deux nouveaux paramètres facultatifs, qui ont tous deux la valeur par défaut true
, afin de ne pas casser les fonctionnalités existantes.
- Quand
$getComplexChildProducts
est défini surfalse
, tous les articles enfants du produit configurable seront supprimés des résultats. $getRemovedProducts
détermine si oui ou non les produits précédemment commandés (qui ont depuis été supprimés de Magento) doivent également apparaître.
Veuillez noter que les statistiques de votre rapport devront être à jour afin d'obtenir des résultats précis.
J'espère que cela t'aides! Faites-moi savoir si vous avez des questions.