Moteur De Recherche Peel Affine


10 messages dans ce sujet

Posté(e) · Signaler ce message

Bonjour,

 

Je suis sur la version 6.2 et je voudrais savoir s'il etait possible dans le moteur de recherche en haut de la page de lui associer les marques.

 

Par exemple actuellement on a le moteur et on recherche ce que l'on veut, a sa droite un menu deroulant avec les marques on choisit la marque et on obtient les produits inclus dans la marque

 

L'idee serait de pouvoir choisir le type de produit dans le premier champ, puis de choisir sa marque et enfin de cliquer sur le petit ok pour rechercher specifiquement tel produit dans telle marque

 

Exemple VASE marque MENU et on obtient seulement les vases de cette marque

 

et ma 2eme question porte sur la presentation, actuellement les produits s'affichent en colonne est il possible des les afficher en ligne comme les produits dans les categories avec la petite vignette puis le titre et un bout de description en dessous

 

Merci de votre soutien

 

Anh

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour,

 

Pour les marques, il faudra d'abord modifier le formulaire de recherche dans la fonction affiche_menu_recherche, ainsi que la fonction affiche_select_marque. Ensuite, une fois que le formulaire toutes les informations au fichier /search.php, il faut modifier la fonction build_sql_produits en ajoutant le nouveau critère, puis modifier la requête à l'intérieur de cette fonction pour que les produits retournés correspondent aux critères de recherche.

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour Simon,

 

Donc j'ai bien trouve le moteur dans display

 

    function affiche_menu_recherche($return_mode = false, $display_mode = 'header')
    {
        $output = '
<form method="get" action="' . $GLOBALS['wwwroot'] . '/search.php" id="recherche">
    <fieldset>
        <input type="hidden" name="match" value="2" />
        <input type="text" name="search" id="search" value="" />
        <input type="submit" class="bouton_go" value="" name="action" />
        <div id="placement_produit" class="autocomplete"></div>
    </fieldset>
</form>
';
        if ($GLOBALS['site_parameters']['enable_prototype'] == 1) {
            // AUtocompleter, avec patch pour repositionner le div à cause d'un bug connu sur IE : le positionnement se fait mal quand on a des div relative ou absolute
            $output .= '<script type="text/javascript"><!--//--><![CDATA[//><!--
function positionAuto(element, entry) {
    setTimeout( function() {
      Element.clonePosition("placement_produit", "search", {
      "setWidth": false,
      "setHeight": false,
      "offsetTop": $("search").offsetHeight
    } );
  }, 600);
  return entry;
}
new Ajax.Autocompleter(\'search\',\'placement_produit\',\'' . $GLOBALS['wwwroot'] . '/modules/search/produit.php\', {
  minChars: 2,
  callback: positionAuto });
//--><!]]></script>
';
        }
        if ($display_mode == 'header') {
            $output = '
<div id="top_search">' . $output . '';
            if (is_advanced_search_active()) {
                $output .= '' . get_advanced_search_script() . affiche_select_marque(true) . '';
            }
            $output .= '
</div>';
        } else {
            $output = '
<div>' . $output . '';
            if (is_advanced_search_active()) {
                $output .= '' . get_advanced_search_script() . affiche_select_marque(true) . '';
            }
            $output .= '
</div>';
        }
        if ($return_mode) {
            return $output;
        } else {
            echo $output;
        }
    }
 

donc si je comprends bien la premiere partie correspond au moteur en lui dans l'header et dans la seconde partie on retrouve le select des marques.

Vous dites il faudra modifier ce script pour avoir les 2 champs avant le submit c'est bien ca

Pourriez-vous me donner des pistes concretes, mon niveau en php est debutante et meme si je comprends plus ou moins ce qu'il faut faire, le code n'est pas du tout limpide pour moi.

 

pour votre seconde proposition

function build_sql_produits($terms, $fields, $match)
{
    $requete = 'SELECT DISTINCT(p.id)
        ,c.id AS categorie_id
        ,c.nom_' . $_SESSION['session_langue'] . ' AS categorie';
    // ajout des champs $fields où $term sera recherché
    foreach($fields as $value) {
        $requete .= ', ' . $value . ' ';
    }

    $requete .= 'FROM peel_categories c
        INNER JOIN peel_produits_categories pc ON pc.categorie_id = c.id
        INNER JOIN peel_produits p ON p.id = pc.produit_id
        WHERE p.etat = "1" AND ' . build_terms_clause($terms, $fields, $match) . '
        ORDER BY p.id DESC
        LIMIT 100';
    return $requete;
}

 

Voulez-vous dire de rajouter une requete vers les marques a ce niveau la ?

 

Merci de votre soutien

 

Anh

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour,

 

Vous dites il faudra modifier ce script pour avoir les 2 champs avant le submit c'est bien ca :

=> Oui, c'est l'idée. De cette façon l'id de la marque est la valeur du champ de recherche seront envoyé en même temps vers le moteur de recherche.

 

Voulez-vous dire de rajouter une requete vers les marques a ce niveau la ?

=> Oui aussi. Il faut ajouter un paramètre à la fonction build_sql_produits qui contiendra l'id de la marque recherchée, et modifier également build_terms_clause pour prendre en compte ce nouveau paramètre.

De manière général, ce genre de développement nécessite d'avoir un peu d'expérience en PHP. Il vaux mieux ne pas toucher au code du moteur de recherche pour une personne qui découvre le PHP.

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour Simon,

 

Par rapport a vos pistes j'ai commence a modifier cela

 

Page display

 

if (!function_exists('affiche_menu_recherche')) {
    /**
     * affiche_menu_recherche()
     *
     * @param mixed $return_mode
     * @param string $display_mode
     * @return
     */
    function affiche_menu_recherche($return_mode = false, $display_mode = 'header')
    {
        $output = '
<form method="get" action="' . $GLOBALS['wwwroot'] . '/search.php" id="recherche">
    <fieldset>
        <tr><input type="hidden" name="match" value="2" />
        <td><input type="text" name="search" id="search" value="" /></td><td>
                ' .  affiche_select_marque(true) . '
            </td>

        <td><input type="submit" class="bouton_go" value="" name="action" /></td></tr>
        <div id="placement_produit" class="autocomplete"></div>
    </fieldset>
</form>
';
        if ($GLOBALS['site_parameters']['enable_prototype'] == 1) {
            // AUtocompleter, avec patch pour repositionner le div à cause d'un bug connu sur IE : le positionnement se fait mal quand on a des div relative ou absolute
            $output .= '<script type="text/javascript"><!--//--><![CDATA[//><!--
function positionAuto(element, entry) {
    setTimeout( function() {
      Element.clonePosition("placement_produit", "search", {
      "setWidth": false,
      "setHeight": false,
      "offsetTop": $("search").offsetHeight
    } );
  }, 600);
  return entry;
}
new Ajax.Autocompleter(\'search\',\'placement_produit\',\'' . $GLOBALS['wwwroot'] . '/modules/search/produit.php\', {
  minChars: 2,
  callback: positionAuto });
//--><!]]></script>
';
        }
        
        if ($return_mode) {
            return $output;
        } else {
            echo $output;
        }
    }
}

 

Ce qui a pour effet de me mettre le champ recherche suivi du select des marques et le ok (submit)

 

Apres la modification sur la page search je bloque car je ne la comprends pas bien

 

function build_sql_produits($terms, $fields, $match)
{
    $requete = 'SELECT DISTINCT(p.id)
        ,c.id AS categorie_id
        ,c.nom_' . $_SESSION['session_langue'] . ' AS categorie';
    // ajout des champs $fields où $term sera recherché
    foreach($fields as $value) {
        $requete .= ', ' . $value . ' ';
    }

    $requete .= 'FROM peel_categories c
        INNER JOIN peel_produits_categories pc ON pc.categorie_id = c.id
        INNER JOIN peel_produits p ON p.id = pc.produit_id
        WHERE p.etat = "1" AND ' . build_terms_clause($terms, $fields, $match) . '
        ORDER BY p.id DESC
        LIMIT 100';
        
        $requete .= '
        FROM peel_marques m
        WHERE m.etat = "1" AND ' . build_terms_clause($terms, $fields, $match) . '
        ORDER BY m.id DESC
        LIMIT 100';
    return $requete;
}

 

