Jump to content

-Astuce-Comment créer un Tri personnalisé en Prestashop 1.5


Recommended Posts

Une question fréquemment posée est de savoir comment créer un tri personnalisé. Donc, aujourd'hui, nous allons montrer comment faire cela. À la fin de l'article, vous pouvez télécharger le module prêt à l'emploi et template personnalisé product-sort.tpl. A titre d'exemple, nous allons ajouter un nouveau tri pour le champ EAN13.

 

Il n'est pas nécessaire d'afficher le code du module entier. C'est pourquoi nous allons simplement mettre en évidence les points principaux . Alors, comment les produits associés Prestashop fonctionnent avec la page de catalogue? Il y a une fonction assignProductList dans le contrôleur CategoryController qui en est responsable. Ci-dessous vous pouvez voir la partie du code qui est chargée de définir les produits pour une catégorie.

 

 

$hookExecuted = false;
	Hook::exec('actionProductListOverride', array(
		'nbProducts' => &$this->nbProducts,
		'catProducts' => &$this->cat_products,
		'hookExecuted' => &$hookExecuted,
	)); //a very important hook for our module. We will use it.

	// The hook was not executed, standard working
	if (!$hookExecuted)
	{
		$this->context->smarty->assign('categoryNameComplement', '');
		$this->nbProducts = $this->category->getProducts(null, null, null, $this->orderBy, $this->orderWay, true);
		$this->pagination((int)$this->nbProducts); // Pagination must be call after "getProducts"
		$this->cat_products = $this->category->getProducts($this->context->language->id, (int)$this->p, (int)$this->n, $this->orderBy, $this->orderWay); //If the hook has not been executed, then starts the standard function of the class Category::getProducts
	}

 

Pour nos fins, nous allons créer un module avec le nom: belvg_customsortexample et l'enregistrer pour ce hook:

 

 

public function hookActionProductListOverride($params)
{
	$id_category = Tools::getValue('id_category'); 
	$id_lang = $this->context->language->id; 
	$id_shop = $this->context->shop->id;
	$categoryObj = new Category($id_category, $id_lang, $id_shop);
	$n = abs((int)(Tools::getValue('n', ((isset($this->context->cookie->nb_item_per_page) && $this->context->cookie->nb_item_per_page >= 10) ? $this->context->cookie->nb_item_per_page : (int)Configuration::get('PS_PRODUCTS_PER_PAGE')))));
	$p = abs((int)Tools::getValue('p', 1));
	$order_by_values = array(0 => 'name', 1 => 'price', 2 => 'date_add', 3 => 'date_upd', 4 => 'position', 5 => 'manufacturer_name', 6 => 'quantity', 7 => 'ean13');		
	$order_way_values = array(0 => 'asc', 1 => 'desc');
	$orderBy = Tools::strtolower(Tools::getValue('orderby', $order_by_values[(int)Configuration::get('PS_PRODUCTS_ORDER_BY')])); //here it is assumed that we get a new value for sorting
	$orderWay = Tools::strtolower(Tools::getValue('orderway', $order_way_values[(int)Configuration::get('PS_PRODUCTS_ORDER_WAY')]));

	$params['catProducts'] = $categoryObj->getProducts($id_lang, (int)$p, (int)$n, $orderBy, $orderWay);
	$params['hookExecuted'] = TRUE; //please note that if this value is not set as TRUE , then in any case  the standard method Category::getProducts  is called
}

 

Nous avons aussi besoin de modifier le comportement de la fonctionne getProducts de la classe Category et la fonctionne productSort du contrôleur CategoryController. Ici, nous allons mettre en évidence que les points principaux, qui sont nécessaires pour le bon fonctionnement de notre module:

 

 

 

Category::getProducts() :
if ($order_by == 'id_product' || $order_by == 'date_add' || $order_by == 'date_upd' || $order_by == 'ean13') //added ean13
$order_by_prefix = 'p'; 
CategoryController:: productSort() :
$order_by_values = array(0 => 'name', 1 => 'price', 2 => 'date_add', 3 => 'date_upd', 4 => 'position', 5 => 'manufacturer_name', 6 => 'quantity', 7 => 'ean13'); //custom ean13 field

 

Et la dernière étape consiste à modifier le template product-sort.tpl. Nous avons besoin d'ajouter des options pour ean13 dans html element select:

 

 

{*custom ean13 field*}
<option value="ean13:asc" {if $orderby eq 'ean13' AND $orderway eq 'asc'}selected="selected"{/if}>{l s='EAN13: A to Z'}</option>
<option value="ean13:desc" {if $orderby eq 'ean13' AND $orderway eq 'desc'}selected="selected"{/if}>{l s='EAN13: Z to A'}</option>

 

Comme résultat un nouveau classement a été créé.

 

Téléchargez belvg_customsortexample.zip et product-sort.tpl.

  • Like 1
Link to comment
Share on other sites

  • 4 months later...
  • 1 month later...

Bonjour,

 

Je voudrais ajouter un nouveau champ date de représentation dans le tri de la page catégorie. J'ai le module navigation à facettes dans la colonne de gauche de la page catégorie.

 

J'ai ajouté  le hook (hookActionProductListOverride) dans la classe blocklayered.php

 

Comme tu as indiqué ci-dessus j'ai modifié les fonctions productSort() et getProducts() et ajouté le champ dans le product-sort.tpl

 

Mais le tri par date de représentation ne fonctionne pas, il  fait le tri  par date d'ajout (qui est le tri par defaut).

 

Est-ce que j'aurai oublié quelques choses?

 

Merci pour ta réponse.

 

Cordialement,
   

Link to comment
Share on other sites

le champ ean13 est bien un champ de la table ps_product? est-ce qu'il faut aussi le rajouter dans la table ps_product_shop?

 

Est-ce que vous avez déjà essayé votre surcharge en ayant aussi le module navigation à facettes sur la page catégorie?

 

Je travaille sous Prestashop 1.5.5

 

Merci

Link to comment
Share on other sites

  • 2 weeks later...

Bonjour Valérie
je suis très intéressé par votre manip, car je voudrais moi aussi ajouter un champs dans le menu déroulant tri.

Pour ma part, c'est le champs description_short que je veux ajouter.

Mais j'ai un peu de mal avec vos manip, sur une version de démo de prestashop (http://graffiti-studio.com/) j'ai mis textuellement vos fichiers fournis, mais ça ne fonctionne pas. le seul fichier dont je ne suis pas sure de comprendre comment l'utiliser et où le placer dans le site c'est belvg_customsortexample.php.

Donc dans un premier temps j'aimerais arriver à faire fonctionner votre manip puis ensuite l'adapter au champs description_short, et d'ailleurs pour cela, le faite de remplacer les termes EAN13 par description_short suffira-t-il ?

merci beaucoup d'avance pour votre réponse

 

cordialement

Sébastien

Link to comment
Share on other sites

C'est le champs description courte que je veux utiliser et les premières lettres de celui-ci.

Depuis mon message, j'ai réussi à tout faire, mise à part un petit souci !
Je ne peux pas utiliser d'option dans le champs, du genre texte bold, car à ce moment la le code html prend le dessus au niveau du classement sur le texte.

Peut être y a t il une solution pour contrer cela ?

 

cordialement

Link to comment
Share on other sites

  • 2 weeks later...
  • 2 months later...

Salut,

 

merci pour ton module il est parfait.

Pour ma part j'ai ajouté un tri "nouveaux produits" qui tri l'id des produits du plus grand au plus petit.

 

Il y a juste un petit souci: lorsque je sélectionne une catégorie, il ne me donne pas le nombre total de produits qu'il y a dans cette catégorie. Il se contente juste de me donner le nombre de produits que j'ai sélectionné par page. De plus, il est impossible de naviguer entre les pages car les flèches qui le permettent sont absentes.

 

Autre petit souci: le module ne fonctionne pas dans la page nouveau produits.

 

Merci pour ton aide.

 

A bientôt.

Link to comment
Share on other sites

Salut,

 

Merci pour ton aide.

 

j'utilise le thème par défaut de Prestashop.

Le nombre total de produit s'affiche si le module est installé mais pas activé. Par contre si je l'active, l'affichage du nombre de produit bug de nouveau.

Link to comment
Share on other sites

  • 1 month later...
  • 4 months later...

Bonjour

merci pour ce module il fonctionne parfaitement sauf que lorsque la navigation a facette est active ca ne fonctionne plus du tout et les produit sont triés en fonction des références ce qui n'arrange pas vraiment mes affaire ;-).

Avez vous une solution ou une piste pour éviter ce genre de bug?

Par avance merci beaucoup.

yann

Link to comment
Share on other sites

  • 3 years 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...