Partage
  • Partager sur Facebook
  • Partager sur Twitter

Autocompletion au milieu des mots

et pas qu'avec les lettres du début

Sujet résolu
    9 juin 2010 à 15:19:52

    Bonjour
    j'ai un script d'autocompletion qui fonctionne correctement. Comme il s'agit d'école, beaucoup commence par le mot "école". J'aimerais que quand l'utilisateur tape une lettre, le script ne s'arrête pas qu'à la première lettre mais recherche aussi au milieu de chaque propostion.
    Exemple avec 3 mots: café - chocolat - thé - éléphant (je sais il n'a rien d'une boisson ... :lol: ).

    SI je tape la lettre "c", mon script reconnaitrait café et chocolat. Mais si je tape la lettre "é", il reconnait café, thé et éléphant.

    Je n'ai rien trouvé sur le "oueb" qui puisse m'aider à avancer sur ce point.
    Ke remercie la/les personnes(s) qui pourrai(en)t m'aider sur ce point.
    • Partager sur Facebook
    • Partager sur Twitter
      9 juin 2010 à 15:32:27

      PHP requête SQL LIKE ? et tu mets des % avant et après ta variable ?
      Enfin, si tu fais avec une requête SQL évidemment...
      • Partager sur Facebook
      • Partager sur Twitter
        9 juin 2010 à 15:58:52

        Faire une requète SQL à chaque lettre tapée, ça risque d'être un peu lourd je pense.

        J'ai à peu prêt le même cas, sauf que les mots trouvés s'affiche dans un liste multiple, voici ce que je fais :

        Je sort la liste des mots par une requête SQL puis je créé un array en javascript qui contient ces mots.
        A chaque lettre tapée dans le champ, j'ai une regex très simple qui compare la suite de lettre à tous les mots de l'array et stocke dans un autre array les mots qui contiennent cette suite de lettre.
        Ensuite j'utilise cet array pour remplir le champ.

        C'est pas fait exprès, mais la regex recherche le shéma de lettre tapé partout dans les mots.
        Taper 'in' retournera aussi bien 'kleyling', que 'inox', que 'harbin', etc...

        // j'utilise le framework jQuery
        // fournisseurs c'est l'array qui contient tous les mots
        // fourn_match est un array qui contient tous les fournisseurs qui matchent avec la suite de lettre tapée dans le champ 'champ_fournisseur'
        
        $("#champ_fournisseur").keyup( function()
        {
        	var fourn_match = new Array(); // liste des fournisseurs qui comportent dans leur nom le texte recherché
        	var reg = new RegExp( $(this).val(), 'i' ); // on créé l'expression régulière avec juste ce qui est tapé dans le champs      le flag i rend le test insenssible la casse
        	
        	for( var i=0 ; i<fournisseurs.length ; i++ )
        	{
        		if( $(this).val() != '' )
        		{
        			var result = reg.test( fournisseurs[i] );// on test le contenu de l'array avec le contenu du champs
        			
        			if( result ) // == true 
        				fourn_match[fourn_match.length] = fournisseurs[i];
        		}
        	}
        	
        	$("#select_fourn").empty(); // efface toutes les balises <option> du select
        	
        	if( fourn_match.length > 0 ) // il y a au moins un fourn trouvé, on affiche la liste
        	{
        		for( var i=0 ; i<fourn_match.length ; i++ )	
        			$('#select_fourn').append( '<option value=\"'+fourn_match[i]+'\">'+fourn_match[i]+'</option>' );
        	}
        } );
        


        J'espère que ça t'aidera.
        • Partager sur Facebook
        • Partager sur Twitter
          11 juin 2010 à 10:33:40

          Merci beaucoup, j'ai regarde de prêt ton code car il a l'avantage de ne pas s'arrêter qu'aux premières des mots mais de chercher au milieu également.
          Par contre, j'aurai quelques questions, si tu peux m'aider un peu (suis pas fortich en JS).

          J'ai récupéré ton code dans un fichier JS, que j'appelle dans mon fichier PHP.
          J'ai mis ma liste d'école (car c'est de ça qu'il s'agit) dans la variable
          var fourn_match = new Array('ecole1', 'école2', 'université', 'lycée');
          

          Par contre, je ne comprends pas plusieurs choses dans le code:
          - comment tu appelles ton code JS
          $("#champ_fournisseur").keyup( function()
          

          J'ai essayé de mettre le code dans une fonction que j'appelle dans mon fichier PHP comme ça
          <input type="text" onkeyup="showValue(this);" name="ecole1"/>
          

          mais ça ne marche pas. Je suppose que que l'appel n'est pas correct car l'appel sous cette forme fonctionne avec mon autre fichier JS. J'ai modifié le JS de cette façon sans plus de succès:
          function	showValue()
          

          - ce que tu appelles fournisseur. Est-ce une variable déclarée dans ton code?

          Est-ce possible d'changer par mail mail si tu as le temps de m'aider STP? Ca serait plus facile que sur le forum ...
          Merci d'avance
          • Partager sur Facebook
          • Partager sur Twitter
            11 juin 2010 à 11:42:05

            Comme il l'a dit, il utilise jQuery. Tu as inséré la bibliothèque ??
            • Partager sur Facebook
            • Partager sur Twitter
              11 juin 2010 à 12:32:47

              j'ai intégéré les codes suivants:
              - dans le PHP:
              defined( '_JEXEC' ) or die( 'Restricted access' );
              

              - dans le custom script de Joomla
              <?php  
              $doc =& JFactory::getDocument();  
              $doc->addStyleSheet("js/test.css"); //dans un dossier JS a la racine du site 
              $doc->addScript("js/test.js"); //dans un dossier JS a la racine du site 
              ?>
              

              Donc normalement, c'est bon ... enfin je pense ...
              • Partager sur Facebook
              • Partager sur Twitter
                11 juin 2010 à 12:36:17

                Oui mais... ce que je veux dire, c'est que le script qu'il t'a donné utilise la bibliothèque jQuery. Elle doit être incluse pour pouvoir utiliser les fonctionnalités
                • Partager sur Facebook
                • Partager sur Twitter
                  11 juin 2010 à 13:06:31

                  OK, je vois. Mais le problème, c'est qu'il y a un problème de compatibilité entre mootools et jquery ... Donc si j'installe la librairie JQuery sous Joomla, ça va planter. Donc je vais peut-être calmer ma joie d'avoir un code d'autocompletion qui ne cherche pas uniquement sur les premières lettres :(

                  Mon premier code, ci-dessous, fonctionne très bien en Javascript.
                  suggests = new Array('école1','école2','université', 'lycée');
                  /*
                  fonction de recalcul de l'offset top et left qui se refere à l'offsetParent pour palier au probleme de positionnement dans les tableaux
                  */
                  function positionAbsolute(obj,mode)
                  {
                  	currentValue = 0;
                  	if (obj.offsetParent)
                  	{
                  		if (mode == 'top')
                  			currentValue = obj.offsetTop;
                  		else if (mode == 'left')
                  			currentValue = obj.offsetLeft;
                  		while (obj = obj.offsetParent)
                  			if (mode == 'top')
                  				currentValue += obj.offsetTop;
                  			else if (mode == 'left')
                  				currentValue += obj.offsetLeft;
                  	}
                  	return currentValue;
                  }
                  		
                  /*
                  la fonction principale qui remplit le div des differentes suggestions possibles en corrélation avec le champ input
                  */
                  function	showValue(inside)
                  {
                  	divDest						= document.getElementById('menuRightHidden');
                  	divDest.innerHTML			= '';
                  	valueOfElement				= '';
                  	exist						= 0;
                  	nbOfElement					= 0;
                  	divDest.style.top			= positionAbsolute(inside,'top') + inside.offsetHeight;
                  	divDest.style.left			= positionAbsolute(inside,'left');
                  	divDest.style.width			= inside.offsetWidth - 3;
                  			
                  	for (i = 0; i < suggests.length; i++)
                  	{
                  		if ((suggests[i].toLowerCase()).indexOf((inside.value).toLowerCase()) == 0 && inside.value != '')
                  		{
                  			nbOfElement++;
                  			exist					= 1;
                  			valueOfElement			= suggests[i];
                  			currentDiv				= document.createElement("div");
                  			currentInner			= document.createTextNode(suggests[i]);
                  			currentDiv.indice		= suggests[i];
                  			currentDiv.className	= 'currentDiv';
                  			currentDiv.onclick		= function()
                  			{
                  				inside.value = this.indice;
                  				divDest.style.visibility = 'hidden';
                  			}
                  			currentDiv.appendChild(currentInner);
                  			divDest.appendChild(currentDiv);
                  		}
                  	}
                  	if (exist == 0 || (valueOfElement.length  == inside.value.length && nbOfElement == 1))
                  		divDest.style.visibility = 'hidden'
                  	else
                  		divDest.style.visibility = 'visible';
                  }
                  		
                  /*initialisation de la div qui contiendra les differentes suggestions
                  */
                  function	initMenuRightDiv()
                  {
                  	completion				= document.getElementById('completionConteneur');
                  	menuRightDiv			= document.createElement("div");
                  	menuRightDiv.className	= 'hiddenDiv';
                  	menuRightDiv.id			= 'menuRightHidden';
                  	window.completion.appendChild(menuRightDiv);
                  }
                  		
                  window.onload = initMenuRightDiv;
                  

                  Je vais regarder pour le modifier mais sans maitriser le JS, ça risque d'être difficile :(
                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 juin 2010 à 13:25:33

                    if ((suggests[i].toLowerCase()).indexOf((inside.value).toLowerCase()) != -1 && inside.value != '')

                    Si tu changes cette ligne comme ça, je crois que ça devrait jouer ;)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      11 juin 2010 à 13:43:32

                      SUPER !!! CA MARCHE !!! :D
                      Dire que j'étais en cours de modification de mon code en entier ...
                      Merci énormément
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Autocompletion au milieu des mots

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown