Jump to content

modulo "mas vendidos" tiempo que tiene en cuenta


chenler19

Recommended Posts

Buenas tardes, 

 

Acabo de activar el módulo productos "más vendidos" y me da la sensación que los productos que saca a la web son los más vendidos de la tienda desde origen. Mi pregunta es si es posible configurar de alguna manera el módulo o el código para que únicamente te muestre los productos más vendidos del último mes por ejemplo. Ya que si tienes algunos productos que son de temporada de invierno y quizá no son los más vendidos durante el año, pero si son los más vendidos en los meses de invierno, si es necesario que salgan como los más vendidos en cierta época.

 

Pienso que de donde obtiene el módulo la lista de productos se podría añadir una consulta que restringiera la búsqueda por fecha al último mes.

 

Alguien me podría dar alguna ayuda?

 

Gracias! 

 

Link to comment
Share on other sites

Buenas tardes chenler19.

 

El módulo de "mas vendidos" efectivamente ordena los productos más vendidos desde el origen y si, es posible, tendrás que alterar el código del módulo para que tome los valores de los últimos meses y no desde el inicio.

 

en la linea 147 del archivo ProductSale.php dentro de la carpeta del módulo blockbestsellers, se encuentra la función que obtiene los productos más vendidos

public static function getBestSalesLight($id_lang, $page_number = 0, $nb_products = 10, Context $context = null)

Tendrás que analizar este código y alterarlo para que haga lo que tu pides. Si tengo algo de tiempo te intento dar alguna pista.

 

Un saludo

Link to comment
Share on other sites

  • 4 weeks later...

Hola, gracias por responder. La verdad es que le he dado vueltas pero en ese archivo que me comentas no encuentro ninguna consulta a la base de datos, tampoco soy experto, pero no encuentro la consulta. 

 

 

He visto en este archivo: httpdocs/classes/ProductSale.php

 

que vienen bastantes consultas, entre ellas esta:

 

 

 /*
    ** Get required informations on best sales products
    **
    ** @param int $id_lang Language id
    ** @param int $page_number Start from (optional)
    ** @param int $nb_products Number of products to return (optional)
    ** @return array keys : id_product, link_rewrite, name, id_image, legend, sales, ean13, upc, link
    */
    public static function getBestSalesLight($id_lang, $page_number = 0, $nb_products = 10, Context $context = null)
    {
        if (!$context) {
            $context = Context::getContext();
        }
        if ($page_number < 0) {
            $page_number = 0;
        }
        if ($nb_products < 1) {
            $nb_products = 10;
        }
 
        // no group by needed : there's only one attribute with default_on=1 for a given id_product + shop
        // same for image with cover=1
        $sql = '
SELECT
p.id_product, IFNULL(product_attribute_shop.id_product_attribute,0) id_product_attribute, pl.`link_rewrite`, pl.`name`, pl.`description_short`, product_shop.`id_category_default`,
image_shop.`id_image` id_image, il.`legend`,
ps.`quantity` AS sales, p.`ean13`, p.`upc`, cl.`link_rewrite` AS category, p.show_price, p.available_for_order, IFNULL(stock.quantity, 0) as quantity, p.customizable,
IFNULL(pa.minimal_quantity, p.minimal_quantity) as minimal_quantity, stock.out_of_stock,
product_shop.`date_add` > "'.date('Y-m-d', strtotime('-'.(Configuration::get('PS_NB_DAYS_NEW_PRODUCT') ? (int)Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY')).'" as new,
product_shop.`on_sale`, product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity
FROM `'._DB_PREFIX_.'product_sale` ps
LEFT JOIN `'._DB_PREFIX_.'product` p ON ps.`id_product` = p.`id_product`
'.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN `'._DB_PREFIX_.'product_attribute_shop` product_attribute_shop
ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop='.(int)$context->shop->id.')
LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (product_attribute_shop.id_product_attribute=pa.id_product_attribute)
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
ON p.`id_product` = pl.`id_product`
AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').'
LEFT JOIN `'._DB_PREFIX_.'image_shop` image_shop
ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop='.(int)$context->shop->id.')
LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl
ON cl.`id_category` = product_shop.`id_category_default`
AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').Product::sqlStock('p', 0);
 
        $sql .= '
WHERE product_shop.`active` = 1
AND p.`visibility` != \'none\'';
 
        if (Group::isFeatureActive()) {
            $groups = FrontController::getCurrentCustomerGroups();
            $sql .= ' AND EXISTS(SELECT 1 FROM `'._DB_PREFIX_.'category_product` cp
JOIN `'._DB_PREFIX_.'category_group` cg ON (cp.id_category = cg.id_category AND cg.`id_group` '.(count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1').')
WHERE cp.`id_product` = p.`id_product`)';
        }
 
        $sql .= '
ORDER BY ps.quantity DESC
LIMIT '.(int)($page_number * $nb_products).', '.(int)$nb_products;
 
        if (!$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql)) {
            return false;
        }
 
        return Product::getProductsProperties($id_lang, $result);
    }

 

 

 

 

Pero la verdad que no se si será aquí, porque no se a que función llaman para obtener los productos más vendidos. 

 

Cualquier ayuda será bienvenida!!

 

Gracias. 

Link to comment
Share on other sites

  • 3 weeks later...

He sacado algún tiempo y he visto que la clase que controla el bloque más vendidos de la página principal es ese archivo que he comentado, he modificado esta función con las frases en rojo, pero la consulta no obtiene nada:

 

 public static function getBestSalesLight($id_lang, $page_number = 0, $nb_products = 10, Context $context = null)
    {
        if (!$context) {
            $context = Context::getContext();
        }
        if ($page_number < 0) {
            $page_number = 0;
        }
        if ($nb_products < 1) {
            $nb_products = 10;
        }
 
        // no group by needed : there's only one attribute with default_on=1 for a given id_product + shop
        // same for image with cover=1
        $sql = '
SELECT
p.id_product, IFNULL(product_attribute_shop.id_product_attribute,0) id_product_attribute, pl.`link_rewrite`, pl.`name`, pl.`description_short`, product_shop.`id_category_default`,
image_shop.`id_image` id_image, il.`legend`,
n.`product_quantity` AS sales, p.`ean13`, p.`upc`, cl.`link_rewrite` AS category, p.show_price, p.available_for_order, IFNULL(stock.quantity, 0) as quantity, p.customizable,
IFNULL(pa.minimal_quantity, p.minimal_quantity) as minimal_quantity, stock.out_of_stock,
product_shop.`date_add` > "'.date('Y-m-d', strtotime('-'.(Configuration::get('PS_NB_DAYS_NEW_PRODUCT') ? (int)Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY')).'" as new,
product_shop.`on_sale`, product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity , SUM(n.product_quantity) AS Cantidad , n.product_id
FROM `'._DB_PREFIX_.'orders` ps
LEFT JOIN  ps_order_detail n ON n.id_order = ps.id_order
LEFT JOIN `'._DB_PREFIX_.'product` p ON ps.`id_product` = p.`id_product`
'.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN `'._DB_PREFIX_.'product_attribute_shop` product_attribute_shop
ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop='.(int)$context->shop->id.')
LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (product_attribute_shop.id_product_attribute=pa.id_product_attribute)
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
ON p.`id_product` = pl.`id_product`
AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').'
LEFT JOIN `'._DB_PREFIX_.'image_shop` image_shop
ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop='.(int)$context->shop->id.')
LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl
ON cl.`id_category` = product_shop.`id_category_default`
AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').Product::sqlStock('p', 0);
 
        $sql .= '
WHERE ps.`invoice_date` BETWEEN \'2016-12-01\' AND \'2016-12-31\'';
 
        if (Group::isFeatureActive()) {
            $groups = FrontController::getCurrentCustomerGroups();
            $sql .= ' AND EXISTS(SELECT 1 FROM `'._DB_PREFIX_.'category_product` cp
JOIN `'._DB_PREFIX_.'category_group` cg ON (cp.id_category = cg.id_category AND cg.`id_group` '.(count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1').')
WHERE cp.`id_product` = p.`id_product`)';
        }
 
        $sql .= '
GROUP BY n.product_id
ORDER BY n.product_quantity DESC
LIMIT '.(int)($page_number * $nb_products).', '.(int)$nb_products;
 
        if (!$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql)) {
            return false;
        }
 
        return Product::getProductsProperties($id_lang, $result);
    }
 
 
como digo, cualquier ayuda es bienvenida para hacer una consulta por fechas. He cambiado la tabla de consulta inicial (FROM `'._DB_PREFIX_.'product_sale` ps) por (FROM `'._DB_PREFIX_.'orders` ps) porque la primera tabla tiene las cantidades vendidas desde el origen de la tienda, por lo que no servía. La segunda tabla tiene los productos vendidos, simplemente agrupando por id de producto y sumando las cantidades valdría, pero como digo la consulta no me da ningún producto.  :(
Link to comment
Share on other sites

×
×
  • Create New...