Mysql
 sql >> Database >  >> RDS >> Mysql

Modulo BestSeller Magento:somma di prodotti configurabili e aggiunta di essi

Grazie per aver pubblicato quel codice di esempio! Sono stato in grado di usarlo per creare una soluzione che dovrebbe funzionare bene per entrambi.

Ho scoperto che le vendite di prodotti configurabili vengono sommate correttamente ma non vengono incluse nei risultati; appaiono invece i loro prodotti figlio. La mia soluzione era includere prodotti configurabili, fare un join sinistro sul catalog_product_super_link tabella e filtra tutto ciò che ha un parent_id . Ecco le modifiche che dovrai apportare:

Collezione.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 - Trova le seguenti due righe...

$bestsellers->addOrderedQty($startDate, $todayDate, true);
$bestsellers->addOrderedQty('', '', true);

... e cambiali in:

$bestsellers->addOrderedQty($startDate, $todayDate, true, false, false);
$bestsellers->addOrderedQty('', '', true, false, false);

Le mie modifiche hanno aggiunto due nuovi parametri facoltativi, entrambi predefiniti su true , per non interrompere la funzionalità esistente.

  • Quando $getComplexChildProducts è impostato su false , tutti gli articoli secondari del prodotto configurabile verranno rimossi dai risultati.
  • $getRemovedProducts determina se devono apparire o meno anche i prodotti ordinati in precedenza (che nel frattempo sono stati eliminati da Magento).

Tieni presente che le statistiche del tuo rapporto dovranno essere aggiornate per ottenere risultati accurati.

Spero che sia di aiuto! Fammi sapere se hai domande.