Jump to content

Navigation À Facette Changer Requete Sql


Recommended Posts

Bonjour à tous,

 

Je suis en train de construire une boutique sur prestashop,

 

J'ai activé la navigation à facette pour certaines de mes catégories.

 

J'ai acheté le module pm multiple features, qui permet d'attribuer plusieurs caractéristiques à un produit

 

Jusque la tout va bien, seulement lorsque j'utilise la navigation à facette et que je coche plusieurs caractéristiques sur mon site les produits se cumul (surement un OU dans la requete SQL, alors que par apport àmon besoin j'aurai besoin de modifié cette requete sql par un ET, afin d'avoir uniquement les produit qui répondent à toutes les caractéristiques choisies et pas seulement à une actuellement.

 

SI quelqu'un à une idée ou une piste... merci d'avance

 

Exemple sur : http://epicetoo.net/14-toutes-les-epices

Share this post


Link to post
Share on other sites

il faudrait demander à ceux qui ont développé le module "multiple features", mais franchement vu le pavé que représente le module navigation à facette, je ne suis pas sûre qu'ils puissent le faire (pas gratuitement en tout cas).

Share this post


Link to post
Share on other sites

Merci pour ta réponse, j'ai demandé au développeur du module a priori il ne touche pas du tout au module navisation a facette, leur module permet juste d'attribuer plusieurs caractéristiques à un produit.

 

Si quelqu'un à une solution je suis preneur, même s'il faut payer ou racheter un module.

 

Dans me fichier blocklayered.php, j'ai trouver vers la ligne 1811 :

 

case 'id_feature':
$sub_queries = array();
foreach ($filter_values as $filter_value)
{
$filter_value_array = explode('_', $filter_value);
if (!isset($sub_queries[$filter_value_array[0]]))
$sub_queries[$filter_value_array[0]] = array();
$sub_queries[$filter_value_array[0]][] = 'fp.`id_feature_value` = '.(int)$filter_value_array[1];
}
foreach ($sub_queries as $sub_query)
{
$query_filters_where .= ' AND p.id_product IN (SELECT `id_product` FROM `'._DB_PREFIX_.'feature_product` fp WHERE ';
$query_filters_where .= implode(' OR ', $sub_query).') ';
}

break; 

 

J'ai essayer de remplacer le OR par un AND, ça ne fonctionne pas.

Share this post


Link to post
Share on other sites

sinon regarde aussi du coté de la ligne 941:
 

				case 'id_feature':
					$features = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
						SELECT fl.name name, fl.id_feature id_name, fvl.id_feature_value id_value, fvl.value value, fl.id_lang, fl.id_lang,
						lifl.url_name name_url_name, lifvl.url_name value_url_name
						FROM '._DB_PREFIX_.'feature_lang fl
						LEFT JOIN '._DB_PREFIX_.'layered_indexable_feature lif ON (lif.id_feature = fl.id_feature)
						INNER JOIN '._DB_PREFIX_.'feature_value fv ON (fv.id_feature = fl.id_feature)
						INNER JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = fv.id_feature_value)
						LEFT JOIN '._DB_PREFIX_.'layered_indexable_feature_lang_value lifl
						ON (lifl.id_feature = fl.id_feature AND lifl.id_lang = '.(int)$filter['id_lang'].')
						LEFT JOIN '._DB_PREFIX_.'layered_indexable_feature_value_lang_value lifvl
						ON (lifvl.id_feature_value = fvl.id_feature_value AND lifvl.id_lang = '.(int)$filter['id_lang'].')
						WHERE fl.id_feature = '.(int)$filter['id_value'].' AND fvl.id_lang = fl.id_lang AND fvl.id_lang = '.(int)$filter['id_lang']
					);

Share this post


Link to post
Share on other sites

  • 1 month later...

Bonjour,
 
j'ai eu le même problème.

 

Le comportement de la navigation à facettes est normal dans la mesure où elle ne prévoit pas la possibilité d'associer plusieurs valeurs d'une même caractéristique à un produit. On s'en rend compte en décortiquant le code de blocklayered.php. Mais il est vrai que le résultat obtenu en front n'est pas logique du coup puisqu'on n'a pas de fonctionnement en entonnoir comme on pourrait s'y attendre.
 
Si tu n'as pas trouvé de solution, voici ce que j'ai fait de mon côté et qui semble fonctionner (j'ai bien dit semble):
 
à la ligne 1823 de blocklayered.php, tu remplace:

$query_filters_where .= implode(' OR ', $sub_query).') ';

par:

$query_filters_where .= implode(' OR ', $sub_query).' GROUP BY id_product HAVING COUNT(*) = '.count($sub_query).') ';

Dis moi si ça fonctionne de ton côté, ça m'aidera à savoir si c'est bon dans mon cas aussi.

Share this post


Link to post
Share on other sites

  • 4 months later...

Bonjour,

 

j'ai testé ta modification mais malheureusement ça ne fonctionne pas pour moi.

 

Je me suis finalement rendu compte que mon filtre devait s'appliquer aux attributs et non aux caractéristiques des produits. Du coup j'ai appliqué ta modification à la ligne 1847 et ca fonctionne!  B)

 

Merci beaucoup.

Share this post


Link to post
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
 Share

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More