[RESOLU] Framework scriptaculous : problème auto-complétion

Itashi371
Invité n'ayant pas de compte PHPfrance

15 mai 2009, 13:12

Bonjour à tous,

J'utilise la librairie Scriptaculous pour utiliser l'autocomplétion sur un formulaire de recherche, mais je rencontre un problème (remonté par les utilisateurs).
Je m'explique :

- L'utilisateur commence à saisir les lettres "arc". La liste des mots commençant par "arc" apparait juste en dessous, aucun problème. Mais si l'utilisateur clique sur "Entrée" tout de suite après, automatiquement c'est le 1er mot de la liste qui va s'inscrire dans le champs de recherche.
Or, les utilisateurs ne souhaitent pas ce fonctionnement. Ce qu'ils aimeraient c'est le comportement de la recherche intuitive présent sur les pages jaunes.

J'ai beau cherché je n'ai pas réussi à empêcher cette 1ère sélection. Si quelqu'un à une idée, je suis preneur.

Merci pour votre aide.
Cordialement,

ViPHP
ViPHP | 1136 Messages

15 mai 2009, 13:34

Salut ,

J'ai peut être une solution ,

Le principe , est d'ajouter en premier , dans la liste des résultats , le contenu du champ text ( les premiéres lettres que l'utilisateur a tapé )

Ainsi , s'il tape directement "entrer" , ce sera le mot qu'il a ecrit , et un mot proposé ...

Sinon , il doit y avoir moyen de retirer "l'autofocus" de la liste ..

Ch.

Invité
Invité n'ayant pas de compte PHPfrance

15 mai 2009, 13:41

Salut ,

J'ai peut être une solution ,

Le principe , est d'ajouter en premier , dans la liste des résultats , le contenu du champ text ( les premiéres lettres que l'utilisateur a tapé )

Ainsi , s'il tape directement "entrer" , ce sera le mot qu'il a ecrit , et un mot proposé ...

Sinon , il doit y avoir moyen de retirer "l'autofocus" de la liste ..

Ch.
Merci pour ta réponse.
Une ptite explication pour rajouter le contenu taper dans la liste des résultats ?
Ma liste de mots provient d'une table mysql...

Je continue de chercher pour retirer "l'autofocus" de la liste.

Merci

ViPHP
ViPHP | 1136 Messages

15 mai 2009, 13:48

A l'exécution de ta requête , je suppose que tu récupères dans un tableau ta liste de mots .

le principe est donc d'ajouter les les premiers caractères tapé par l'utilisateur ( que tu as du utiliser dans ta requête ) , en tête de ton tableau.

Pour illustrer :
$TabRes = mysql_fetch_array( ... ) ... 

array_unshift($TabRes, $firstletters);
array_unshift ajoute au début de ton tableau , ainsi , ce sera le premier élément affiché dans tes propositions , donc , forcement l'element sélectionné automatiquement.

Si on arrive pas à retirer "l'autofocus" on l'utilise à notre avantage .. :D

Ch.

Invité
Invité n'ayant pas de compte PHPfrance

15 mai 2009, 14:01

A l'exécution de ta requête , je suppose que tu récupères dans un tableau ta liste de mots .

le principe est donc d'ajouter les les premiers caractères tapé par l'utilisateur ( que tu as du utiliser dans ta requête ) , en tête de ton tableau.

Pour illustrer :
$TabRes = mysql_fetch_array( ... ) ... 

array_unshift($TabRes, $firstletters);
array_unshift ajoute au début de ton tableau , ainsi , ce sera le premier élément affiché dans tes propositions , donc , forcement l'element sélectionné automatiquement.

Si on arrive pas à retirer "l'autofocus" on l'utilise à notre avantage .. :D

Ch.
Merci pour ta réponse, je connaissais pas "array_unshift".
Le petit hic c'est que je stocke récupére tous mes mots avant (j'ai une table des mots clefs).
Et je passe la variable "$mots" dans un tableau en js (une option de la librairie). Je n'envois pas une requête au serveur à chaque fois que l'utilisateur saisie une lettre.

Voici mon petit bout de code faisant appel à la librairie :

Code : Tout sélectionner

<script type="text/javascript" language="javascript" charset="utf-8" > new Autocompleter.Local("ac1","ac1update", new Array($mots), { choices: $nb_mots, tokens: new Array(" ","n"), fullSearch: true, partialSearch: false }); </script>
Tout ça est "printé" via PHP.
Dans "$mots" j'ai la liste de tous les mots clefs (pas tous ceux de la table heureusement mais qui répondent à certains critères). La recherche se faisant alors en direct.

Suis-je assez claire ?

Merci encore, c'est sympa de regarder !

Invité
Invité n'ayant pas de compte PHPfrance

15 mai 2009, 14:18

Encore moi !

