Jump to content

Recommended Posts

Bonjour,

Depuis pas mal de temps, je dois m'occuper d'un "problème" sur la page meilleures ventes, alimentées par la table product_sale.

En effet, les meilleures ventes ne semblent pas du tout coller à la réalité.
Alors, j'ai fait un test, et j'ai vidé totalement la table, pour voir ce que ça fait sur 12 heures.

Essai concluant :
=> les ventes sont presque toutes comptées en double

Ca ne vient pas de modification de code, car je l'ai fait sur 3 boutiques différentes, et les chiffres sont similaires. En général, presque 2 fois plus de ventes dans product_sale que les ventes réelles.

Avez-vous une idée précise de ce qui est comptabilisé dans cette table ?
Les erreurs ne semblent pas provenir de panier non commandés.

Pourquoi la requête meilleures ventes est-elle faite sur une table spécifique ? et pas à partir de la table orders ?
C'est logiquement juste pour les performances, la table product_sale étant très petite, et logiquement bien alimentée.

Je suis étonné que personne n'en parle sur le forum. Comme je l'ai écrit plus haut, ça ne semble pas venir de mes modifications, puisque je le constate sur d'autres boutiques dont une non modifiée (script d'origine).

PS : 1.2.5

Share this post


Link to post
Share on other sites

Je viens de créer une fonction pour remplacer celle utilisée :

A mettre dans /Classes/ProductSale.php

static public function getBestSales2($id_lang, $pageNumber = 0, $nbProducts = 10, $orderBy=NULL, $orderWay=NULL)
   {
       /* FONCTION FAITE PAR HUBERT - remplace la fonction getBestSales qui utilise la table product_sale, peu fiable) */
       global $link, $cookie;
       //echo "orderway=".$orderWay;
       if ($pageNumber < 0) $pageNumber = 0;
       if ($nbProducts < 1) $nbProducts = 10;
       if (empty($orderBy) || $orderBy == 'position') $orderBy = 'sales';
       if (empty($orderWay)) $orderWay = 'DESC';

       $query = '
       SELECT p.*,
           pl.`description`, pl.`link_rewrite`, pl.`name`, pl.`description_short`, i.`id_image`, il.`legend`,
           (SELECT SUM(od.product_quantity) FROM '._DB_PREFIX_.'order_detail od WHERE od.product_id = p.id_product) as sales
       FROM '._DB_PREFIX_.'product p
       LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (p.id_product = pl.id_product AND pl.id_lang = '.intval($id_lang).')
       LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
       LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.intval($id_lang).')
       LEFT JOIN '._DB_PREFIX_.'order_detail od ON od.product_id = p.id_product
       LEFT JOIN '._DB_PREFIX_.'orders o ON od.id_order = o.id_order
       WHERE p.active = 1 AND o.valid = 1
       AND o.invoice_date > 0
       GROUP BY od.product_id
       ORDER BY '.(isset($orderByPrefix) ? $orderByPrefix.'.' : '').'`'.pSQL($orderBy).'` '.pSQL($orderWay).'
       LIMIT '.intval($pageNumber * $nbProducts).', '.intval($nbProducts);
       //echo $query;
       $result = Db::getInstance()->ExecuteS($query);
       if($orderBy == 'price')
       {    
           Tools::orderbyPrice($result,$orderWay);
       }
       if (!$result)
           return false;
       return Product::getProductsProperties($id_lang, $result);
   }


Il faut aussi modifier le fichier /best-sales.php

$smarty->assign(array(
   'products' => ProductSale::getBestSales2(intval($cookie->id_lang), intval($p) - 1, intval($n), $orderBy, "DESC"),
   'nbProducts' => $nbProducts));


J'ai juste remplacé
=> getBestSales par getBestSales2
=> $orderWay par "DESC" (pour moi c'est par défaut sur ASC, et je ne trouve pas pourquoi)

1 inconvénient par rapport à la fonction originelle :
=> c'est un peu long à afficher sur une grosse boutique. A voir pour une amélioration qui limiterait la recherche dans le temps (par exemple, les 2 ou 3 derniers mois)

On peut probablement optimiser la requête, je n'ai pas encore pris le temps de regarder pour limiter la recherche aux champs expressément utiles, voire enlever des jointures sur des tables inutiles.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More