Ajouter une nouvelle option de recherche

3 messages dans ce sujet

Posté(e) · Signaler ce message

Bonjour.

Actuellement, le fichier search.php propose trois options "Tous les mots", "N'importe quel mot", "La phrase exacte".

Je souhaiterai pouvoir y rajouter une autre option qui correspondrait à peu près à "Tous les mots + prix > 10€".

Dans search.php, j'ai donc déclaré la valeur $fields[] = 'p.prix'; afin de pouvoir chercher à ce niveau.

Par contre, ensuite, je ne sais pas ce que je dois faire. Apparemment, il faut changer une partie du code suivant , ou modifier le $cmptype :

/**

* build_terms_clause()

*

* build the sql statement's where clause

* this will build the sql based on the given information

*

* @param mixed $terms

* @param mixed $fields

* @param mixed $match

* @return

*/

function build_terms_clause($terms, $fields, $match)

{

// init

$nb_fields = count($fields);

$nb_terms = count($terms);

$where_clause = ' ( ';

switch ($match) {

// 1 => Tous les mots

// 2 => n'importe quel mots

// 3 => phrase exacte. donc un seul mot, donc on ne se sert pas de cmptype

case 1:

$cmptype = ' AND ';

break;

case 2:

$cmptype = ' OR ';

break;

default:

$cmptype = ' OR ';

}

$compteur_terms = 0;

// construction de la requete

foreach ($terms as $term) {

$compteur_terms++;

// si on a un - devant, alors on ne veut pas du mot

if (substr($term, 0, 1) == "-") {

//on enleve le '-' qu'on convertir en NOT

$term = substr($term, 1);

$notmod = ' NOT ';

} else {

$notmod = '';

}

reset($fields);

$compteur_fields = 0;

$where_clause .= ' ( ';

foreach ($fields as $val) {

$compteur_fields++;

$where_clause .= ' ' . $val . ' ' . $notmod . ' LIKE "%' . nohtml_real_escape_string($term) . '%" ' . "\n";

// si on est à la fin, on ferme la parenthese, sinon "OR"

$where_clause .= ($compteur_fields == $nb_fields ? ' )': 'OR');

}

// si on est à la fin, on ferme la parenthese, sinon $cmptype soit OR ou AND

$where_clause .= ($compteur_terms == $nb_terms ? ' )': $cmptype). "\n";

}

return $where_clause;

}

Pouvez-vous me dire si c'est possible ? Et si oui, comment faire ?

Merci.

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

N'ayant malheureusement pas eu de réponse depuis deux mois, j'ai essayé de contourner la difficulté pour arriver au résultats désiré. Aussi, je me permets de donner ici mon astuce si ça peut aider certaines personnes. Je précise que c'est sous peel 5.7 et non sous la nouvelle version.

Dans le fichier search.php, il faut en premier ajouter une ou plusieurs nouvelle valeur de recherche.

Par exemple :

<option value="4"' . ($match == 4?' selected="selected"':'') . '>10 euros et plus</option>

<option value="5"' . ($match == 5?' selected="selected"':'') . '>Moins de 10 euros</option>

Ensuite, rajouter dans "build_terms_clause()" au dessus de "default:"

case 4 :

$cmptype = ' AND ';

break;

case 5:

$cmptype = ' AND ';

break;

Maintenant passons à mon bricolage maison (il doit y avoir mieux, mais je n'y parviens pas)

Il faut aller dans "build_sql_produits()"

Recopier tout ce qui est contenu entre le "$requete" et le "return $requete", ce qui donne dans mon cas ceci

$requete = 'SELECT DISTINCT(p.id),MAX(c.id) AS categorie_id,c.nom_' . $_SESSION['langue'] . ' AS categorie';

// ajout des champs $fields où $term sera recherché

foreach($fields as $value) {

$requete .= ', ' . $value . ' ';

}

$requete .= 'FROM peel_produits p, peel_produits_categories pc, peel_categories c

WHERE p.id = pc.produit_id AND pc.categorie_id = c.id AND p.etat = "1" AND ' . build_terms_clause($terms, $fields, $match) . '

GROUP BY p.id

ORDER BY p.reference DESC, p.id DESC

LIMIT 100';

return $requete;

A présent, on se sert de la variable $match pour remplacer tout le contenu de la requête par ceci :

if ($match == 4) {

$requete = 'SELECT DISTINCT(p.id),MAX(c.id) AS categorie_id,c.nom_' . $_SESSION['langue'] . ' AS categorie';

// ajout des champs $fields où $term sera recherché

foreach($fields as $value) {

$requete .= ', ' . $value . ' ';

}

$requete .= 'FROM peel_produits p, peel_produits_categories pc, peel_categories c

WHERE p.id = pc.produit_id AND pc.categorie_id = c.id AND p.etat = "1" AND ' . build_terms_clause($terms, $fields, $match) . ' AND p.prix >= 10

GROUP BY p.id

ORDER BY p.reference DESC, p.id DESC

LIMIT 100';

return $requete;

}

if ($match == 5) {

$requete = 'SELECT DISTINCT(p.id),MAX(c.id) AS categorie_id,c.nom_' . $_SESSION['langue'] . ' AS categorie';

// ajout des champs $fields où $term sera recherché

foreach($fields as $value) {

$requete .= ', ' . $value . ' ';

}

$requete .= 'FROM peel_produits p, peel_produits_categories pc, peel_categories c

WHERE p.id = pc.produit_id AND pc.categorie_id = c.id AND p.etat = "1" AND ' . build_terms_clause($terms, $fields, $match) . ' AND p.prix < 10

GROUP BY p.id

ORDER BY p.reference DESC, p.id DESC

LIMIT 100';

return $requete;

}

if ($match <= 3) {

$requete = 'SELECT DISTINCT(p.id),MAX(c.id) AS categorie_id,c.nom_' . $_SESSION['langue'] . ' AS categorie';

// ajout des champs $fields où $term sera recherché

foreach($fields as $value) {

$requete .= ', ' . $value . ' ';

}

$requete .= 'FROM peel_produits p, peel_produits_categories pc, peel_categories c

WHERE p.id = pc.produit_id AND pc.categorie_id = c.id AND p.etat = "1" AND ' . build_terms_clause($terms, $fields, $match) . '

GROUP BY p.id

ORDER BY p.reference DESC, p.id DESC

LIMIT 100';

return $requete;

}

Ça n'est peut-être pas très optimisé et lourd, mais au moins ça fonctionne. Faute de mieux... Si vous avez une idée pour optimiser ça, je suis évidemment preneur.

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour,

Dans la version 6.2 qui sort cette semaine, la recherche a été complétée par divers éléments, notamment pour des recherches de prix. Vous pourrez regarder comment c'est fait et récupérer certains morceaux pour votre 5.7 si vous le désirez.

Gilles

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !


Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.


Connectez-vous maintenant

Twitter Advisto ecommerce

Facebook PEEL Shopping