J'ai donc rajoute la requete vers peel_marques ce qui a pour effet de me creer

/search.php?match=2&search=vase&brand=2&action=

 

donc vase est bien pris en compte mais pas la marque

 

J'ai lu sur les forums pour utiliser les multi criteres mais leurs codes semblent bien differents de peel

 

Une petite aide SVP

 

Merci beaucoup

 

Anh

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour,

 

Ok pour la première étape. Il reste deux modifications à faire :

- Il faut donc récupérer l'id de la marque envoyée en GET

- Ajouter un critère à la requête de recherche.

 

Pour le premier point, vous pouvez ajouter $brand = vn($_GET['brand']); sous le bloc

$output = '';
$output_result = '';
$match = vb($_GET['match']);
$search = vb($_GET['search']);

au début du fichier search.php.

 

Pour l'étape deux, 2 sous-étapes :

 

- il faut ajouter le paramètre $brand aux fonctions build_sql_produits et build_terms_clause:

build_sql_produits($terms, $fields, $match, $brand);

build_terms_clause($terms, $fields, $match, $brand);

=> Il faut modifier les appels de fonction, ainsi que la définition de la fonction.

 

- Dans la fonction qui créer le SQL, il faut ajouter la contrainte sur l'id de la marque :

pour build_sql_produits, la requete ressemblera à ceci :

 

    $requete .= 'FROM peel_categories c
        INNER JOIN peel_produits_categories pc ON pc.categorie_id = c.id
        INNER JOIN peel_produits p ON p.id = pc.produit_id

        LEFT JOIN peel_marques m ON p.id_marque = m.id
        WHERE p.etat = "1" AND ' . build_terms_clause($terms, $fields, $match) . '
        ORDER BY p.id DESC
        LIMIT 100';

 

pour faire fonctionner build_terms_clause, vous pouvez ajouter

if (!empty($brands)) {

        $this_term_conditions_array[] = "m.id = ". $brands;

}

sous la boucle 

        foreach ($fields as $val) {
            $this_term_conditions_array[] = word_real_escape_string($val) . ' ' . word_real_escape_string($notmod) . ' LIKE "%' . nohtml_real_escape_string($term) . '%"';
        }

(ligne 268 sur votre version).

 

Voila dans l'esprit des modifications à faire pour obtenir ce que vous souhaitez. Ce code n'a pas été testé, je vous laisse le soin de l’adapter à votre site.

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Rebonjour Simon

 

donc j'ai modifie vos petits codes, en effet j'etais loin du compte

 

lorsque je fais une recherche sur un objet ici un vase dans la marque 2 en realite j'obtiens le resultat dans la marque 1 et 2 comme si seul le premier champ fonctionnait mais pas le critere de la marque

 

dans le lien j'ai /search.php?match=2&search=vase&brand=2&action=

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour,

 

Pour comprendre l'origine du problème, vous pouvez dans un premier temps afficher la requête et l’exécuter dans phpmyadmin. Dans la fonction build_sql_produits, ajouter à la fin

echo $requête; die();

juste avant

    return $requete;

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour,

 

En faisant cela j'ai une page blanche

 

avec le debug j'ai

 

Notice: Undefined variable: requête in /home/www/mysite/search.php on line 301

 

vous parlez de l'executer dans phpmyadmin ? comment je fais cela ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour,

j'ai mis un accent à la variable $requete dans mon message, il y en a pas.
La bonne ligne est

echo $requete; die();
vous parlez de l'executer dans phpmyadmin ? comment je fais cela ?


Si vous êtes en local, vous pouvez lire la documentation de votre serveur. Si vous travaillez sur un site hébergé, vous pouvez voir directement avec votre hébergeur.
Si vous le souhaitez, nous pouvons finir intégralement cette modification. Il faut dans ce cas prendre contact avec un conseiller commercial au 01 75 43 67 97.

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