Mysql
 sql >> Base de données >  >> RDS >> Mysql

Module Magento BestSeller - Additionner des produits configurables et les ajouter à nouveau

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 sur false , 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.