Jump to content

[Résolu] Navigation à facettes déclinaison et prix annonce multiversion


Recommended Posts

Edit: problème cité dans la forge, surement résolu lors d'un prochaine maj ... donc topic clos pas de solution à ce jour.

 

 

Bonjour,

 

Il y a quelques chose qui me paraît illogique dans la navigation à facettes avec le critère de prix, je m'explique.

 

1er Cas:

 

Vous avez un produit comme une clé usb qui a 3 capacités 16 / 32 / 64go par exemple.

 

Il y a donc 3 prix pour le même produit disons 20 / 50 / 100€.

 

Lorsque vous regardez la proposition de tri par critères de prix de la navigation à facette, il n'y a que le montant du produit configuré par défaut qui est à 20€ dans mon exemple qui sera pris en compte par le critère de prix et pas les versions à 50 et 100€ dans le comparateur, ce n'est pas normal.

 

Le comparateur n'affichera donc q'une fourchette de 0 à 20€ vu que les autres produits ne sont pas pris en compte.

 

On peut en déduire qu'on ne peut pas utiliser le critère de prix pour les annonces multiversion ce qui oblige de faire une annonce pour chaque version produit et donc un magnifique duplicate content.

 

Ce critère est donc inutilisable alors que la navigation à facette est faite pour les boutique ayant beaucoup de produits et en général des déclinaisons.

 

Il faut que le critère de tri par prix prenne en compte les déclinaisons produits et pas que le produit qui s'affiche par défaut.

 

Il faudrait afficher "à partir de 20€" à "50€" dans les mignature qui s'affichent lors de la recherche par critère qui me semble le plus simple et logique.

 

Le client est donc informé qu'il y a plusieurs déclinaisons du produit avec un prix mini et max sans devoir cliquer sur l'annonce pour avoir l'information.

 

La fiche de vente au final resterait la même.

 

2eme cas:

 

Prenons le critères de taille S / M / L. soit 10 / 30 / 50€

 

1 prix différent par taille, si on sélectionne le critère dans la navig à facette taille M, eh bien c'est encore le produit par défaut configuré (en général le S) qui va apparaître avec le prix du S et non du M.

 

Ça n'est pas normal non plus et j'imagine le client qui clique, super affiché 10€ sur la mignature, une fois arrivé sur l'annonce sa taille coûte 30€, hop salut abandon direct car le client crois qu'on a tenté de le... enfin vous voyez...

 

Le client choisi M c'est donc la photo et le prix du M qui doit s'afficher pas autre chose.

 

J'aimerais avoir vos avis sur ce détail qui mérite qu'on s'y penche sérieusement car le prix est quand même un des principaux levier et critère de tri sur les sites ainsi que les taille mais ça peut s'appliquer à tous les autres critères.

 

Comme d'habitude mode pavé mais j'ai pas réussit à faire plus court.

 

merci pour votre participation.

Edited by lechapelier (see edit history)
Link to comment
Share on other sites

  • 5 months later...
  • 4 months later...

Bonjour,

 

je relance car l'installation du module navigation a facette modifie de facon erronnee le prix d'un produit ayant des declinaisons.

C'est toujours le prix le plus eleve qui est affiche sur le produit et non pas celui de la declinaison par defaut.

C'est un bug majeur car le prix du filtre et celui affiche sur le produit est different et le client n'y comprend plus rien.

 

Si il recherche un produit entre 10 et 20 euros et qu'un produit a une declinaison par defaut a 20 euros et une a 40 euros, le produit apparaitra dans la liste mais le prix affiche sur le produit sera de 40 euros! C'est grave pour un module de base..

 

Merci de votre aide.

Link to comment
Share on other sites

J'ai trouve en cherchant un peu dans une query du blocklayered.php un MAX pour les id des declinaison ?!

On veut pas l'id MAX on veut l'id de la declinaison par defaut...

en changeant en ligne 1972 le MAX par pa.id_product_attribute id_product_attribute, et plus loin AND pa.default_on = 1

La on a bien la declinaison par defaut et les prix sont bons...

  • Like 1
Link to comment
Share on other sites

  • 3 weeks later...

Bonjour,

 

Je lis résolu et je me dis chouette sauf que mes yeux ne voient pas la réponse!!!

 

Mon besoin, que le module à facette affiche le bon résultat de la déclinaison et non systématiquement la déclinaison par défaut.

 

Merci par avance pour votre aide.

Pierrick

Link to comment
Share on other sites

  • 2 weeks later...

J'ai trouve en cherchant un peu dans une query du blocklayered.php un MAX pour les id des declinaison ?!

On veut pas l'id MAX on veut l'id de la declinaison par defaut...

en changeant en ligne 1972 le MAX par pa.id_product_attribute id_product_attribute, et plus loin AND pa.default_on = 1

La on a bien la declinaison par defaut et les prix sont bons...

 

Qu'as-tu changé exactement dans cette requête ?

Je n'arrive pas à effectuer tes changements, tes explications sont un peu vague...

 


l.1981 : MAX(product_attribute_shop.id_product_attribute)


remplacé par pa.id_product_attribute. 

C'est bien ça ?

 



Et le "AND pa.default_on = 1" on en fait quoi ?

Edited by sellas (see edit history)
Link to comment
Share on other sites

Salut,

Pour afficher le prix de la déclinaison par défaut :

Vers la ligne 1991 (PS 1.5.6.2) du fichier blocklayered.php du module, ajouter la clause suivante sur pa.default_on :

AND c.active = 1
AND p.id_product IN ('.implode(',', $product_id_list).')
AND (pa.default_on = 1 OR ISNULL(pa.default_on))
GROUP BY product_shop.id_product

Pas besoin de toucher à l'id max, avec la modif, le max n'a plus d'incidence.

 

