Problème autocompletion

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème autocompletion

par horrion » 30 avr. 2009, 10:36

Petit up pour dire que j'ai eu l'idée de modifier un peu mon index pour y ajouter:

Code : Tout sélectionner

<?php if (isset($_POST['recherche'])) { $variable_nom = mysql_real_escape_string(htmlspecialchars($_POST['recherche'])); $requete_mysql = mysql_query ("SELECT * FROM client WHERE Raison_sociale='%".$variable_nom."%' ") or die ("Echec de connexion ࡬a base de donnꥢ); while ($donnees = mysql_fetch_array($requete_mysql)) { ?>
Le soucis est que maintenant quand je selectionne le nom dans la suggest list et que je clique le bouton "envoyez" il ne ce passe rien du tout :cry: [/code]

par D4Y » 22 avr. 2009, 09:53

Je te conseille de jeter un oeil à ajax Autocompleter

Voici un site qui en parle :
http://blog.pascal-martin.fr/post/Scrip ... dynamiques

par horrion » 22 avr. 2009, 08:44

un petit up pour dire que je bloque toujours après mon retour de congés xD :D

par horrion » 06 avr. 2009, 14:18

Re salut !

J'ai ajouter ton code :

Code : Tout sélectionner

if(lis[i].id == 'selectedSuggest'){ alert(element); alert(lis[i].firstChild.innerHTML); element.value = lis[i].firstChild.innerHTML; }
a la place de :

Code : Tout sélectionner

a.onclick = function(){ element.value = this.innerHTML; closeSuggest(); }
Je n'ai plus du tout de liste de suggestion :/.
Je vais essayer le script que tu m'as proposé,il me semble beaucoup plus complexe que celui que j'ai actuellement xD.

par Elie » 06 avr. 2009, 11:17

Je t'ai proposé de faire un truc mais tu m'a pas dis ce que ca faisait sur ta page.

Ensuite, je te conseille d'utiliser ce script, qui depend du framework Prototype.

http://www.brandspankingnew.net/archive ... st_v2.html

par horrion » 06 avr. 2009, 10:04

Salut,

En gros dans ton code tu as ca :

Code:
if(lis.id == 'selectedSuggest'){
element.value = lis.firstChild.innerHTML;
}


Ca dit clairement que tu veux attribue à l'element le contenu de la liste que tu as choisis ...

Si tu remplaces pas :

Code:
if(lis.id == 'selectedSuggest'){
alert(element);
alert(lis.firstChild.innerHTML);
element.value = lis.firstChild.innerHTML;
}


Que ce passe t il ?

Utilises tu un framework JS comme jQuery ou Prototype ?


Salut et merci pour ta réponse !

Alors non je n'utilise pas de framework JS,je suis débutant dans ce domaine.Le script je l'ai trouvé sur internet et l'auteur disait que c'était relativement simple a intégrer dans le cadre de mon projet.

Je suppose que si je ne remplace pas:

Code : Tout sélectionner

if(lis[i].id == 'selectedSuggest'){ element.value = lis[i].firstChild.innerHTML; }
Je n'aurai toujours pas de validation de mon choix et sa ne me permettera pas d'afficher les données que je souhaite dans les formulaires.

Comme je l'ai expliquer je suis débutant,je ne pensais pas que ce serait aussi complexe car de base j'étais parti sur le principe d'une liste déroulante où il suffisait juste de choisir,ce qui était beaucoup plus simple^^
Mais je compte quand même essayer de continuer ce projet,si jamais tu aurais un petit moment pour m'aider j'en serai ravis !.

par Elie » 04 avr. 2009, 14:55

Salut,

En gros dans ton code tu as ca :

Code : Tout sélectionner

if(lis[i].id == 'selectedSuggest'){ element.value = lis[i].firstChild.innerHTML; }
Ca dit clairement que tu veux attribue à l'element le contenu de la liste que tu as choisis ...

Si tu remplaces pas :

Code : Tout sélectionner

if(lis[i].id == 'selectedSuggest'){ alert(element); alert(lis[i].firstChild.innerHTML); element.value = lis[i].firstChild.innerHTML; }
Que ce passe t il ?

Utilises tu un framework JS comme jQuery ou Prototype ?

par horrion » 31 mars 2009, 11:36

bah en faite avant j'étais parti pour faire un script baser sur le <selected> ce qui était beaucoup plus facile mais bon je pense que l'on peut faire mieu :wink:

Par contre je ne comprend pas trop ce que tu veux faire au niveau du debuggage

par Elie » 31 mars 2009, 11:30

Le probleme qui est coté JAVASCRIPT se trouve la :

Code : Tout sélectionner

//On ajoute un évènement sur le lien pour que son contenu soit mis dans le champ lorsque l'on clique dessus a.onclick = function(){ element.value = this.innerHTML; closeSuggest(); };
Je te conseille de faire un debuggage du type

Code : Tout sélectionner

alert(element); ou alert(this.innerHTML);
pour savoir si le probleme viens de l'element ou tu veux que ca s'affiche ou alors sur ce que tu veux afficher.

Problème autocompletion

par horrion » 31 mars 2009, 10:41

Bonjour à tous,

Je vous explique mon problème,je me suis lancé dans un projet qui serait en quelque sorte un formulaire de recherche avec autocompletion pour mon entreprise.J'ai pu récupérer un script sur internet relativement intéressant et qui fonctionne :wink: (C'est déjà sa :D) mais le soucis est que je n'arrive pas a faire le lien entre le moment ou tu choisi le nom dans la liste déroulante et que cela valide le choix pour que je puisse afficher les données.

Voici mon code:

Ma page en js:

Code : Tout sélectionner

/****************************************** # Auteur : Julien Theler - www.twiip.ch # Contact : [email protected] # Licence : CC-by-nc ******************************************/ var value_suggested = ''; //On stock la value du champ de texte pour éviter de refaire le processus si la valeur n'a pas changé (appuyé sur une touche autre que caractère) function suggest(element, table, field){ //Détection du navigateur var is_ie = ((navigator.userAgent.toLowerCase().indexOf("msie") != -1) && (navigator.userAgent.toLowerCase().indexOf("opera") == -1)); /*Fonction utile : détermine la position absolue exacte d'un objet sur la page*/ findPos = function(obj){ var curleft = curtop = 0; if (obj.offsetParent) { curleft = obj.offsetLeft curtop = obj.offsetTop while (obj = obj.offsetParent) { curleft += obj.offsetLeft curtop += obj.offsetTop } } return [curleft,curtop]; } //Création de la liste des propositions si elle n'existe pas encore if(!document.getElementById('suggestsList')){ var suggestsList = document.createElement('ul'); suggestsList.id = 'suggestsList'; /*On donne à la liste la même largeur que le champ de texte => on doit récupérer sa largeur et son padding*/ var style = (!is_ie ? window.getComputedStyle(element, null) : element.currentStyle); //Récupération du style if(style.width){ var width = parseInt(style.width.replace(/px/, '')); //On transforme la largeur dans le style en int //On récupère le padding éventuel du champ pour le rajouter à la largeur à attribuer à la liste var paddingRight = (style.paddingRight ? style.paddingRight : false); if(paddingRight){ paddingRight = parseInt(paddingRight.replace(/px/, '')); width += paddingRight; } var paddingLeft = (style.paddingLeft ? style.paddingLeft : false); if(paddingLeft){ paddingLeft = parseInt(paddingLeft.replace(/px/, '')); width += paddingLeft; } width = (isNaN(width) ? 150 : width); suggestsList.style.width = width+'px'; //On donne à la liste la même largeur que celle du champ de texte } //On positionne la liste sous le champ suggestsList.style.position = 'absolute'; var coord = findPos(element); //Récupération des coordonnées du champ suggestsList.style.left = coord[0]+'px'; suggestsList.style.top = coord[1]+(19)+'px'; //On ajoute 19px de haut pour que la liste soit sur le champ et non par-dessus document.body.appendChild(suggestsList); //On insère la liste dans le document } else{ //Si la liste existe déjà, on se contente de la repérer par rapport à son id suggestsList = document.getElementById('suggestsList'); } //Si la valeur a changée, on masque la liste, le temps d'actualiser son contenu if(element.value != value_suggested){ suggestsList.style.display = 'none'; } //Fonction servant à cacher les suggestions closeSuggest = function(nofocus){ var todelete = document.createElement('div'); todelete.appendChild(suggestsList); if(!nofocus){ element.focus(); } }; //Fonction gérant le parcour des éléments à l'aide des touches directionnelles selectSuggest = function(direction){ //On regarde si un élément est selectionné var selected = -1; var lis = suggestsList.getElementsByTagName('li'); for(i=0; i<lis.length; i++){ if(lis[i].id == 'selectedSuggest'){ selected = i; } lis[i].id = ''; } selected += direction; selected = (selected < -1 ? (lis.length-1) : selected); if(selected >= 0 && selected < lis.length){ lis[selected].id = 'selectedSuggest'; } }; //Remplit le champ avec la suggestion sélectionnée useSelected = function(){ //On regarde si un élément est selectionné var lis = suggestsList.getElementsByTagName('li'); for(i=0; i<lis.length; i++){ if(lis[i].id == 'selectedSuggest'){ element.value = lis[i].firstChild.innerHTML; } } closeSuggest(); }; document.body.onkeyup = function(e){ var key = (!is_ie ? e.keyCode : window.event.keyCode); switch(key){ case 27: //Esc closeSuggest(); break; case 9: //Tab closeSuggest(true); //On referme la liste sans redonner le focus au champ break; case 38: //Up selectSuggest(-1); break case 40: //Down selectSuggest(1); break; case 13: //Enter useSelected(); break; } }; document.body.onclick = function(){ closeSuggest(true); }; if(element.value != '' && element.value != value_suggested){ /*Récupération de la liste des suggestions*/ var suggests = new Array(); var XHR = false; try { XHR = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e){ XHR = new XMLHttpRequest(); } //Requête AJAX : attention à bien donner le chemin du fichier autocomplete_ajax.php XHR.open("GET", 'autocomplete_ajax.php?table='+table+'&field='+field+'&search='+element.value+'&nocache='+Math.floor((new Date()).getTime()), true); //timestamp en parametre pour empecher la mise en cache // Attente de l'état 4 (-> OK) XHR.onreadystatechange = function () { // l'état est à 4, requête reçue if(XHR.readyState == 4){ var xml = XHR.responseXML; //Récupération du xml contenant les suggestions var suggests_xml = xml.getElementsByTagName('suggest'); for(i=0; i<suggests_xml.length; i++){ //On remplit l'array des suggestions suggests[suggests.length] = suggests_xml[i].firstChild.data; } //On supprime l'ancien contenu de la liste des suggestions, puis on la remplit suggestsList.innerHTML = ''; if(suggests.length){ for(i=0; i<suggests.length; i++){ var li = document.createElement('li'); var a = document.createElement('a'); a.innerHTML = suggests[i]; //On ajoute un évènement sur le lien pour que son contenu soit mis dans le champ lorsque l'on clique dessus a.onclick = function(){ element.value = this.innerHTML; closeSuggest(); }; li.appendChild(a); suggestsList.appendChild(li); } //Maintenant que la liste est remplie, on l'affiche suggestsList.style.display = ''; } else{ //S'il n'y a aucune suggestion correspondante, on cache la liste closeSuggest(); } } } XHR.send(null); } else if(element.value == ''){ //Si le champ est vide, on cache la liste closeSuggest(); } //On enregistre la value pour laquelle le traitement a été effectuer pour ne pas le refaire s'il n'y a pas de changement value_suggested = element.value; }
Au niveau de ma page en autocomplete_ajax.php:
<?php
/******************************************
# Auteur : Julien Theler - www.twiip.ch
# Contact : [email protected]
# Licence : CC-by-nc
******************************************/


//Sécurité pour empêcher d'interroger la base librement : liste des table et des champs utilisables
$check = array(
	'client' => array('Raison_sociale')
);

//Connexion à la base de données
@mysql_connect('localhost', 'test', 'azerty') or die('Connexion à la base de données impossible');
@mysql_select_db('recherchel') or die('base de données inexistante');

$table = (isset($_GET['table']) ? $_GET['table'] : '');
$field = (isset($_GET['field']) ? $_GET['field'] : '');
$search = (isset($_GET['search']) ? $_GET['search'] : '');

if(isset($check[$table]) && in_array($field, $check[$table])){ //Vérification
	if($table && $field && $search){
		$search = strtolower(mysql_escape_string($search));

		header("content-type: application/xml");
		echo '<?xml version="1.0" encoding="iso-8859-1" ?>';
		echo '<suggests>';
		
		$query = 'SELECT `'.$field.'` FROM `'.$table.'` WHERE lower(`'.$field.'`) LIKE "'.$search.'%" ORDER BY `'.$field.'`';
		$result = mysql_query($query);
		while($row = mysql_fetch_array($result)){
			echo '	<suggest>'.$row[$field].'</suggest>';
		}
		
		echo '</suggests>';
	}
}
else{
	die('Requête interdite');
}
?>
et maintenant voici la page ou j'affiche les données avec la recherche:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<?php 
mysql_connect("localhost", "test", "azerty");
mysql_select_db("recherche");
?>

<head>
<meta http-equiv="content-type" content="text/html/php; charset=utf-8" />
<title>Cahier des charges client</title>
<link href="default.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="autocomplete.js"></script>
</head>
<body>
<input name="name" type="text" autocomplete="off" onKeyUp="suggest(this, 'client', 'Raison_sociale');" />
<br>
N° de compte:<input id="numcompte" type="text" name="name" maxlength="50" size="15" value="<?php echo $donnees['Numero_de_compte'] ?>">

</body>

Le lien entre ma base de donnée et ma recherche marche étant donner que lautcompletion fonctionne mais le problème et que lorsque je clique pour valider le nom dans la recherche il y a aucune donnée qui s'affiche :(.

Pouvez vous m'aider pour que je puisse terminer ce petit projet? je suis pas un expert en php :cry:.
Merci d'avance pour votre aide.