Jump to content

Tri par référence ex: AA154 est avant AA55"


Recommended Posts

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 by jeromecollection (see edit history)
Link to comment
Share on other sites

  • 4 weeks later...

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

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

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

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

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 by jeromecollection
modif (see edit history)
Link to comment
Share on other sites

  • 9 months later...

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...