Trier les caractéristiques sous Prestashop

Un membre du forum Prestashop m’a effectué la demande suivante : « Comment peut-on trier les caractéristiques ? », car par défaut on ne peut pas les ordonner ce qui parfois peut être contraignant. Nous allons voir ensemble la méthode la plus simple pour arriver à mettre en place un tri.



Le concept

Voilà le principe que l’on va utiliser pour pouvoir trier nos caractéristiques, on va préfixer les caractéristiques avec 01., 02., 03. etc… pour obtenir 01.Caractéristique 1, 02.Caractéristique 2, 03.Caractéristique 3. Ensuite lors de l’affichage on va tout simplement retirer le préfixe et afficher uniquement le texte de la caractéristique. Cela vous rappelle quelque chose ? C’est normal, il me semble qu’à une époque le tri des catégories de Prestashop fonctionnait de cette manière.

Notre cas
Par exemple sur notre fiche produit, « Ipod Nano » on aimerait avoir un tri différent de ce qui est affiché dans la fiche technique. J’aimerais avoir par exemple :
1) Poids
2) Prise Casque
3) Largeur
4) Hauteur
5) Profondeur

C’est parti !
Pour commencer on va préfixer nos caractéristiques comme ci-dessous.

Ensuite  il faut « désactiver le cache » et « forcer la compilation » sous l’onglet « préférences->performances ».

Ensuite on va modifier le tri des caractéristiques, en modifiant la méthode « getFrontFeaturesStatic » de la classe « Product.php« , vers la ligne « 2700 » remplacez le code suivant :

		self::$_frontFeaturesCache[$id_product.'-'.$id_lang] = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
			SELECT name, value, pf.id_feature
			FROM '._DB_PREFIX_.'feature_product pf
			LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.')
			LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.(int)$id_lang.')
			WHERE pf.id_product = '.(int)$id_product);

par

self::$_frontFeaturesCache[$id_product.'-'.$id_lang] = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
			SELECT name, value, pf.id_feature
			FROM '._DB_PREFIX_.'feature_product pf
			LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.')
			LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.(int)$id_lang.')
			WHERE pf.id_product = '.(int)$id_product.' ORDER BY fl.`name` ASC');

Ensuite dans le fichier « product.tpl » vers la ligne « 426 » remplacez le code suivant :

	{foreach from=$features item=feature}
			<li><span>{$feature.name|escape:'htmlall':'UTF-8'}</span> {$feature.value|escape:'htmlall':'UTF-8'}</li>
	{/foreach}

par

	{foreach from=$features item=feature}
                        {if $feature.name|substr:2:1=='.'}
                            <li><span>{$feature.name|escape:'htmlall':'UTF-8'|substr:3}</span> {$feature.value|escape:'htmlall':'UTF-8'}</li>
                        {elseif $feature.name|substr:3:1=='.'}
                            <li><span>{$feature.name|escape:'htmlall':'UTF-8'|substr:4}</span> {$feature.value|escape:'htmlall':'UTF-8'}</li>
                        {elseif $feature.name|substr:4:1=='.'}
                            <li><span>{$feature.name|escape:'htmlall':'UTF-8'|substr:5}</span> {$feature.value|escape:'htmlall':'UTF-8'}</li>
                        {else}
                            <li><span>{$feature.name|escape:'htmlall':'UTF-8'}</span> {$feature.value|escape:'htmlall':'UTF-8'}</li>
                        {/if}
	{/foreach}

Regardons ce que ça donne à l’écran à présent, wouaaaa ça marche :).

Pour la comparaison des produits il faut aussi appliquer une modification, dans le fichier de classe « Feature.php » vers la ligne « 205 » remplacez le code suivant :

return Db::getInstance()->ExecuteS('
		SELECT * , COUNT(*) as nb
		FROM `'._DB_PREFIX_.'feature` f
		LEFT JOIN `'._DB_PREFIX_.'feature_product` fp ON f.`id_feature` = fp.`id_feature`
		LEFT JOIN `'._DB_PREFIX_.'feature_lang` fl ON f.`id_feature` = fl.`id_feature`
		WHERE fp.`id_product` IN ('.$ids.')
		AND `id_lang` = '.(int)($id_lang).'
		GROUP BY f.`id_feature`
		ORDER BY nb DESC');

par

return Db::getInstance()->ExecuteS('
		SELECT * , COUNT(*) as nb
		FROM `'._DB_PREFIX_.'feature` f
		LEFT JOIN `'._DB_PREFIX_.'feature_product` fp ON f.`id_feature` = fp.`id_feature`
		LEFT JOIN `'._DB_PREFIX_.'feature_lang` fl ON f.`id_feature` = fl.`id_feature`
		WHERE fp.`id_product` IN ('.$ids.')
		AND `id_lang` = '.(int)($id_lang).'
		GROUP BY f.`id_feature`
		ORDER BY fl.`name` ASC');

Ensuite dans le fichier « products-comparison.tpl » vers la ligne « 118 » remplacez le code suivant :

<td class="{$classname}" >
				{$feature.name|escape:'htmlall':'UTF-8'}
</td>

par

		<td class="{$classname}" >
                            {if $feature.name|substr:2:1=='.'}
                                {$feature.name|escape:'htmlall':'UTF-8'|substr:3}
                            {elseif $feature.name|substr:3:1=='.'}
                                {$feature.name|escape:'htmlall':'UTF-8'|substr:4}
                            {elseif $feature.name|substr:4:1=='.'}
                                {$feature.name|escape:'htmlall':'UTF-8'|substr:5}
                            {else}
                              {$feature.name|escape:'htmlall':'UTF-8'}
                            {/if}
			</td>

A l’affichage l’ordre correspond aussi à présent.



Bilan

Voilà une méthode toute simple pour gérer un tri, bien sûr dans l’idéal ça serait d’avoir des petites flèches pour monter et descendre nos caractéristiques, mais cela implique d’autres changement du côté de la base de données. En utilisant cette méthode, on va à l’essentiel et cela vous permet de la mettre en oeuvre rapidement. Si vous désirez effectuer un tri avec les déclinaisons, vous pouvez appliquer le même concept.

Notez mon billet, Google va adorer :
1 étoiles - J'aime pas !2 étoiles - Bof !3 étoiles - Bien !4 étoiles - Très bien !5 étoiles - Génial ! (Soyez le premier à noter ce billet)
Loading...

4 commentaires sur “Trier les caractéristiques sous Prestashop”

  1. Solution intéressante … mais toutefois inadaptée à un client qui n’est pas axé technique. Je trouve cette solution lourde à gérer pour un client, dés lors qu’il y a beaucoup de caractéristiques différentes. Le fait de pouvoir gérer l’ordre par du drag and drop (ou par les petites flèches comme sur d’autres tableaux dans presta) serait un vrai plus. Cependant, je pense que le plus simple serait d’ajouter un éditeur de texte (WYSIWYG) à l’instar de l’onglet « en savoir plus », afin d’être vraiment libre de faire ce que l’on veut.

  2. Bonjour et merci pour ces précieux conseils.

    Cela fonction bien chez moi, mais seulement sur certains produits… Il semble que les derniers saisis (avec l’icone « nouveau ») gardent l’ancien ordre… étrange !

    Sauriez-vous comment mettre à jour aussi ces produits ?

    Merci beaucoup
    Valentine

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *