jeromecollection Posted May 15, 2019 Share Posted May 15, 2019 (edited) Bonjour J'ai besoin pour ma boutique de trier les articles par référence (coté front office) Le classement doit être comme cela: P150 doit être classé après P20 par exemple mais la, le système tri sur le premier caractère puis le deuxièmement et ainsi de suite ... en fait , il ne comprend pas que P20 doit être avant P150 (car il ne reconnait pas le chiffre 20, mais d'abord le 2) Nota : je ne peux pas changer en P020 le P20 (ce serait bien, mais je peux pas car il s'agit de ref officielle) dans mon cas toutes les ref commence par la lettre P et il peut y avoir des refe type P20a P20b merci pour votre aide ! Jérôme Edited August 4, 2019 by jeromecollection (see edit history) Link to comment Share on other sites More sharing options...
doekia Posted May 15, 2019 Share Posted May 15, 2019 https://www.php.net/manual/fr/function.sort.php SORT_NATURAL Link to comment Share on other sites More sharing options...
jeromecollection Posted May 16, 2019 Author Share Posted May 16, 2019 Merci de votre réponse ... Je pense qu'il faut modifier le fichier product-sort.tpl sur /public_html/themes/default-bootstrap mais je ne vois pas trop ou ajouter cette fonction SORT_NATURAL Link to comment Share on other sites More sharing options...
jeromecollection Posted August 3, 2019 Author Share Posted August 3, 2019 Le 15/05/2019 à 7:44 PM, doekia a dit : https://www.php.net/manual/fr/function.sort.php SORT_NATURAL Re Bonsoir je suis toujours bloqué ... les produits ne se trient pas par order naturel ... J'ai vraiment besoin d'aide svp, merci !!!! Link to comment Share on other sites More sharing options...
Mediacom87 Posted August 4, 2019 Share Posted August 4, 2019 Bonjour, La réponse donnée est parfaite pour ceux qui savent où l'utiliser, pour les autres, soit ils donnent des informations permettant de les aider plus que cela (difficile de donner ce qu'il faut faire pour les centaines de versions PrestaShop existantes) soit ils passent par un professionnel. Ce n'est pas plus compliqué que cela et c'est une des règles de base du forum, pardon, des forums. Link to comment Share on other sites More sharing options...
jeromecollection Posted August 4, 2019 Author Share Posted August 4, 2019 Il y a 8 heures, Mediacom87 a dit : Bonjour, La réponse donnée est parfaite pour ceux qui savent où l'utiliser, pour les autres, soit ils donnent des informations permettant de les aider plus que cela (difficile de donner ce qu'il faut faire pour les centaines de versions PrestaShop existantes) soit ils passent par un professionnel. Ce n'est pas plus compliqué que cela et c'est une des règles de base du forum, pardon, des forums. Effectivement je n'ai pas été très précis. Il s'agit de Prestashop 1.16.1.17 Oui bien sur je peux faire appel à une pro ... je trouve cela quand même dommage, le problème est pour toute les version de Ps 1.6. et valable pour tout le monde. Le tri ne se fait pas correctement pour les références ni pour les autres tri dès lors qu'il y a des chiffres et des lettres. C'est vrai que d'origine Prestashop ne propose pas le tri par référence initialement. En ce qui concerne la réponse que j'ai reçu elle reste plus que sommaire je trouve .. mais bon c'est deja ca vu que c'est la seule réponse. merci d'avoir pris le temps de lire. Link to comment Share on other sites More sharing options...
doekia Posted August 4, 2019 Share Posted August 4, 2019 (edited) Si ça te fait suer d'être précis, je vois pas pourquoi on tenterait de te répondre. base64:cXVlbGxlIGVzdCB0YSB2ZXJzaW9uLCBwYXMgdG9uIG51bcOpcm8gZGUgdMOpbMOpcGhvbmUsIG5pIHRhIGdyaWxsZSBkZSBsb3Rv Edited August 4, 2019 by doekia (see edit history) Link to comment Share on other sites More sharing options...
Mediacom87 Posted August 4, 2019 Share Posted August 4, 2019 Bonjour, je n'ai pas testé mais ce tutoriel semble aborder la problématique https://www.copterlabs.com/natural-sorting-in-mysql/ Car cela se passe au niveau SQL puisque la requête limite le nombre d'affichage en fonction du nombre de produits à afficher par page. Vous pouvez essayer cela sur la classe Category.php au niveau de la fonction getProducts() et de sa requête SQL. Link to comment Share on other sites More sharing options...
jeromecollection Posted August 4, 2019 Author Share Posted August 4, 2019 il y a 59 minutes, doekia a dit : Si ça te fait suer d'être précis, je vois pas pourquoi on tenterait de te répondre. base64:cXVlbGxlIGVzdCB0YSB2ZXJzaW9uLCBwYXMgdG9uIG51bcOpcm8gZGUgdMOpbMOpcGhvbmUsIG5pIHRhIGdyaWxsZSBkZSBsb3Rv non, ça ne me fait pas suer ... désolé .. base64:Qydlc3QgUFMgMS42LjEuMTcgPyBkw6lzb2zDqSBkZSB0J2F2b2lyIG1pcyBlbiByYWdlIDop Link to comment Share on other sites More sharing options...
jeromecollection Posted August 4, 2019 Author Share Posted August 4, 2019 (edited) il y a 17 minutes, Mediacom87 a dit : Bonjour, je n'ai pas tester mais ce tutoriel semble aborder la problématique https://www.copterlabs.com/natural-sorting-in-mysql/ Car cela se passe au niveau SQL puisque la requête limite le nombre d'affichage en fonction du nombre de produits à afficher par page. Vous pouvez essayer cela sur la classe Category.php au niveau de la fonction getProducts() et de sa requête SQL. oui, effectivement je pense que la solution passe par un override sur classes/Category.php .. un tuto permet de classer les articles qui n'ont plus de stock à la fin .. donc l'idée est la . le fichier override / classes / Category.php qui fonctionne pour avoir les articles sans stock à la fin. <?php class Category extends CategoryCore { public function getProducts($id_lang, $p, $n, $order_by = null, $order_way = null, $get_total = false, $active = true, $random = false, $random_number_products = 1, $check_access = true, Context $context = null) { if (!$context) $context = Context::getContext(); if ($check_access && !$this->checkAccess($context->customer->id)) return false; $front = true; if (!in_array($context->controller->controller_type, array('front', 'modulefront'))) $front = false; if ($p < 1) $p = 1; if (empty($order_by)) $order_by = 'position'; else $order_by = strtolower($order_by); if (empty($order_way)) $order_way = 'ASC'; if ($order_by == 'id_product' || $order_by == 'date_add' || $order_by == 'date_upd' || $order_by == 'reference') $order_by_prefix = 'p'; elseif ($order_by == 'name') $order_by_prefix = 'pl'; elseif ($order_by == 'manufacturer') { $order_by_prefix = 'm'; $order_by = 'name'; } elseif ($order_by == 'position') $order_by_prefix = 'cp'; if ($order_by == 'price') $order_by = 'orderprice'; if (!Validate::isBool($active) || !Validate::isOrderBy($order_by) || !Validate::isOrderWay($order_way)) die (Tools::displayError()); $id_supplier = (int)Tools::getValue('id_supplier'); if ($get_total) { $sql = 'SELECT COUNT(cp.`id_product`) AS total FROM `'._DB_PREFIX_.'product` p '.Shop::addSqlAssociation('product', 'p').' LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON p.`id_product` = cp.`id_product` WHERE cp.`id_category` = '.(int)$this->id. ($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : ''). ($active ? ' AND product_shop.`active` = 1' : ''). ($id_supplier ? 'AND p.id_supplier = '.(int)$id_supplier : ''); return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); } $sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, product_attribute_shop.`id_product_attribute`, product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity, 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`, image_shop.`id_image`, il.`legend`, m.`name` AS manufacturer_name, cl.`name` AS category_default, DATEDIFF(product_shop.`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, product_shop.price AS orderprice FROM `'._DB_PREFIX_.'category_product` cp LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product` '.Shop::addSqlAssociation('product', 'p').' LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product`) '.Shop::addSqlAssociation('product_attribute', 'pa', false, 'product_attribute_shop.`default_on` = 1').' '.Product::sqlStock('p', 'product_attribute_shop', false, $context->shop).' LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (product_shop.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').') 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` i ON (i.`id_product` = p.`id_product`)'. Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').' 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_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer` WHERE product_shop.`id_shop` = '.(int)$context->shop->id.' AND (pa.id_product_attribute IS NULL OR product_attribute_shop.id_shop='.(int)$context->shop->id.') AND (i.id_image IS NULL OR image_shop.id_shop='.(int)$context->shop->id.') AND cp.`id_category` = '.(int)$this->id .($active ? ' AND product_shop.`active` = 1' : '') .($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '') .($id_supplier ? ' AND p.id_supplier = '.(int)$id_supplier : ''); if ($random === true) { $sql .= ' ORDER BY RAND()'; $sql .= ' LIMIT 0, '.(int)$random_number_products; } else $sql .= ' ORDER BY stock.quantity>0 desc, '.(isset($order_by_prefix) ? $order_by_prefix.'.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way).' LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n; $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); if (!$result) return array(); return Product::getProductsProperties($id_lang, $result); } } Edited August 4, 2019 by jeromecollection modif (see edit history) Link to comment Share on other sites More sharing options...
Mediacom87 Posted August 4, 2019 Share Posted August 4, 2019 Il y a 6 heures, jeromecollection a dit : $sql .= ' ORDER BY stock.quantity>0 desc, '.(isset($order_by_prefix) ? $order_by_prefix.'.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way).' Il faut donc travailler sur cette ligne Link to comment Share on other sites More sharing options...
jeromecollection Posted August 10, 2019 Author Share Posted August 10, 2019 (edited) merci ! j'ai recherché : https://solidfoundationwebdev.com/blog/posts/how-to-easily-do-a-natural-sort-with-sql mais en mettant $sql .= ' ORDER BY reference+0 ca ne fonctionne pas Edited August 10, 2019 by jeromecollection (see edit history) Link to comment Share on other sites More sharing options...
jeromecollection Posted June 7, 2020 Author Share Posted June 7, 2020 Je relance le sujet merci Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now