sql >> Database >  >> RDS >> Mysql

Magento BestSeller-module - Configureerbare producten optellen en weer toevoegen

Bedankt voor het plaatsen van die voorbeeldcode! Ik kon het gebruiken om een ​​oplossing te creëren die voor ons beiden goed zou moeten werken.

Ik ontdekte dat configureerbare productverkopen correct worden opgeteld, maar niet worden opgenomen in de resultaten; hun onderliggende producten verschijnen in plaats daarvan. Mijn oplossing was om configureerbare producten op te nemen, doe een left join op de catalog_product_super_link tabel, en filter alles uit dat een parent_id . heeft . Dit zijn de wijzigingen die u moet aanbrengen:

Collectie.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 - Vind de volgende twee regels...

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

... en verander ze in:

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

Mijn wijzigingen hebben twee nieuwe optionele parameters toegevoegd, die beide standaard zijn ingesteld op true , om bestaande functionaliteit niet te breken.

  • Wanneer $getComplexChildProducts is ingesteld op false , worden alle onderliggende items van het configureerbare product uit de resultaten verwijderd.
  • $getRemovedProducts bepaalt of eerder bestelde producten (die inmiddels uit Magento zijn verwijderd) ook moeten verschijnen.

Houd er rekening mee dat uw rapportstatistieken up-to-date moeten zijn om nauwkeurige resultaten te krijgen.

Ik hoop dat dit helpt! Laat het me weten als je vragen hebt.



  1. PostgreSQL traag? Tips en trucs om bij de bron te komen

  2. Query's naar een database verzenden vanaf Android

  3. Postgres Sql implementeren in Apache Airflow

  4. MySQL UPDATE-syntaxis met meerdere tabellen met behulp van de WHERE-clausule