J'ai modifié l'appel à la librairie afin de pouvoir utiliser array_unshift et ça ne fonctionne pas.
Si j'appuie sur "Entrée" il me prend le 1er mot de la liste, il ne prend pas les premières lettres saisies....

Pffffiouuu, j'en ai un ptit peu marre de ce ptit détail !
Parfois les utilisateurs ................ :twisted: :evil:

ViPHP
ViPHP | 1136 Messages

15 mai 2009, 14:21

montre nous le code que tu utilises pour créer $mots
Parfois les utilisateurs ................ Twisted Evil Evil or Very Mad
Je sais .. :roll:

Itachi371
Invité n'ayant pas de compte PHPfrance

15 mai 2009, 14:29

montre nous le code que tu utilises pour créer $mots
Parfois les utilisateurs ................ Twisted Evil Evil or Very Mad
Je sais .. :roll:
Ok, voici le code utilisant "array_unshift";

Appel de la librairie :

Code : Tout sélectionner

<script type="text/javascript" language="javascript"> // <![CDATA[ new Ajax.Autocompleter('rechajax','selupdate','search.php',{}); // ]]> </script>
Code de search.php qui récupére les mots clefs :

Code : Tout sélectionner

require("../config_inc.php"); $selec = $_POST["rechajax"]; $nb = strlen($selec); if ($nb < 2) { ""; } else { $query_mots = "SELECT * FROM aide_indexation WHERE (espaceid='xx' or espaceid = 'yy') and mots like '$selec%' order by mots"; $result_mots = mysql_query($query_mots); if (mysql_num_rows($result_mots) > 0) { print "<ul>"; while ($row_mots = mysql_fetch_array($result_mots)) { $mots = strtolower($row_mots['mots']); array_unshift($row_mots,$selec); print "<li>$mots</li>"; } print "</ul>"; } }
Voilà, j'espère qu'avec des yeux neuf la solution viendra car là je reconnais que ça me pique les yeux... :roll:

ViPHP
ViPHP | 1136 Messages

15 mai 2009, 14:42

