IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

Lier 3 input avec autocomplete [AJAX]


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Par défaut Lier 3 input avec autocomplete
    Bonjour,

    j'ai un code qui fonctionne très bien avec un input en autocomplete mais je souhaiterai modifier le code pour que 3 input sont liés.

    Tout fonctionne avec mysql et vient d'une seule table.

    exemple utilisation
    1 input on selectionne par exemple lille(59000)
    2 input autocomplete avec les adresse qui sont selectionner avec commune mais aussi code postal précédent on selectionne la bonne adresse.
    3 input autocomplete avec les noms des services on selectionne sont service


    Et a la fin je doit recuperer l'id du service selectionné dans le input du nom du service , le nom ne sert a rien à la soumission du formulaire.

    pour le moment donc j'ai le 1er input qui se remplit par rapport a ville (code postal)

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    <html>
    	<head>
    		<meta charset="utf-8"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    		<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
    		<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script> 
    		<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
    		<style>
                            #city-container{display: inline-block;position: relative;vertical-align: middle;width: 360px;}
                            #city-container input{width:100%}
                            #city-container ul{left:0 !important;right:0 !important;max-height:320px;overflow-y:auto;overflow-x:hidden;}
                    </style>
    <script>
    /* initialisation paramètres globaux : */
    var cache = {}; /* tableau cache de tous les termes */
    var term = null; /* terme renseigné dans le champ input */
    var baseUrl = 'https://www.monsite.com/'; /* url du site */
    baseUrl = '';
     
    $(document).ready(function() {
            /* city autocomplete */
            $('#city').autocomplete({
                    minLength:1, /* nombre de caractères minimaux pour lancer une recherche */
                    delay:200, /* delais après la dernière touche appuyée avant de lancer une recherche */
                    scrollHeight:320,
                    appendTo:'#city-container', /* div ou afficher la liste des résultats, si null, ce sera une div en position fixe avant la fin de </body> */
                    
                    /* dès qu'une recherche se lance, source est executé, il peut contenir soit un tableau JSON de termes, soit une fonctions qui retournera un résultat */
                    source:function(e,t){
                            term = e.term; /* récupération du terme renseigné dans l'input */
                            if(term in cache){ /* on vérifie que la clé "term" existe dans le tableau "cache", si oui alors on affiche le résultat */
                                    t(cache[term]);
                            }else{ /* sinon on fait une requête ajax vers city.php pour rechercher "term" */
                                    $('#loading').attr('style','');
                                    $.ajax({
                                            type:'GET',
                                            url:'city.php',
                                            data:'name='+e.term,
                                            dataType:"json",
                                            async:true,
                                            cache:true,
                                            success:function(e){
                                                    cache[term] = e; /* vide ou non, on stocke la liste des résultats avec en clé "term" */
                                                    if(!e.length){ /* si aucun résultats, on renvoi un tableau vide pour informer qu'on a rien trouvé */
                                                            var result = [{
                                                                    label: 'Aucune ville trouvée...',
                                                                    value: null,
                                                                    id: null,
                                                            }];
                                                            t(result); /* envoit du résultat à source */
                                                    }else{ /* sinon on renvoi toute la liste */
                                                            t($.map(e, function (item){
                                                                    return{
                                                                            label: item.label,
                                                                            value: item.value,
                                                                            id: item.id,
                                                                    }
                                                            }));  /* envoit du résultat à source avec map() de jQuery (permet d'appliquer une fonction pour tous les éléments d'un tableau */
                                                    }
                                                    $('#loading').attr('style','display:none;');
                                            }
                                    });
                            }
                    },
                    
                    /* sélection depuis la liste des résultats (flèches ou clic) > ajout du résultat automatique et callback */
                    select: function(event, ui) {
                            $('form input[name="city-hidden"]').val(ui.item ? ui.item.id : ''); /* on récupère juste l'id qu'on stocke dans l'autre input */
                    },
                    open: function() {
                            $(this).removeClass("ui-corner-all").addClass("ui-corner-top");
                    },
                    close: function() {
                            $(this).removeClass("ui-corner-top").addClass("ui-corner-all");
                    },
            });
    });
    </script>
    	</head>
    	<body>
    		<form>
    		<form>
    			<h2>Test Formulaire</h2>
    			<label for="city">Entrer une ville</label>
    			<span id="city-container">
    				<input type="text" placeholder="Choisir une ville" name="city" id="city">
    			</span>
     
    			<span id="city-container">
    				<input type="text" placeholder="" name="adresse_service" id="adresse_service">
    			</span>
    			<span id="city-container">
    				<input type="text" placeholder="" name="nom_service" id="nom_service">
    			</span>
    			<input type="hidden" name="city-hidden">//id du service
    			<span id="loading" style="display:none;"><i class="fa fa-circle-o-notch fa-spin"></i></span>
     
    		</form>
    	</body>
    </html>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">


    et le fichier city.php :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    <?php
    	ini_set('display_errors', 1);
    	ini_set('display_startup_errors', 1);
    	error_reporting(E_ALL);
     
    	$array = array();
    	$responseCode = 500;
     
    	/* si la requête est bien en Ajax et la méthode en GET ... */
    	if((strtolower(filter_input(INPUT_SERVER, 'HTTP_X_REQUESTED_WITH')) === 'xmlhttprequest') && ($_SERVER['REQUEST_METHOD'] == 'GET')){
    		/* on récupère le terme et on le duplique en terme en transformant les espaces en tirets et tirets en espaces (au cas ou) */
    		$q = str_replace("''","'",urldecode($_REQUEST['name']));
    		$q = strtolower(str_replace("'","''",$q));
    		$qTiret = str_replace(' ','-',$q);
    		$qSpace = str_replace('-',' ',$q);
     
    		$array = array();
     
    		/* connexion SQL  (avec PDO car Mysql_connect sera déprécié dès php 7 :P) */
     
    		$connexion = new PDO('mysql:host='.$host.';dbname='.$database, $user, $password);
     
    		/* creation de la requête SQL */
    		$query=$connexion->query('SELECT ts.id_service, ts.nom_service, ts.commune, ts.code_postal FROM service ts WHERE (ts.commune LIKE \'%'.$q.'%\' OR ts.commune LIKE \'%'.$qTiret.'%\' OR ts.commune LIKE \'%'.$qSpace.'%\' OR ts.code_postal LIKE \'%'.$q.'%\') group by ts.commune ORDER BY ts.commune ASC');
    		$query->setFetchMode(PDO::FETCH_OBJ);
     
    		/* remplissage du tableau avec les termes récupéré en requete (ou non) */
    		while($q = $query->fetch()){
    			$name = utf8_encode($q->commune);
    			$postalcode = utf8_encode($q->code_postal);
    			$array[] = array(
    					'id' => $q->id_service,
    					'label' => $name.' ('.$postalcode.')',
    					'value' => $name.' ('.$postalcode.')',
    			);
    		}
    		$query->closeCursor();
     
    		//die(print_r($array));
     
    		$responseCode = 200;
    	}
     
    	/* génération réponse JSON */
    	http_response_code($responseCode);
    	header('Content-Type: application/json');
    	echo json_encode($array);
    ?>

    merci pour votre aide.

  2. #2
    Membre éprouvé
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Par défaut
    voici le fichier sql.

    merci pour votre aide.
    Fichiers attachés Fichiers attachés

  3. #3
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 511
    Par défaut
    voilà l'exemple

  4. #4
    Membre éprouvé
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Par défaut
    merci pour ton aide c'est génial j'ai un seul soucis car si tu veux j'ai au choix d'une ville normalement plusieurs services possible :
    ex:mairie, gendarmerie qui peut exister.

    c'est pour ca que je penser le input adresse devrait etre en autocomplete ainsi que le input des noms des service pour bien choisir selon les choix possibles.

    Tu pense pouvoir m'aider pour cela ?

    Merci encore beaucoup depuis le temps que je suis bloquer avec cela.

    Désolé si je me suis peut etre mal explique.

    peut etre pas obliger en autocomplete mais afficher en liste deroulante qu'en pense tu pour l'adresse et le nom comme ca il voit les resultats tout de suite ?

    Que pense tu qui serait le mieux ?

  5. #5
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 511
    Par défaut
    Pour ça il faut juste supprimer le group by de la requête.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $query=$connexion->prepare('SELECT ts.id_service, ts.nom_service, ts.commune, ts.code_postal, ts.adresse 
    	FROM service ts 
    	WHERE (ts.commune LIKE :commune
    	OR ts.commune LIKE :commune_tiret
    	OR ts.commune LIKE :commune_space
    	OR ts.code_postal LIKE :code_postale) 
    	ORDER BY ts.commune ASC');
    	$query->setFetchMode(PDO::FETCH_OBJ);
    	$query->execute([':commune'=>'%'.$q.'%',':commune_tiret'=>'%'.$qTiret.'%',
                                   ':commune_space'=>'%'.$qSpace.'%',':code_postale'=>'%'.$q.'%']);

  6. #6
    Membre éprouvé
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Par défaut
    si je supprimer le group by je me retrouve avec le 1er input avec plusieurs fois les meme villes

    je pense qu'il faudrait

    input autocomplete ville (code postal) vers select adresse vers select nom des service qu'en pense tu ?

    Cela serai plus simple pour les visiteurs ?

    ex de ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (1, 'L''Abergement-Clémenciat', 'lille', '59000','7 rue victor'),
    (4, 'L''Abergement-Clémenciat'', 'lille', '59000','10 rue des orangers')
    tu vois j'ai plusieurs fois la même ville affiché pour le même service mais seule l'adresse va changer.

    je comprend ce que tu veux dire pour le group by mais si je l'enleve comment les gens arriveront a savoir quels est la ville à selectionner car il en aurait plusieurs tu comprend mon interrogation ?

    C'est au choix de l'adresse en liste deroulante qu'il auront selectionné le bon service.

    Qu'en pense tu ?

    Peut-ton remplacer les input par les select pour adresse et nom service ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Autocomplete : input avec suggestion liant deux données (ID et nom)
    Par gillouman dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 26/09/2015, 18h59
  2. Réponses: 5
    Dernier message: 26/05/2005, 15h40
  3. [Plugin] Créer un modèle et lier un éditeur avec une vue
    Par freekk91 dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 27/03/2005, 20h00
  4. alignement input avec image
    Par Shabata dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 24/02/2005, 09h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo