Jump to content

Aucun produit dans la catégorie quand je change les préf de tri


Recommended Posts

Bonjour à tous,

C'est vraiment étrange, j'ai 3 catégories sur mon site, toutes pleines de produits, qui s'affichent normalement quand je ne touche pas au réglage de tri dans Préférences->Produits->Tri par défaut.

Mais dès que je fais un autre choix que "position dans la catégorie", aucun produit ne s'affichent.

Il y a bien affiché "il y a 35 produits" à droite du nom de la catégorie, mais en dessous, j'ai le message "Il n'y a aucun produit dans cette catégorie.".

J'ai essayé de changer le nombre de produit par page et l'ordre de tri, mais rien y fait. C'est seulement en sélectionnant à nouveau "position dans la catégorie" que les produits s'affichent à nouveau.

Je suis en 1.4.5.1, le cache n'est pas activé, et je n'ai pas ce problème avec un autre site lui aussi en 1.4.5.1

Donc je suppose que quelque chose a dû mal se passer avec ce site. La seule différence notable d'avec l'autre est que j'ai installé le thème "prestashop_new". Est-ce que l'un des modules qui vient avec ce thème poserait un problème avec le tri ?

Merci.

Link to comment
Share on other sites

J'ai activé l'affichage des erreurs, et voici la raison :


Unknown column 'cp.date_add' in 'order clause'<br /><br /><pre>SELECT p.id_product, p.on_sale, p.out_of_stock, p.available_for_order, p.quantity, p.minimal_quantity, p.id_category_default, p.customizable, p.show_price, p.`weight`,
		p.ean13, pl.available_later, pl.description_short, pl.link_rewrite, pl.name, i.id_image, il.legend,  m.name manufacturer_name, p.condition, p.id_manufacturer,
		DATEDIFF(p.`date_add`,
		DATE_SUB(NOW(), INTERVAL 360 DAY)) > 0 AS new
		FROM `ps_category_product` cp
		LEFT JOIN ps_category c ON (c.id_category = cp.id_category)
		LEFT JOIN `ps_product` p ON p.`id_product` = cp.`id_product`
		LEFT JOIN ps_product_lang pl ON (pl.id_product = p.id_product)
		LEFT JOIN ps_image i ON (i.id_product = p.id_product AND i.cover = 1)
		LEFT JOIN ps_image_lang il ON (i.id_image = il.id_image AND il.id_lang = 2)
		LEFT JOIN ps_manufacturer m ON (m.id_manufacturer = p.id_manufacturer)
		WHERE p.`active` = 1 AND c.nleft >= 2 AND c.nright <= 3 AND pl.id_lang = 2
		AND p.id_product IN (5,12,13,17,19,22,24,25,27,29,30,31,32,35,36,38,39,41,42,48,49,50,52,53,54,55,56,57,58,59,60,61,63,65,66) GROUP BY p.id_product ORDER BY cp.date_add asc LIMIT 0,10

Et en effet, le champ date_add n'est pas dans la table category_product, mais dans la table product.

Comme le tri est par défaut sur "position dans la catégorie", et que ce champ là est bien dans la table category_product, tout se passe comme si en changeant la pref, àa change seulement le nom du champ sans changer en même temps la table.

Mais comment diable ce bug peut-il être présent seulement sur ce site ???

Link to comment
Share on other sites

J'ai trouvé ! c'est le block navigation à facette qui provoque ça. Dès que je le désactive, ça fonctionne. Et mon autre site qui fonctionne normalement ne l'a pas.

Et en effet, quand on regarde dans blocklayered.php, dans la fonction getProductByFilter, à la ligne 2000, on a

GROUP BY p.id_product ORDER BY '.Tools::getProductsOrder('by', Tools::getValue('orderby'), true).' '.Tools::getProductsOrder('way', Tools::getValue('orderway')).

on voit que le critère de tri est appelé sans préciser le nom de la table. Alors que partout ailleurs, il y a un test pour avoir la bonne table, comme par exemple dans la classe Category :

	if (empty($orderWay))
		$orderWay = 'ASC';
	if ($orderBy == 'id_product' OR	$orderBy == 'date_add')
		$orderByPrefix = 'p';
	elseif ($orderBy == 'name')
		$orderByPrefix = 'pl';
	elseif ($orderBy == 'manufacturer')
	{
		$orderByPrefix = 'm';
		$orderBy = 'name';
	}
	elseif ($orderBy == 'position')
		$orderByPrefix = 'cp';

	if ($orderBy == 'price')
		$orderBy = 'orderprice';