Et pas oublier le second test ISNULL sinon ça va buger sur les produits sans déclinaisons ;)

Link to comment
Share on other sites

Salut,

 

Pour afficher le prix de la déclinaison par défaut :

 

Vers la ligne 1991 (PS 1.5.6.2) du fichier blocklayered.php du module, ajouter la clause suivante sur pa.default_on :

AND c.active = 1
AND p.id_product IN ('.implode(',', $product_id_list).')
AND (pa.default_on = 1 OR ISNULL(pa.default_on))
GROUP BY product_shop.id_product

Pas besoin de toucher à l'id max, avec la modif, le max n'a plus d'incidence.

 

Et pas oublier le second test ISNULL sinon ça va buger sur les produits sans déclinaisons ;)

 

Merci beaucoup, cela fonctionne en effet !

Link to comment
Share on other sites

Up

+ Quelqu'un a-t-il pu mettre en place le système permettant d'afficher l'image et le prix des produits dans le résultat de recherche après sélection critère dans navigation à facette ? 

Par exemple si je sélectionne la couleur bleu alors tous mes produits ayant ce critère affiche l'image du produit ayant la declinaison bleu + le prix qui lui est alloué si celui-ci est différent de mon produit par défaut.

 

J'espère avoir été assez clair dans mon explication.

 

Merci

Link to comment
Share on other sites

  • 11 months later...

Bonjour,

Je ne connais pas Prestashop

je déconseille même de faire ce qui suit mais bon parfois on n'a pas trop le choix 

Pour avoir le prix qui correspond au critère choisi dans la blocklayred, faut ajouter qqs lignes toujours dans la meme requete vers la ligne 1990 du fichier.

 

les lignes concernées sont: 1 à 8 - 25 - 39

$res = '';
$selectedF =$this->getSelectedFilters();
if (isset($selectedF['id_attribute_group'])) {
    $filter_value = $selectedF['id_attribute_group'];
    $myKeys = array_keys($filter_value);
    $res = $myKeys[0];
}

if ($this->nbr_products == 0)
	$this->products = array();
else
{
	$n = (int)Tools::getValue('n', Configuration::get('PS_PRODUCTS_PER_PAGE'));
	$nb_day_new_product = (Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20);

    $this->products = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
    SELECT
    	p.*,
    	'.($alias_where == 'p' ? '' : 'product_shop.*,' ).'
    	'.$alias_where.'.id_category_default,
    	pl.*,
    	MAX(image_shop.`id_image`) id_image,
    	il.legend, 
    	m.name manufacturer_name,' .
    	($res != '' ?'MAX(pac.id_product_attribute) id_product_attribute' : 'MAX(product_attribute_shop.id_product_attribute) id_product_attribute'). ',
		DATEDIFF('.$alias_where.'.`date_add`, DATE_SUB(NOW(), INTERVAL '.(int)$nb_day_new_product.' DAY)) > 0 AS new,
		stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity
	FROM `'._DB_PREFIX_.'category_product` cp
	LEFT JOIN '._DB_PREFIX_.'category c ON (c.id_category = cp.id_category)
	LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product`
	'.Shop::addSqlAssociation('product', 'p').'
	'.Product::sqlStock('p', null, false, Context::getContext()->shop).'
	LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = p.id_product'.Shop::addSqlRestrictionOnLang('pl').' AND pl.id_lang = '.(int)$cookie->id_lang.')
	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)$cookie->id_lang.')
	LEFT JOIN '._DB_PREFIX_.'manufacturer m ON (m.id_manufacturer = p.id_manufacturer)
	LEFT JOIN '._DB_PREFIX_.'product_attribute pa ON (p.id_product = pa.id_product)' .
	($res != '' ? 'LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac on (pa.id_product_attribute = pac.id_product_attribute) AND pac.id_attribute = ' . $res : $res) .
	Shop::addSqlAssociation('product_attribute', 'pa', false, 'product_attribute_shop.`default_on` = 1').'
	WHERE '.$alias_where.'.`active` = 1 AND '.$alias_where.'.`visibility` IN ("both", "catalog")
	AND '.(Configuration::get('PS_LAYERED_FULL_TREE') ? 'c.nleft >= '.(int)$parent->nleft.' AND c.nright <= '.(int)$parent->nright : 'c.id_category = '.(int)$id_parent).'
	AND c.active = 1
	AND p.id_product IN ('.implode(',', $product_id_list).')
	GROUP BY product_shop.id_product
	ORDER BY '.Tools::getProductsOrder('by', Tools::getValue('orderby'), true).' '.Tools::getProductsOrder('way', Tools::getValue('orderway')).
	' LIMIT '.(((int)$this->page - 1) * $n.','.$n));
}

Si lorsqu'on clique sur voir le produit, ça nous affiche le produit par défaut et non la declinaison, faut ajouter la ligne suivante dans blocklayered.js à la ligne 637

//'ul#product_list li.ajax_block_product div.right_block a.button,'+
function updateProductUrl()
{
	// Adding the filters to URL product
	if (typeof(param_product_url) != 'undefined') {
		$.each($('ul#product_list li.ajax_block_product .product_img_link,'+
				'ul#product_list li.ajax_block_product h3 a,'+
				'ul#product_list li.ajax_block_product .product_desc a,'+
				'ul#product_list li.ajax_block_product div.right_block a.button,'+
				'ul#product_list li.ajax_block_product .lnk_view'), function() {
			$(this).attr('href', $(this).attr('href') + param_product_url);
		});
	}
}

J’espère que ça va aider

Edited by graandayzar (see edit history)
Link to comment
Share on other sites

  • 4 months later...
  • 5 years later...
Guest
This topic is now closed to further replies.
×
×
  • Create New...