Jump to content

[Résolu] Problème de tri


Recommended Posts

Bonjour,

sur la page category.php, un tri est disponible. Celui par ordre alphabétique marche parfaitement, mais celui par prix pose quelques soucis.
En effet les produits sont triés par leur prix d'origine, ainsi si l'on met une promotion, le classement ne prend pas en compte ce changement...

Je me retrouve donc avec des produits qui ne sont pas du tout triés...

Comment pourrai je modifier l'ordre des produits dans $products?

Link to comment
Share on other sites

Bon j'ai réussi à résoudre le fameux bug de tri sur prix!!

Je voulais absolument que ce tri marche mais prestashop tri les prix avant que les calculs de réductions ne soient pris en compte.
Donc il faut trier par leur "prix réel". Pour cela il faut modifier le fichier ./classes/Category.php

la requête de tris se trouve dans la fonction getProducts.
dans la requête, il faut sélectionner le prix réel, c'est le prix moins la réduction. Cette dernière peut être de 2 formes, soit en pourcentage, soit en prix.
Comme il ne peut exister qu'une réduction en même temps, il suffit d'ajouter les 2 (une sera forcément égale à 0)
ce qui nous donne:
prix sans réduction:
(p.`price`- (p.`reduction_price`+ ((p.`price` * p.`reduction_percent`)/100)) ) AS prix_reel

maintenant que l'on a sélectionné le prix, il faut gérer le ORDER BY, il faut trier avec notre variable prix_reel
ce qui nous donne:

if ($orderBy=='price')
{
$sql .= 'ORDER BY prix_reel '.pSQL($orderWay).'
LIMIT '.((intval($p) - 1) * intval($n)).','.intval($n);
}

Et voilà! Maintenant les prix sont bien triés même s'ils ont une réduction. J'ai testé, et cela marche parfaitement!

voilà le code complet de la requête:

   $sql = '
       SELECT p.*, (p.`price`- (p.`reduction_price`+ ((p.`price` * p.`reduction_percent`)/100)) ) AS prix_reel, pa.`id_product_attribute`, pl.`description`, pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, i.`id_image`, il.`legend`, m.`name` AS manufacturer_name, tl.`name` AS tax_name, t.`rate`, cl.`name` AS category_default, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new
       FROM `'._DB_PREFIX_.'category_product` cp
       LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.`id_product` = cp.`id_product`)
       LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product` AND default_on = 1)
       LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.intval($id_lang).')
       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_.'tax` t ON (t.`id_tax` = p.`id_tax`)
       LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.intval($id_lang).')
       LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)
       WHERE cp.`id_category` = '.intval($this->id).($active ? ' AND p.`active` = 1' : '').'
       '.($id_supplier ? 'AND p.id_supplier = '.$id_supplier : '');

       if ($random === true)
       {
           $sql .= 'ORDER BY RAND()';
           $sql .= 'LIMIT 0, '.intval($randomNumberProducts);
       }
       else
       {
           if ($orderBy=='price')
           {
               $sql .= 'ORDER BY  prix_reel '.pSQL($orderWay).'
               LIMIT '.((intval($p) - 1) * intval($n)).','.intval($n);
           }
           else
           {
               $sql .= 'ORDER BY '.(isset($orderByPrefix) ? $orderByPrefix.'.' : '').'`'.pSQL($orderBy).'` '.pSQL($orderWay).'
               LIMIT '.((intval($p) - 1) * intval($n)).','.intval($n);
           }

       }

Link to comment
Share on other sites

Et bien en fait, avec cette méthode les prix sont triés avec les taxes comprises.
Donc à moins de vouloir les trier hors taxes (mais je n'en vois pas trop l'intérêt), le tri marche parfaitement.

Link to comment
Share on other sites

  • 2 years later...
  • 1 year later...

Bonjour à tous,

 

Je suis avec la version 1.5 et je souhaite ajouter un champ personnalisé tri par "Ville" dans le menu déroulant tri " le moins cher, le plus cher, de A à Z... qui s'affiche losqu'on on affiche une liste de produits

 

 

Merci d'avance pour vos réponses :)

 

Cordialement,

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...