on dirait bien un bug, non ?

Link to comment
Share on other sites

Ah non, c'est pas ça. La fonction Tools::getProductOrdre est bien censée retournée le nom du champ ET le nom de la table.

Le problème vient du fait que le nom du champ n'est pas passé correctement. En effet, dans ce contexte, Tools::getValue('orderby') ne retourne rien, parce que l'ordre n'est pas passé en paramètre de la page.

Je me demande si ce n'est pas du au fait que ma page d'accueil est une page catégorie... je vais tester ça de suite...

Link to comment
Share on other sites

Non, ce n'est pas ça.

En fait, je dirais que le problème, c'est que la fonction getProductByFilter de la navigation à facette est appelée, alors qu'on ne l'a pas solicitée. Et comme elle s'attend à avoir un critère de tri dans $_POST, et ben ça marche pô.

Tools::getProductOrdre récupère la valeur de pref si le paramètre est vide, mais le fait après avoir décidé la table concernée, d'où le dysfonctionnement. Si je modifie Tools pour que le préfixe de table soit spécifié après avoir récupéré la valeur par défaut, ça devrait fonctionner...

Mais a priori, c'est toujours un bug, non ?

Il faudrait tester sur une fresh install, pour voir.

Link to comment
Share on other sites

Je viens d'essayer sur une fresh install, et ça le fait. Le bug est donc avéré. Pour le reproduire, c'est simple :

1. Installer PS

2. Activer le module Navigation à Facette

3. Configurer le bloc Navigation à facette (n'importe quelle config le fait)

4. Aller dans Préférences->produits->Tri par défaut, et sélectionner n'importe quel choix autre que "position".

5. Aller dans le FO, et cliquer sur une catégorie

6. Le message "aucun produit dans cette catégorie s'affiche".

 

Le bug est soit dans le fait que getProductByFilter ne devrait pas être appelé à ce stade (vu qu'aucun filtre n'est appliqué). S'il faut bien l'appeler, il suffit de modifier la fonction Tools::getProductOrdre de façon à ce que le champ soit récupéré avant de déterminer la table correcte.

Par exemple, si je réécris la fonction de cette façon :


public static function getProductsOrder($type, $value = null, $prefix = false)
{
switch ($type)
{
case 'by' :
$value = (is_null($value) || $value === false || $value === '') ? (int)Configuration::get('PS_PRODUCTS_ORDER_BY') : $value;
$list = array(0 => 'name', 1 => 'price', 2 => 'date_add', 3 => 'date_upd', 4 => 'position', 5 => 'manufacturer_name', 6 => 'quantity');
$value = (isset($list[$value])) ? $list[$value] : ((in_array($value, $list)) ? $value : 'position');

$orderByPrefix = '';
if($prefix) {
if ($value == 'id_product' || $value == 'date_add' || $value == 'price')
$orderByPrefix = 'p.';
elseif ($value == 'name')
$orderByPrefix = 'pl.';
elseif ($value == 'manufacturer')
$orderByPrefix = 'm.';
elseif ($value == 'position' || empty($value))
$orderByPrefix = 'cp.';
}

return $orderByPrefix.$value;
break;

case 'way' :
$value = (is_null($value) || $value === false || $value === '') ? (int)Configuration::get('PS_PRODUCTS_ORDER_WAY') : $value;
$list = array(0 => 'asc', 1 => 'desc');
return ((isset($list[$value])) ? $list[$value] : ((in_array($value, $list)) ? $value : 'asc'));
break;
}
}

cela fonctionne.

J'ai posté un rapport de bug là : http://forge.prestashop.com/browse/PSCFI-4020

Link to comment
Share on other sites

Je viens de trouver ce thread, avec une version mise à jour de Tools.php qui intègre exactement la correction que j'ai proposée ci-dessus

http://www.prestashop.com/forums/topic/138036-mise-a-jour-du-module-navigation-a-facettes-pour-1451-uniquement/

Je vous jure que je n'avais pas vu ce thread avant. J'avais pourtant retourné le forum dans tous les sens pour trouver une solution à mon problème, et je ne sais pas pourquoi, je ne suis pas tombé sur ce thread... J'ai donc passé au moins 2h à chercher une solution qui était postée à 2 clics de souris de là... Et moi qui était si fier de moi... :rolleyes:

Link to comment
Share on other sites

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