Listes déroulantes liées par AJAX

1 message   •   Page 1 sur 1
Mammouth du PHP | 1885 Messages

13 oct. 2005, 01:41

Bonjour,

AJAX est le moyen d'effectuer des requêtes HTTP vers le serveur sans recharger la page. Cela permet de mettre à jour des données de manière transparente au visiteur.

L'archive suivante contient un exemple d'utilisation d'AJAX. La solution n'est certainement pas la plus optimale, ni exempte d'erreurs de conception ou autres trucs de ce genre. Elle est donc distribuée "tel quel" sans garanti de fonctionnement parfait.

Vous devez avoir PHP5 avec l'extension mysqli installés sur votre serveur pour faire fonctionner l'exemple. De plus, l'extension DOM ne doit pas être désactivée puisqu'elle est utilisée.

Testé sous: Firefox 1.5 beta2 et Internet Explorer 6

http://pub.generationphp.net/ajax.zip

config.inc.php
<?php
$db = array(
	'server' => 'localhost',
	'user' => 'database',
	'passwd' => '',
	'name' => 'test'
);
?>
index.php
<?php
require './config.inc.php';

$mysqli = new mysqli($db['server'], $db['user'], $db['passwd'], $db['name']);

if (0 !== mysqli_connect_errno()) {
	exit('Could not connect to database: ' . mysqli_connect_error());
}

// Regions initiales
$sql = 'SELECT region_id, region_name FROM regions';
?>

<script type="text/javascript" src="regions.js"></script>

<form action="submit.php" method="post" id="form">

<p>Sélectionnez une région:
	<select name="regions" id="regions" onchange="updateDepartements(this.value)">
	<?php
	if (FALSE !== ($res = $mysqli->query($sql))) {

		while ($row = $res->fetch_assoc()) {
			printf('<option value="%s">%s</option>', $row['region_id'],  $row['region_name']);
		}
		$res->close();
	}
	?>
	</select>
</p>

<p>Sélectionnez un département:
	<select name="departements" id="departements"></select>
</p>

<p><input type="submit" value="Soumettre" />

</form>
rpc.php
<?php
if (TRUE === isset($_GET['region'])) {
	$region = intval($_GET['region']);
} else {
	exit;
}

require './config.inc.php';

$mysqli = new mysqli($db['server'], $db['user'], $db['passwd'], $db['name']);

if (0 !== mysqli_connect_errno()) {
	exit('Could not connect to database: ' . mysqli_connect_error());
}

header('Content-Type: text/xml; charset=UTF-8');

$dom = new DOMDocument('1.0', 'utf-8');
$message = $dom->createElement('message');
$message = $dom->appendChild($message);

$sql = 'SELECT departement_id, departement_name ' .
       'FROM departements ' .
       'WHERE region_id=' . $region;

if (FALSE !== ($res = $mysqli->query($sql))) {

	while ($row = $res->fetch_assoc()) {
		$departement = $dom->createElement('departement', utf8_encode($row['departement_name']));
		$departement = $message->appendChild($departement);
		$departement->setAttribute('id', $row['departement_id']);
	}
	$res->close();
}

echo $dom->saveXML();
?>
regions.js
var ajax;

try {
	ajax = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
	try {
		ajax = new ActiveXObject("Microsoft.XMLHTTP");
	} catch (e) {
		if (typeof XMLHttpRequest!='undefined') {
			ajax = new XMLHttpRequest();
		}
	}
}

function updateDepartements(region) {
	ajax.open('get', 'rpc.php?region=' + region);
	ajax.onreadystatechange = handleResponse;
	ajax.send(null);
}

function handleResponse() {

	if(ajax.readyState == 4) {

		var data = ajax.responseXML.getElementsByTagName('departement');

		document.getElementById('departements').innerHTML = '';
		for(var i=0;i<data.length;i++) {

			var option = document.createElement('option');
			option.setAttribute('value',data[i].getAttribute("id"));
			option.appendChild(document.createTextNode(data[i].firstChild.nodeValue));
			document.getElementById('departements').appendChild(option);
		}
	}
}

function initForm() {
	document.getElementById('regions').selectedIndex = 0;
	updateDepartements(document.getElementById('regions').value);
}

if (window.addEventListener) {
	window.addEventListener("load", initForm, false); 
} else if (window.attachEvent){ 
	window.attachEvent("onload", initForm); 
}
test.sql

Code : Tout sélectionner