Voilà ce que je te propose :
                require("../config_inc.php");
		
		$selec = $_POST["rechajax"];
		$nb = strlen($selec);
		
		if ($nb < 2) {
		  "";
		}else {
		    $query_mots = "
		    		SELECT 
		    			mots
		    		FROM 
		    			aide_indexation 
		    		WHERE (
		    				espaceid='xx' 
		    			OR 
		    				espaceid = 'yy'
		    			) 
		    			AND 
		    				mots like '".mysql_real_escape_string($selec)."%' 
		    		ORDER BY
		    			mots";
		    			
		    $result_mots = mysql_query($query_mots)or die(mysql_error());
		    
		    if (mysql_num_rows($result_mots) > 0) {
		    	
		    	//récupére les resultats dans un tableau
		    	$TabRes	=	array();
		    	$TabRes	=	mysql_fetch_assoc($result_mots);
		    	
		    }
		    
		    //ajout des premiers caractéres entrés par l'utilisateur
		    array_unshift($TabRes,$selec);
		    
		    //création de la liste pour l'autocomp. 
		    foreach($TabRes AS &$res){
		    	
		        echo '<ul>
		        		<li>'.strtolower($res['mots']).'</li>
		        	  </ul>';
		    }
Je me suis permis de changer quelques petites choses , ton script était sujet aux injections sql ...

Pense à toujours au moins mettre : mysql_real_escape_string() sur les variables introduites dans tes requetes ..

Voilà .. dis moi si celà fonctionne ..

Ch.

Invité
Invité n'ayant pas de compte PHPfrance

15 mai 2009, 15:13

Voilà ce que je te propose :
                require("../config_inc.php");
		
		$selec = $_POST["rechajax"];
		$nb = strlen($selec);
		
		if ($nb < 2) {
		  "";
		}else {
		    $query_mots = "
		    		SELECT 
		    			mots
		    		FROM 
		    			aide_indexation 
		    		WHERE (
		    				espaceid='xx' 
		    			OR 
		    				espaceid = 'yy'
		    			) 
		    			AND 
		    				mots like '".mysql_real_escape_string($selec)."%' 
		    		ORDER BY
		    			mots";
		    			
		    $result_mots = mysql_query($query_mots)or die(mysql_error());
		    
		    if (mysql_num_rows($result_mots) > 0) {
		    	
		    	//récupére les resultats dans un tableau
		    	$TabRes	=	array();
		    	$TabRes	=	mysql_fetch_assoc($result_mots);
		    	
		    }
		    
		    //ajout des premiers caractéres entrés par l'utilisateur
		    array_unshift($TabRes,$selec);
		    
		    //création de la liste pour l'autocomp. 
		    foreach($TabRes AS &$res){
		    	
		        echo '<ul>
		        		<li>'.strtolower($res['mots']).'</li>
		        	  </ul>';
		    }
Je me suis permis de changer quelques petites choses , ton script était sujet aux injections sql ...

Pense à toujours au moins mettre : mysql_real_escape_string() sur les variables introduites dans tes requetes ..

Voilà .. dis moi si celà fonctionne ..

Ch.
Yes, merci beaucoup !!
Je testerais que lundi, réunion en urgence de fin de semaine ! :x

@+ tard

itachi371
Invité n'ayant pas de compte PHPfrance

18 mai 2009, 08:01

Salut,

Je viens de mettre ton code en place, sans rien toucher (merci beaucoup).
Désolé pour le 'mysql_real_escape_string', étant sous intranet, j'ai tendance à ne pas trop l'utiliser :oops: Grosse erreur de ma part ! Désormais je le mettrais systématiquement.

Revenons à nos moutons :

Ca ne fonctionne pas...
Dans ma liste qui apparait, il ne me propose que 2 choix correspondant à la lettre "a" toute seule, rien derrière. Je commence à saisir "ad". Dans ma table, il y a 3 mots commençant par "ad", or là, je n'ai que "a" tout seul, 2 fois, pas les autres mots...

Ne voulant pas casser ton code, je continue à chercher de mon côté.
Merci pour ton aide, c'est vraiment sympa.

@+ tard

ViPHP
ViPHP | 1136 Messages

18 mai 2009, 08:54

Il y a effectivement un petit oubli de ma part au niveau des tableaux associatif , pour insérer les caractères entrés par l'utilisateur ..
j'ai simulé un résultat que tu dois obtenir à la suite de mysql_fetch_assoc()

et normalement , celà fonctionne :
<?php

//caractéres entrés par l'utilisateur 
$car  =  "ad";


$Tabres[]	=	"mot1";
$Tabres[]	=	"mot2";
$Tabres[]	=	"mot3";
$Tabres[]	=	"mot4";

//insertion des premiers caractères 
array_unshift($Tabres,$car); 


echo '<ul>';

foreach($Tabres AS &$res){ 
	
	echo '<li>'.$res.'</li>';
	
}
echo '</ul>';
?>
Résultat :

* ad
* mot1
* mot2
* mot3
* mot4


Je viens de me rendre compte d'un énorme oubli , ( ce doit être l'effet "vendredi" ) , mysql_fetch_assoc() ne retourne qu'une ligne , et non tous les resultats :oops:

Il faut donc tous les récupérer ... ces resultats

ce qui donnerai plutot un truc du style
<?php
require("../config_inc.php");
        
        $selec = $_POST["rechajax"];
        $nb = strlen($selec);
        
        if ($nb < 2) {
          "";
        }else {
            $query_mots = "
                    SELECT 
                        mots
                    FROM 
                        aide_indexation 
                    WHERE (
                            espaceid='xx' 
                        OR 
                            espaceid = 'yy'
                        ) 
                        AND 
                            mots like '".mysql_real_escape_string($selec)."%' 
                    ORDER BY
                        mots";
                        
            $result_mots = mysql_query($query_mots)or die(mysql_error());
            
            if (mysql_num_rows($result_mots) > 0) {
                
                //récupére les resultats dans un tableau
                $TabRes    =    array();
                
                while ($row = mysql_fetch_assoc($result_mots)) {
                	
                	$Tabres[]	=	$row["mots"];
                	
                }
                
            }
            
            //ajout des premiers caractéres entrés par l'utilisateur
            array_unshift($TabRes,$selec);
            
            //création de la liste pour l'autocomp. 
            foreach($TabRes AS &$res){
                
                echo '<ul>
                        <li>'.strtolower($res).'</li>
                      </ul>';
            }

?>
Faut vraiment que je prenne des vacances ... :wink:

Invité
Invité n'ayant pas de compte PHPfrance

18 mai 2009, 09:10

Je n'osais pas te le dire ... !!!
Je n'ai pas encore assez confiance en moi en php !

Je test tout ça, j'avais déjà implémenté ma boucle dans le code, faut voir le résultat maintenant !

Je te tiens au courant très vite

Invité
Invité n'ayant pas de compte PHPfrance

18 mai 2009, 09:12

Je n'osais pas te le dire ... !!!
Je n'ai pas encore assez confiance en moi en php !

Je test tout ça, j'avais déjà implémenté ma boucle dans le code, faut voir le résultat maintenant !

Je te tiens au courant très vite
Pour les vacances, moi aussi je devrais en prendre, surtout que le soleil a l'air de revenir !

Invité
Invité n'ayant pas de compte PHPfrance

18 mai 2009, 09:17

YES YES !!!
C'est OK, ça marche superbe bien.
Un grand MERCI pour ton aide, tu as mérité tes vacances ! 8-) :lol:

Comment mettre "RESOLU" sur le post ?

Bonne semaine
@+