Bonjour, voici une petite méthode pour faire de l'ajax simple sans aucun plugin : le DSL
Dans l'idée nous allons apprendre à créer une page qui affiche un nombre et un bouton pour incrémenter ce nombre.
Afin de stocker ce nombre, nous allons le ranger bien au chaud dans une BDD.
Notre page devra donc :
incrémenter ce nombre dans la BDD sans rechargement de la page
mettre à jour l'affichage du nombre, toujours sans recharger la page (sinon c'est trop simple )
L'utilisation d'une BDD juste pour un nombre peut paraitre exhaustive, mais l'idée est d'appliquer la méthode avec plusieurs nombres, possédants chacun un id... on verra ça après
Nous allons utiliser deux pages : index.php et incrementation.php.
Voici index.php :
<?php
$bdd = new PDO('mysql:host=kpsoftware.fr;dbname= toto','jean-michel','fjhbqfkqsfhgsjkgbs');
?> /* connexion à la BDD */
<div style="text-align: center;">
<span class="leNombre">
<?php
$nombre=$bdd->query('SELECT nombre FROM nombre');
$nombre=$nombre->fetch();
echo $nombre['nombre'];
?>
</span> /* on à notre nombre ! */
<input value="Plus un !" type="button"/>
</div>
<script> /* les choses sérieuses commencent ici */
function addEvent(element, event, func){
if (element.attachEvent) {
element.attachEvent('on'+event, func);
} else {
element.addEventListener(event, func, true);
}
} /* ceci est notre fonction pour ajouter des évènement en javascript */
(function(){
var elements = document.getElementsByTagName('input')
for (var i=0;i<elements.length;i++){
addEvent(elements[i],'click',function(e){ /* on ajoute un évènement sur les "input" */
var target=e.target || e.srcElement;
if(target.value == 'Plus un !'){ /* quand un "input" est cliqué, on teste sa "value" */
/* si cette "value" est "plus un !", alors on créer un script, dont la source est une page php : incrementation.php. Il ne reste plus qu'à l'ajouter ! */
var scriptElement = document.createElement('script');
scriptElement.src ='incrementation.php';
document.body.appendChild(scriptElement);
}
});
}
})(); /* à ce stade, incrementation.php à été exécuté, je vous invite à aller voir cette page avant de lire la fin de index.php */
function refreshNombre(newNombre){
var spanElements = document.getElementsByTagName('span');
var newSpan = document.createTextNode(' ' + newNombre + ' ');
/* on créer notre nouveau span contenant le nouveau nombre */
for (var i=0;i<spanElements.length;i++){
var classSpan = spanElements[i].className;
if (classSpan == "leNombre"){ /* on test pour trouver le bon span */
spanElements[i].replaceChild(newSpan.cloneNode(false),spanElements[i].firstChild);
/* et là on remplace le firstChild (le texte) de spanElements[i] ( le span contenant l'ancien nombre ) par un clone de newSpan (celui créer juste au dessus contenant le nouveau nombre */
}
}
}
</script>
voici maintenant incrementation.php :
<?php
header("Content-type: text/javascript");
$nombre=$bdd->query('SELECT nombre FROM nombre');
$nombre=$nombre->fetch();
$newNombre=$nombre['nombre']+1;
//on récupère le nombre
$nombre->closecursor();
$upNbr=$bdd->prepare('UPDATE nombre SET nombre = :newNombre');
$upNbr->execute(array('newNombre'=>$newNombre));
$upNbr->closecursor();
// on l'incrémente
?>
refreshNombre(<?php echo $newNombre ?>);
/* on execute enfin la dernière fonction de index.php qui va se charger de rafraichir le nombre sur la page, il n'y à eu aucun reload de la part du navigateur ! */
Si les commentaires ne sont pas assez explicatifs dites-le moi ! je me ferais un plaisir de détailler tout ça !
Bien, si vous avez compris l'idée de l'appel d'une page externe via JS pour exécuter un code php sans reload de page, vous avez tout compris. Mais pour exploiter pleinement la puissance du DSL et de la BDD, il nous faudrait avoir plusieurs bouton et nombres dynamiques.
Pour cela il suffirait d'envoyer au script incrementation.php une id afin de transformer la requête SQL en :
$upNbr=$bdd->prepare('UPDATE nombre SET nombre = :newNombre' WHERE id= :id);
$upNbr->execute(array('newNombre'=>$newNombre, 'id'=>$_GET['id']));
$upNbr->closecursor();
et on change la fonction refresh pour qu'elle contienne un paramètre en plus : l'id
function refreshNombre(id,newNombre){
var spanElements = document.getElementsByTagName('span');
var newSpan = document.createTextNode(' ' + newNombre + ' ');
for (var i=0;i<spanElements.length;i++){
var classSpan = spanElements[i].className;
var idSpan = classSpan.substring(classSpan.lastIndexOf('a')+1);
if (idSpan == id){
spanElements[i].replaceChild(newNombre.cloneNode(false),spanElements[i].firstChild);
}
}
}
avec son appel :
refreshNombre(<?php echo $_GET['id']; ?>,<?php echo $newNombre; ?>);
Avez-vous vu la subtilité du :
var idSpan = classSpan.substring(classSpan.lastIndexOf('a')+1);
?
En fait, en HTML il est impossible de mettre un nom de class commençant par un chiffre... du coup, on met un "a" devant et on utilise "substring" pour découper ce "a"
on prend la dernière apparition de "a" et on ajoute 1 au rang, il ne nous reste plus que l'id !
celui-ci est donc afficher sur index.php comme ceci :
<span class="a<?php echo $nombre['id'];?>"> <?php echo $nombre['nombre']; ?> </span>
bien sûr la requere SQL change légèrement :
SELECT * FROM nombre
Voilà voilà ! DSL dans toute sa grandeur ! Si vous avez des questions n'hésitez pas !