We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 11975
    • 2,542 Posts
    Salut,

    si vous avez un peu de temps aujourd’hui, vous pourriez en consacrer un peu pour la bonne cause.
    J’ai modifié le snippet ajaxsearch pour étendre la recherche aux contenu des TVs.

    Bizarrement cela n’a pas été trop difficile aussi j’aurai besoin de testeurs pour confirmer le bon fonctionnement.
    J’ai testé chez moi et cela marche plutot bien.
    Toutefois notez que si votre base est encodée en UTF-8 la question des caractères accentués n’est pas résolue.
    (gerard comme terme de recherche ne retourne pas gérard par exemple)

    tout ce que vous avez à faire c’est ouvrir le fichier AjaxSearch.inc.php dans /assets/snippets/AjaxSearch/
    et remplacer la fonction doSearch par celle ci

    <?php
    
    function doSearch($searchString,$searchStyle,$useAllWords,$ajaxSearch,$docgrp) {
        if ($ajaxSearch) {
          $table_prefix = connectForAjax();
        } else {
          global $modx;
        }
        $search = explode(" ", $searchString);
        if ($ajaxSearch) {
            $tbl_sc = $table_prefix . "site_content";
            $tbl_stc = $table_prefix . "site_tmplvar_contentvalues";//helio
            $tbl_dg = $table_prefix . "document_groups";
        } else {
            $tbl_sc = $modx->dbConfig['dbase'] . "." . $modx->dbConfig['table_prefix'] . "site_content";
            $tbl_stc = $modx->dbConfig['dbase'] . "." . $modx->dbConfig['table_prefix'] . "site_tmplvar_contentvalues";//helio
            $tbl_dg = $modx->dbConfig['dbase'] . "." . $modx->dbConfig['table_prefix'] . "document_groups";
        }
    
        if ($docgrp) {
        	$tbl_sql = " LEFT JOIN $tbl_stc stc ON sc.id = stc.contentid ";//helio
            $tbl_sql .= " LEFT JOIN $tbl_dg dg ON sc.id = dg.document";
            $qry_sql = "(ISNULL(dg.document_group) OR dg.document_group IN ($docgrp)) AND ";
        } else {
           $tbl_sql = " LEFT JOIN $tbl_stc stc ON sc.id = stc.contentid ";//helio
            $qry_sql = "sc.privateweb = 0 AND ";
        }
    
        if ($searchStyle == 'partial'){
          $sql = "SELECT DISTINCT sc.id, sc.pagetitle, sc.description, sc.content ";
          $sql .= "FROM $tbl_sc sc" . $tbl_sql . " WHERE ";
          if (count($search)>1 && $useAllWords){
            foreach ($search as $searchTerm){//helio
              $sql .= "(sc.pagetitle LIKE '%$".$searchString."%' OR sc.description LIKE '%$searchString%' OR sc.content LIKE '%$searchTerm%' OR stc.value LIKE '%$searchTerm%') AND ";
            //	$sql .= "(sc.pagetitle LIKE '%$".$searchString."%' OR sc.description LIKE '%$searchString%' OR sc.content LIKE '%$searchTerm%') AND ";
            
            }
          } else {
          	$sql .= "(sc.pagetitle LIKE '%$searchString%' OR sc.description LIKE '%$searchString%' OR sc.content LIKE '%$searchString%' OR stc.value LIKE '%$searchString%') AND ";
          	//$sql .= "(sc.pagetitle LIKE '%$searchString%' OR sc.description LIKE '%$searchString%' OR sc.content LIKE '%$searchString%') AND ";
          
          }
          $sql .= $qry_sql . "sc.published = 1 AND sc.searchable=1 AND sc.deleted=0;";
        } else {
          $sql = "SELECT DISTINCT sc.id, sc.pagetitle, sc.description, sc.content ";
          $sql .= "FROM $tbl_sc" . $tbl_sql . " sc WHERE ";
          if (count($search)>1 && $useAllWords){
            foreach ($search as $searchTerm){
              //$sql .= "MATCH (sc.pagetitle, sc.longtitle, sc.introtext, sc.description, sc.content) AGAINST ('$searchTerm') AND ";
              $sql .= "MATCH (sc.pagetitle, sc.longtitle, sc.introtext, sc.description, sc.content, stc.value) AGAINST ('$searchTerm') AND ";
            }
          } else {
            //$sql .= "MATCH (sc.pagetitle, sc.longtitle, sc.introtext, sc.description, sc.content) AGAINST ('$searchString') AND ";
          	$sql .= "MATCH (sc.pagetitle, sc.longtitle, sc.introtext, sc.description, sc.content, stc.value) AGAINST ('$searchString') AND ";
          
          }
          $sql .= $qry_sql . "sc.published = 1 AND sc.searchable=1 AND sc.deleted=0;";
        }
    
    
        if ($ajaxSearch) {
            $rs = mysql_query($sql) or die ("Cannot query the database ($sql)");
        } else {
            $rs = $modx->dbQuery($sql);
        }
        return $rs;
    }
    
    



    Merci à ceux qui testent

    :-)
      Made with MODx : [url=http://www.copadel.com]copadel, fruits et l
      • 16732
      • 592 Posts
      Bonjour Helio,

      Je viens d’utiliser (rapidement)pour la première fois ce snippet et j’ai qqs questions à son sujet, désolé si je pose des questions évidentes :
      - ta modification est-elle compatible avec les deux versions d’AjaxSearch (old sous prototype, nouvelle sous Mootools)
      Je pense que oui car ta fonction n’a rien avoir avec l’affichage wink
      - J’ai installé la version Mootools mais je n’ai pas réussi à faire fonctionner correctement la version sans ajax et page de résultat, je me suis donc rabattu sur l’ancienne qui elle fonctionne.

      Quant est-il de la recherche des mots accentués.
      Dans quelles conditions peut ont effectuer des recherches avec des caractères accentués ?

      Car en fait, j’ai été bluffé lors de l’installation, mais à l’usage sur des articles en français assez importants l’utilité est minime si on ne peut pas rechercher des mots accentués

      Je vais voir si je peux tester ta modification sur mont projet actuel
        • 11975
        • 2,542 Posts
        En effet la fonction que j’ai modifiée n’a rien à voir avec l’affichage et devrait fonctionner avec les deux versions.

        En ce qui concerne les caracteres accentués c’est un VRAI problème.
        Bizarrement, si la table est en ISO la recherche fonctionne bien et les correspondances e=>é sont bien trouvées.

        Je ne maîtrise pas assez SQL et les subtilités des encodages pour corriger la chose.
        Dans l’immédiat on peut tjs signaler le bug à kylej et si parmi nous se cache un guru qu’il prenne en charge la correction du bug

        :-)
          Made with MODx : [url=http://www.copadel.com]copadel, fruits et l
          • 16732
          • 592 Posts
          Merci pour tes réponses toujours rapides smiley

          Oui poster un bug à ce sujet ne me semble pas abusif, car pas mal d’utilisateurs non anglophones doivent rencontrer le même problème (je ne suis pas non plus très familier avec les encodage … les Russes ou les japonais peuvent-ils utiliser ce snippet ?! huh).

            • 11975
            • 2,542 Posts
            Bon après quelques test rapides il semble y avoir plusieurs pb avec l’UTF-8

            D’abord la base doit avec comme interclassement utf8_swedish_ci (à spécifier à la création de la base sinon les modifs appliquées par la suite n’affectent pas tous les champs)

            Ensuite probleme avec les RTE qui encodent les caraceteres speciaux (on peut modifier le comportement de TINY MCE dans plugins>tiny > configuration > puis choisir raw)

            Et enfin dans le manager(à vérifier) où la valeur de content est passé à la function htmlspecialchars.

            :-)
              Made with MODx : [url=http://www.copadel.com]copadel, fruits et l
              • 11975
              • 2,542 Posts
              Je pense avoir trouvé une solution mais elle demande quelques modifications dans le manager.

              je posterai la liste des modifications plus tard si cela vous intéresse.

              :-)

              Un début de réponse ici en allemand
              http://modxcms.com/forums/index.php?PHPSESSID=dfe405a8dd81a89de9ac388b3b6a2c75&topic=11846.msg79928
                Made with MODx : [url=http://www.copadel.com]copadel, fruits et l
                • 16732
                • 592 Posts
                Oui je pense que ça intéresse pas mal de monde wink
                Perso je galère un peu depuis que j’essaie de n’utiliser que de l’UTF-8 !
                Un retour d’expérience voir un petit guide des bonnes pratiques sur ce sujet me semblerait une aide précieuse pour beaucoup de monde.