InAme19 Posted May 27, 2009 Share Posted May 27, 2009 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 More sharing options...
DrÿSs' Posted May 27, 2009 Share Posted May 27, 2009 Oui, c'est un bug connu, dont nous n'avons trouvé pour l'instant aucune solution fiable.Puisque vous essayé d'en trouver un fix, je déplace ce post sur le forum Développement. Link to comment Share on other sites More sharing options...
InAme19 Posted May 28, 2009 Author Share Posted May 28, 2009 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.phpla 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_reelmaintenant que l'on a sélectionné le prix, il faut gérer le ORDER BY, il faut trier avec notre variable prix_reelce 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 More sharing options...
DrÿSs' Posted May 31, 2009 Share Posted May 31, 2009 Très bonne initiative, mais il manque un paramètre... les taxes Et là ça devient plus ardu ! Link to comment Share on other sites More sharing options...
InAme19 Posted June 1, 2009 Author Share Posted June 1, 2009 Oui les taxes... Je regarderai ça Link to comment Share on other sites More sharing options...
InAme19 Posted June 3, 2009 Author Share Posted June 3, 2009 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 More sharing options...
DrÿSs' Posted June 3, 2009 Share Posted June 3, 2009 Absolument pas : comment savoir si les taxe s'appliquent ?Si le client est bien éligible à la taxe du produit ? Link to comment Share on other sites More sharing options...
InAme19 Posted June 3, 2009 Author Share Posted June 3, 2009 oui je dit des bêtises :/Mais comment un client ne pourrai ne pas être éligible à la taxe du produit? Le prix du produit s'affiche avec la TVA. Link to comment Share on other sites More sharing options...
Nhood Posted July 5, 2011 Share Posted July 5, 2011 Bonjour,Ce bout de code est intéressant. Ceci dit, il ne fonctionne pas pour la page prices-drop.... pourquoi et comment faire ?merci de vos réponses Link to comment Share on other sites More sharing options...
Bgiv Posted June 27, 2013 Share Posted June 27, 2013 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 More sharing options...
Recommended Posts