-- -- Table structure for table `departements` -- CREATE TABLE `departements` ( `departement_id` char(2) NOT NULL default '', `departement_name` varchar(50) NOT NULL default '', `region_id` tinyint(4) NOT NULL default '0', PRIMARY KEY (`departement_id`), KEY `id_region` (`region_id`) ); -- -- Dumping data for table `departements` -- INSERT INTO `departements` VALUES ('01', 'Ain', 22); INSERT INTO `departements` VALUES ('02', 'Aisne', 19); INSERT INTO `departements` VALUES ('03', 'Allier', 3); INSERT INTO `departements` VALUES ('04', 'Alpes-de-Haute-Provence', 21); INSERT INTO `departements` VALUES ('05', 'Hautes-Alpes', 21); INSERT INTO `departements` VALUES ('06', 'Alpes-Maritimes', 21); INSERT INTO `departements` VALUES ('07', 'Ardèche', 22); INSERT INTO `departements` VALUES ('08', 'Ardennes', 8); INSERT INTO `departements` VALUES ('09', 'Ariège', 16); INSERT INTO `departements` VALUES ('10', 'Aube', 8); INSERT INTO `departements` VALUES ('11', 'Aude', 13); INSERT INTO `departements` VALUES ('12', 'Aveyron', 16); INSERT INTO `departements` VALUES ('13', 'Bouches-du-Rhône', 21); INSERT INTO `departements` VALUES ('14', 'Calvados', 4); INSERT INTO `departements` VALUES ('15', 'Cantal', 3); INSERT INTO `departements` VALUES ('16', 'Charente', 20); INSERT INTO `departements` VALUES ('17', 'Charente-Maritime', 20); INSERT INTO `departements` VALUES ('18', 'Cher', 7); INSERT INTO `departements` VALUES ('19', 'Corrèze', 14); INSERT INTO `departements` VALUES ('21', 'Côte-d''Or', 5); INSERT INTO `departements` VALUES ('22', 'Côtes-d''Armor', 6); INSERT INTO `departements` VALUES ('23', 'Creuse', 14); INSERT INTO `departements` VALUES ('24', 'Dordogne', 2); INSERT INTO `departements` VALUES ('25', 'Doubs', 10); INSERT INTO `departements` VALUES ('26', 'Drôme', 22); INSERT INTO `departements` VALUES ('27', 'Eure', 11); INSERT INTO `departements` VALUES ('28', 'Eure-et-Loir', 7); INSERT INTO `departements` VALUES ('29', 'Finistère', 6); INSERT INTO `departements` VALUES ('2A', 'Corse-du-Sud', 9); INSERT INTO `departements` VALUES ('2B', 'Haute-Corse', 9); INSERT INTO `departements` VALUES ('30', 'Gard', 13); INSERT INTO `departements` VALUES ('31', 'Haute-Garonne', 16); INSERT INTO `departements` VALUES ('32', 'Gers', 16); INSERT INTO `departements` VALUES ('33', 'Gironde', 2); INSERT INTO `departements` VALUES ('34', 'Hérault', 13); INSERT INTO `departements` VALUES ('35', 'Ille-et-Vilaine', 6); INSERT INTO `departements` VALUES ('36', 'Indre', 7); INSERT INTO `departements` VALUES ('37', 'Indre-et-Loire', 7); INSERT INTO `departements` VALUES ('38', 'Isère', 22); INSERT INTO `departements` VALUES ('39', 'Jura', 10); INSERT INTO `departements` VALUES ('40', 'Landes', 2); INSERT INTO `departements` VALUES ('41', 'Loir-et-Cher', 7); INSERT INTO `departements` VALUES ('42', 'Loire', 22); INSERT INTO `departements` VALUES ('43', 'Haute-Loire', 3); INSERT INTO `departements` VALUES ('44', 'Loire-Atlantique', 18); INSERT INTO `departements` VALUES ('45', 'Loiret', 7); INSERT INTO `departements` VALUES ('46', 'Lot', 16); INSERT INTO `departements` VALUES ('47', 'Lot-et-Garonne', 2); INSERT INTO `departements` VALUES ('48', 'Lozère', 13); INSERT INTO `departements` VALUES ('49', 'Maine-et-Loire', 18); INSERT INTO `departements` VALUES ('50', 'Manche', 4); INSERT INTO `departements` VALUES ('51', 'Marne', 8); INSERT INTO `departements` VALUES ('52', 'Haute-Marne', 8); INSERT INTO `departements` VALUES ('53', 'Mayenne', 18); INSERT INTO `departements` VALUES ('54', 'Meurthe-et-Moselle', 15); INSERT INTO `departements` VALUES ('55', 'Meuse', 15); INSERT INTO `departements` VALUES ('56', 'Morbihan', 6); INSERT INTO `departements` VALUES ('57', 'Moselle', 15); INSERT INTO `departements` VALUES ('58', 'Nièvre', 5); INSERT INTO `departements` VALUES ('59', 'Nord', 17); INSERT INTO `departements` VALUES ('60', 'Oise', 19); INSERT INTO `departements` VALUES ('61', 'Orne', 4); INSERT INTO `departements` VALUES ('62', 'Pas-de-Calais', 17); INSERT INTO `departements` VALUES ('63', 'Puy-de-Dôme', 3); INSERT INTO `departements` VALUES ('64', 'Pyrénées-Atlantiques', 2); INSERT INTO `departements` VALUES ('65', 'Hautes-Pyrénées', 16); INSERT INTO `departements` VALUES ('66', 'Pyrénées-Orientales', 13); INSERT INTO `departements` VALUES ('67', 'Bas-Rhin', 1); INSERT INTO `departements` VALUES ('68', 'Haut-Rhin', 1); INSERT INTO `departements` VALUES ('69', 'Rhône', 22); INSERT INTO `departements` VALUES ('70', 'Haute-Saône', 10); INSERT INTO `departements` VALUES ('71', 'Saône-et-Loire', 5); INSERT INTO `departements` VALUES ('72', 'Sarthe', 18); INSERT INTO `departements` VALUES ('73', 'Savoie', 22); INSERT INTO `departements` VALUES ('74', 'Haute-Savoie', 22); INSERT INTO `departements` VALUES ('75', 'Paris', 12); INSERT INTO `departements` VALUES ('76', 'Seine-Maritime', 11); INSERT INTO `departements` VALUES ('77', 'Seine-et-Marne', 12); INSERT INTO `departements` VALUES ('78', 'Yvelines', 12); INSERT INTO `departements` VALUES ('79', 'Deux-Sèvres', 20); INSERT INTO `departements` VALUES ('80', 'Somme', 19); INSERT INTO `departements` VALUES ('81', 'Tarn', 16); INSERT INTO `departements` VALUES ('82', 'Tarn-et-Garonne', 16); INSERT INTO `departements` VALUES ('83', 'Var', 21); INSERT INTO `departements` VALUES ('84', 'Vaucluse', 21); INSERT INTO `departements` VALUES ('85', 'Vendée', 18); INSERT INTO `departements` VALUES ('86', 'Vienne', 20); INSERT INTO `departements` VALUES ('87', 'Haute-Vienne', 14); INSERT INTO `departements` VALUES ('88', 'Vosges', 15); INSERT INTO `departements` VALUES ('89', 'Yonne', 5); INSERT INTO `departements` VALUES ('90', 'Territoire de Belfort', 10); INSERT INTO `departements` VALUES ('91', 'Essonne', 12); INSERT INTO `departements` VALUES ('92', 'Hauts-de-Seine', 12); INSERT INTO `departements` VALUES ('93', 'Seine-Saint-Denis', 12); INSERT INTO `departements` VALUES ('94', 'Val-de-Marne', 12); INSERT INTO `departements` VALUES ('95', 'Val-d''Oise', 12); -- -------------------------------------------------------- -- -- Table structure for table `regions` -- CREATE TABLE `regions` ( `region_id` tinyint(4) NOT NULL auto_increment, `region_name` varchar(50) NOT NULL default '', PRIMARY KEY (`region_id`) ); -- -- Dumping data for table `regions` -- INSERT INTO `regions` VALUES (1, 'Alsace'); INSERT INTO `regions` VALUES (2, 'Aquitaine'); INSERT INTO `regions` VALUES (3, 'Auvergne'); INSERT INTO `regions` VALUES (4, 'Basse-Normandie'); INSERT INTO `regions` VALUES (5, 'Bourgogne'); INSERT INTO `regions` VALUES (6, 'Bretagne'); INSERT INTO `regions` VALUES (7, 'Centre'); INSERT INTO `regions` VALUES (8, 'Champagne'); INSERT INTO `regions` VALUES (9, 'Corse'); INSERT INTO `regions` VALUES (10, 'Franche-Comté'); INSERT INTO `regions` VALUES (11, 'Haute-Normandie'); INSERT INTO `regions` VALUES (12, 'Île-de-France'); INSERT INTO `regions` VALUES (13, 'Languedoc-Roussillon'); INSERT INTO `regions` VALUES (14, 'Limousin'); INSERT INTO `regions` VALUES (15, 'Lorraine'); INSERT INTO `regions` VALUES (16, 'Midi-Pyrénées'); INSERT INTO `regions` VALUES (17, 'Nord-pas-de-Calais'); INSERT INTO `regions` VALUES (18, 'Pays de la Loire'); INSERT INTO `regions` VALUES (19, 'Picardie'); INSERT INTO `regions` VALUES (20, 'Poitou-Charentes'); INSERT INTO `regions` VALUES (21, 'Provence-Alpes-Côte-d''Azur'); INSERT INTO `regions` VALUES (22, 'Rhône-Alpes');
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

1 message   •   Page 1 sur 1