Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Magento BestSeller Module - Sumowanie konfigurowalnych produktów i dodawanie ich z powrotem

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy są jakieś negatywne skutki zmiany kodowania tabeli mysql?

  2. Mysql Porównaj dwa pola daty i godziny

  3. Apache 2.4 z PHP 5.4:brak mysql

  4. Nie można uruchomić niczego z mysql-utilities:Brak modułu o nazwie mysql.utilities.common.tools

  5. Usuń zduplikowane wiersze w tabeli bez klucza podstawowego