
Voici la suite du dernier tutoriel sur le slideshow jQuery. Ici nous allons nous intéresser à faire en sorte qu'on ait pas besoin d'entrer dans le code html pour mettre à jour les différents slides. Très pratique, car vous n'aurez plus besoin de redimensionner vos images à la main, ou encore passer par FTP pour modifier votre fichier. Et enfin, c'est indispensable si vous voulez proposer cette solution à un client et qu'il ne veut en aucun cas bidouiller le code.
Ce tutoriel est comme le précédent basé sur celui de Six Revisions (partie front-end statique). D'ailleurs si vous n'êtes pas allé voir le premier tutoriel je vous recommande très fortement d'aller y faire un tour!
Une question qui se doit d'être posée, puisqu'il est important de savoir quelles fonctionnalités nous allons développer avant de toucher à quelque chose.
Cette partie administration permettra donc de:
Suivant les fonctionnalités nous utiliserons 2 technologies: PHP et jQuery, qui avec de l'Ajax, permettra de ne recharger qu'une partie de la page.
Nous ne traiterons pas de la protection de l'accès à la page d'administration, puisque cela a déjà été l'objet d'un tutoriel. Voici comment nous allons organiser nos fichiers:

Ne prenez pas du tout ce modèle pour une vérité absolue, il est conçu pour une meilleur compréhension du tuto pour ne pas avoir trop de fichiers. Ainsi une fois ce tutoriel intégré à votre site, il sera préférable par exemple d'inscrire vos scripts javascript dans des fichiers externes, avoir 2 feuilles de styles différentes pour la partie site et administration. Bref c'est à vous de l'adapter à vos besoins et vos exigences :)
Nous allons stocker les différentes informations contenues dans les slides dans une base de données. Pour cela, nous allons avoir besoin de créer une table SQL contenant ces champs:
Le script pour créer cette table est le suivant, vous pouvez l'intégrer avec PHPMyAdmin :
Voici la structure PHP/HTML avec laquelle nous allons partir, chaque slide correspondra à un formulaire que nous appelons et affichons dynamiquement via une requête SQL
Chaque formulaire contient 2 champs de type hidden, c'est à dire des champs contenant des informations mais pas affichées à l'écran. L'un contiendra le numero du slide, l'autre informera s'il s'agit d'un ajout ou d'une modification (le traitement n'est pas le même en fonction). Notez aussi les 3 liens (supprimer, position+ et position -) qui ne renvoient pas véritablement de fonctions, mais dans le code Javascript nous leur attribuerons des évènements de type clic en fonction de leur classe.
Enfin dernier petit point, il est indispensable d'ajouter un attribut enctype="multipart/form-data" à votre formulaire, afin de pouvoir uploader des images via celui-ci.
Nous allons commencer la partie Javascript en renseignant la fonction ajouteSlide(). Comme nous allons travailler avec la librairie jQuery, il est essentiel de l'inclure avant de l'utiliser. Pensez aussi à bien vérifier que vous avez une version de jQuery supèrieure à la 1.3.
Tout d'abord, on récupère la position du dernier slide (et par conséquent cela définira l'identifiant du nouveau. L'instruction $("#formulaires form:last").clone().appendTo('#formulaires').hide().fadeIn(); peut paraître un peu barbare, mais elle signifie juste qu'on prend le dernier formulaires de notre liste, on le copie, puis on le colle en dernier dans notre liste de formulaires. Et comme j'aime bien les trucs jolis je le cache directement, et le fais apparaitre en fondu.
Une fois qu'on a ce nouveau formulaire, il faut réinitialiser ses valeurs. Pour manipuler ces informations, il faut principalement utiliser des méthodes jQuery comme html() ou val() qui change l'attribut value d'un champ ou le contenu d'un textarea. Et enfin, la méthode remove() pour supprimer un élément.
Voici le code à placer au début de votre fichier index.php
Quelques explications s'impsent: En premier lieu, nous définissons une constante qui déterminera l'emplacement du répertoire racine par rapport au répertoire dans lequel on se trouve, ici comme on est dans le répertoire admin, il faut remonter d'un niveau donc : '../' . Puis on définit le chemin vers les images et l'on inclut le fichier de configuration et la classe qui gère les images.
La fonction verifieTypeMime, comme son nom vérifie le type Mime des images uploadées, cela garantit une sécurité accrue puisque vous serez sur d'avoir affaire à de véritables images.
Les 2 lignes suivantes servent à se connecter à la base de donnée. Le reste du code est éxécuté si et seulement si un formulaire a été validé et qu'il contient tous les éléments. De la même manière que pour récupérér des valeurs avec la variable superglobale $_POST, on récupère un fichier uploadé avec la variable $_FILES, ['image'] correspondant dans cette situation à l'attribut name du champ input de type File. Ensuite il suffit de copier ce fichier (par défaut il se copie automatiquement dans un dossier temporaire de votre serveur) dans le bon répertoire et d'effectuer un traitement dessus avec la méthode Resize de la classe SBImage, disponnible en fichier texte, ou en téléchargeant directement la source.
A partir de là, on veut savoir s'il s'agit d'une modification ou d'une insertion. C'est là qu'entre en compte le champ caché que nous avions mis dans notre formulaire. Selon sa valeur la requête SQL n'aura pas du tout la même tête: Dans un cas on utilise INSERT INTO maTable(meschamps,a,b,c) VALUES(valA,valB,...) et dans l'autre cas: UPDATE maTable SET monChampA=valA, ... WHERE id=idDuSlide.
Comme vous avez pu le voir au début de ce tutoriel, j'ai parlé de certaines fonctionnalités qui seront développées avec Ajax, la suppression de slide en fait partie. Si vous souhaitez en savoir plus sur l'Ajax et son fonctionnement, je vous recommande d'aller voir un tutoriel qui vous initiera à cette technologie. Le principe est ici de faire en sorte que tous les clics qui seront effectuées sur des balises qui porteront la classe "supprimer" renverront vers une fonction javascript qui contiendra un appel Ajax vers un script PHP. Je suis sur qu'avec le code vous comprendrez mieux :
La première ligne signifie que ce code sera éxécuté dés que le document (l'arbre DOM) sera complètement chargé. Ce détail a toute son importance, sinon il ne reconnaitra aucune classe "supprimer" et passera à la suite.
La méthode "live" utilisée est en fait l'équivalent de "bind", la première permet (depuis jQuery 1.3) d'ajouter aussi des écouteurs aux objets qui sont crées par la suite en Javascript. Dans notre cas, cette démarche est essentielle puisqu'il peut être utile de vouloir supprimer un formulaire qu'on vient d'ajouter (même si cela paraît un peu idiot). En résumé, cette fonction live permet donc d'ajouter un écouteur qui comme son nom l'indique écoute et éxécute la fonction si les objets qui ont la classe "supprimer" ont reçu un évènement : en l'occurence, un clic ici.
Une fois dans cette fonction, il faut récupérer l'identifiant du slide qui y est associé. Le procédé est là aussi un peu compliqué: On récupère l'objet actuel ($(this)), puis son élément parent (parent()), qui n'est rien d'autre que le formulaire et enfin on cherche la balise legend (find('legend')) puis sa valeur (html()) que l'on multiplie par 1 (petite astuce Javascript pour convertir une chaîne en nombre).
Enfin la requête Ajax qui apelle le fichier PHP : "ajax.php", avec comme paramètre (passé en variable $_GET), l'identifiant du slide que l'on veut supprimer. Le 3ème paramètre est la fonction que l'on éxécute lorsque la requête est terminée. Nous n'aurons plus qu'à faire disparaître le formulaire. Puis modifier les identifiants des formulaires qui suivent. Attention, ici on ne change que l'HTML, si on ne fait rien dans notre script "ajax.php", les slides auront les mêmes identifiants, et aucun ne sera supprimé.
La dernière étape a consisté à supprimer visuellement un slide, ici nous le supprimerons dans la Base de données, et nous le ferons dans le script "ajax.php" qui est appelé en Ajax.
Dans un premier temps, on supprime l'image qui est associée au slide que l'on veut supprimer avec la fonction unlink(). Une fois cette opération faite il suffira de supprimer de la Base de donnée la ligne du slide (avec DELETE FROM maTable WHERE id=idDuSlideaSupprimer). Enfin on met a jour les identifiants de tous les slides suivant: afin de toujours avoir une suite continue. Ce traitement se fait avec la requête SQL : UPDATE maTable SET id=id-1 WHERE id>idASupprimé.
L'intérêt d'avoir une partie administration est aussi de pouvoir changer la position d'un slide très facilement. Nous verrons dans cette étape, comment changer la position d'un formulaire dans l'arbre DOM avec jQuery, puis dans l'étape suivante les opérations à effectuer côté serveur.
Une fois de plus, le code peut sembler un peu barbare mais ce sont les mêmes méthodes jQuery qui reviennent souvent. Pour cette fonction, il faut biensur vérifier si le slide n'est évidemment pas le dernier de la liste auquel cas on informe l'utilisateur qu'il n'y aura aucun changement de position.On utilise donc pour cela, la fonction is(':last-child') qui retourne true s'il s'agit bien du dernier formulaire se trouvant dans la div #formulaires.
Autre subtilité : pour replacer le formulaire à sa bonne place, on utilise $(form.next()).after(form);. form.next() récupère le formulaire suivant, et on lui indique de le placer après celui ci avec .after().
Voici la fonction inverse:
Comme vous pouvez le voir le fonctionnement est très semblable à la fonction précédente.
Maintenant nous allons nous occuper de la partie PHP et dans le fichier "ajax.php", faire en sorte d'intervertir 2 identifiants dans notre base de données. Voici le bout de code à placer à la suite de ce qui est déjà écrit:
En fait l'identifiant étant un champ unique, on ne peut pas effectuer d'opérations simples comme un UPDATE sur l'identifiant, car 2 champs seraient à un instant donné équivalents, ce qui provoquerait une erreur logique. L'alternative consiste donc à modifier tous les autres champs (titre, lien,texte, img).
Enfin, pour embellir notre page d'administration je vous propose ce CSS:
A partir de là il faut reprendre le 1er tutoriel et au lieu d'y inscrire les div à la main, nous allons faire une boucle PHP/SQL pour les afficher dynamiquement ce qui nous donnera ceci:
Ce tutoriel est enfin terminé. Il est un peu difficile et surtout très long mais il permet de bien réviser les bases de PHP. De plus il est un excellent exercice pour s'approprier jQuery. Merci encore à SixRevisions et à Jacob Gube pour la base qu'il a apporté.
et "(img/admin.png)" sans guillemets quelle est la différence ?