Codes postaux et villes dans un formulaire

Contenu du snippet

J'avais le problème suivant... en fait les problèmes suivants...

1) Je voulais que l'utilisateur n'ai qu'à entrer un code postal (CP) pour que la ville s'affiche automatiquement... facile me direz-vous (faire apparaitre une valeur y en fonction d'une autre x) oui, mais cas des CP avec plusieurs villes ?
il fallait donc qu'en cas de CP unique pour plusieurs villes, le champs texte 'ville' se change en liste (avec l'apparition d'un nouveau champs texte au cas ou la ville à choisir n'était dans dans la liste...)

2) Je ne voulais pas charger entièrement les 36 000 communes de France (pour l'affichage automatique), mais travailler qu'avec les communes d'une table. Les nouvelles communes, non connues donc, tapées pour la première fois, sont donc enregistrées dans une base, se limitant ainsi le travail aux seules communes entrées dans la base.

Vous suivez déjà le blem ?

J'ai donc créé une table SQL (villes) avec 'code_postal' (un code un 5 chiffre) et
'nom_ville' (le nom de la ville), tous les CP de la table sont chargés en PHP dans un JAVASCRIPT qui permet ensuite :
- d'afficher QUE le champs CP du formulaire lorsqu'il n'y a pas 5 chiffres
- d'afficher directement la ville (modifiable) dans un champs texte 'ville' une fois les 5 chiffres inscrits (champs vierge si le CP est inconnu)
- d'afficher une liste dans le cas ou un même CP est pour plusieurs communes (avec en plus un champs optionnel new_ville au cas ou...)

J'espère que cela vous aidera !

@+

Antoine "Dexterin" dexterin@fnac.net

Source / Exemple :


function TestVille(obj)
	{
	var cp = obj.cp.value;
	var ligne = "";
	var cible = document.getElementById("CaseVille");
	if (cp.length = 5) { cible.innerHTML = "<input type=\"text\" name=\"ville\" id=\"ville\" >"; } 
    if (cp.length < 5) { cible.innerHTML = "<input type=\"hidden\" name=\"ville\" value=\"\" >"; } 
	<?
	$cte_command = mysql_query("SELECT * FROM villes ORDER BY `code_postal` ASC", $dex_cte_db);
	$cte = 0;
	$cte_1 = "?";
	$cte_max = mysql_num_rows($cte_command) - 1;
	while ($cte <= $cte_max) 
		{
		$cte_2 = mysql_result($cte_command,$cte,code_postal);
		if ($cte != $cte_max)
			{	
			$cte_3 = mysql_result($cte_command,($cte + 1),code_postal);	
			}
		else 
			{ 
			$cte_3 = ""; 
			}
		if (($cte_1 == $cte_2) and ($cte_2 == $cte_3))
			{
			echo "ligne += \"<option value=\\\"" . mysql_result($cte_command,$cte,nom_ville) . "\\\">" . mysql_result($cte_command,$cte,nom_ville) . "</option>\\\"; ";
			}
		if (($cte_1 == $cte_2) and ($cte_2 != $cte_3))
			{
			echo "ligne += \"<option value=\\\"" . mysql_result($cte_command,$cte,nom_ville) . "\\\">" . mysql_result($cte_command,$cte,nom_ville) . "</option>\"; ligne += \"</select>\"; ligne += \"<BR> autre ? <input type=\\\"text\\\" name=\\\"ville\\\" id=\\\"new_ville\\\" size=\\\"18\\\" value=\\\"\\\">\"; cible.innerHTML = ligne; } ";
			}
		if (($cte_1 != $cte_2) and ($cte_2 == $cte_3))
			{
			echo "if (cp == " . $cte_2 . ") { ligne += \"<select name=\\\"ville\\\">\"; ligne += \"<option value=\\\"" . mysql_result($cte_command,$cte,nom_ville) . "\\\">" . mysql_result($cte_command,$cte,nom_ville) . "</option>\"; "; 
			}
		if (($cte_1 != $cte_2) and ($cte_2 != $cte_3))
			{ 
			echo "if (cp == " . $cte_2 . ") { cible.innerHTML = \"<input type=\\\"text\\\" name=\\\"ville\\\" id=\\\"ville\\\"   size=\\\"20\\\" value=\\\"" . mysql_result($cte_command,$cte,nom_ville) . "\\\">\"; } ";
			}
		$cte_1 = $cte_2;
		$cte_2 = $cte_3;
		$cte++;
		}
	mysql_free_result($cte_command);
	?> 
	}

et pour le code :

echo "<input type=\"text\" name=\"cp\" value=\"" . $cp . "\" size=\"5\" OnKeyUp=\"TestVille(this.form)\">";

echo "<TABLE><TR><TD valign=top align=right id=\"CaseVille\"></TD></TR></TABLE>";

le formulaire transmet alors 3 variables

cp (pour le code postal entré)
ville (pour la ville sélectionnée)

new_ville (automatiquement vide dans le cas d'un champs "texte" ville, et vide ou plein dans le cas d'une "liste" pour le champs ville)

Conclusion :


Pour le PHP, il faut préalablement que
$dex_cte_db = mysql_connect($dex_hostname, $dex_username, $dex_password);

C'est une variable que je stock dans un fichier req.infos.php que j'inclue systémétiquement au début de chaque page PHP...

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.