Rapport de Projet
Transcription
Rapport de Projet
Année 2004-2005 IUT de Chalon-sur-Saône Licence Professionnelle TAIS BIBLIOTHÈQUE ATTAC Tuteur: Yannick Chenevoy Meyer Michel & Peters Anthony 1 SOMMAIRE Objectif du projet Constitution de la page Graphisme Techniques Fichiers principaux La base de données Modèle conceptuel de données Détail des tables Manipulation des variables Variables de session Variables postées Utilisation du javascript Les feuilles de style CSS Positionnement des blocs 3 3 3 3 4 5 5 6 9 9 10 11 13 14 Les fichiers XML, XSL et le principe de fonctionnement du parser 15 Les fonctionnalités du site 20 XML (eXtensible Markup langage) XSL (eXtensible Stylesheet Language) Parser en PHP (Sablotron) Intégration des différents éléments dans une même page Gestion des données par l'utilisateur Gestion des comptes utilisateurs Gestion des images pour les références Utilisation du parser XML+XSL dans l'affichage des références Ajout de références Conclusion Meyer Michel & Peters Anthony 15 16 19 20 20 22 27 30 31 32 2 Objectif du projet Le projet a pour but de créer un bibliothèque commune, permettant au sympathisant de l'association ATTAC de s'échanger leurs documents (livre, DVD, VHS, articles, CD, CD-ROM) en les gérant par le bilai d'une page internet. Un utilisateur non enregistré pourra consulter la liste des références de la bibliothèque sans avoir accès aux informations concernant le propriétaire ou l'emprunteur par souci d'anonymat Un utilisateur enregistré et logé pourra avoir accès a ces informations et pourra ajouter, modifier et supprimer seulement ses propres références. C'est l'utilisateur qui défini si un de ses documents est empruntés et par qui. Constitution de la page ● Graphisme La page étant destiné à être rattaché à la page principal de groupe ATTAC Saône et Loire (http://www.local. attac.org/saone-et-loire ), la charte graphique à été semblable à là leurs. les pointillées rouge délimitant les différents menus on été repris. Pour leurs fonds, un jaune clair à été choisi rendant la page moins agressive. Des dominantes de rouges vifs et sombres ont été choisi pour les textes et les différentes décorations, dans la lignée de tous les sites d'ATTAC en général. La mise en page est entièrement gérée par des fichiers CSS, contrôlant précisément l'aspect graphique de la page. ● Techniques Cette page est constitué d'une base de donnée en SQL et d'un serveur Apache permettant l'exécution de code PHP sur le serveur. Le module Sablotron à été ajouté au serveur pour pouvoir « parser » des fichiers XML et XSL en HTML. Du javascript à aussi été utilisé pour contrôler les données entrées par le bilai des formulaires mais aussi pour un certains nombres de modifications de valeurs d'attributs de l'HTML La base de donnée SQL contient l'ensemble des données nécessaires à l'existence de la bibliothéque et à la gestion des comptes. Le PHP à été utilisé pour permettre de faire toutes les opérations de lecture et d'écriture sur la base de Données ainsi que la mise en page des fichiers HTML destinés au Client Le Parser à été utilisé à deux endroits, premièrement pour l'affichage du contenu de la bibliothèque et aussi dans le formulaire permettant l'ajout d'un document à la base, lorsqu'il est proposé à l'utilisateur de chercher une image de la référence sur internet. Meyer Michel & Peters Anthony 3 ● Les fichiers principaux Voici les fichiers apparants, ceux qui sont appelés par l'index. Les liens représentent les appels des fichiers entre eux, ceux auxquels peuvent avoir accès les visiteurs suivant leur rang (s'ils disposent d'un compte ou sont de simples visiteurs). L'accès est restreint par une série de variables que s'échangent les fichiers, ainsi si un utilisateur tente d'accèder à un fichier alors qu'il ne devrait pas, la variable du fichier qui l'appele n'est pas active et le code n'est pas exécuté. Certaines fonctions php permettent d'effectuer une redirection du visiteur, dans notre cas cette redirection sera toujours effectuée vers l'index. Meyer Michel & Peters Anthony 4 La base de données ● Modèle conceptuel de données de la base biblio Nous avons utilisé deux tables de liaison pour les auteurs et les sujets de chaque référence, car une référence peut traiter de différents thèmes et être l'oeuvre de plusieurs auteurs. Ces tables sont constituées de clés étrangères, ou clés primaires importées d'autres tables. C'est pourquoi il n'existe pas de champs renfermant les auteurs ni les sujets dans la table des références. Chaque champs d'une table fait référence à une information unique. Par exemple le propriétaire, il semble assez peu probable qu'il y en ait plusieurs pour une même référence. Si cela se produisait, une nouvelle référence pourrait être créée dont les valeurs des différents champs seraint identiques, excepté celui de l'auteur et la clé primaire (ID). Meyer Michel & Peters Anthony 5 Un maximum d'informations est stoqué dans chaque table, afin d'alléger le contenu des requêtes SQL et de réduire leur nombre. Ainsi les coordonnées de chaque membre cotoient ses identifiants de connexion au serveur, et à chaque référence est associé un propriétaire et un emprunteur. Les tables de groupe dont fait partie chaque membre et de type de média ne renferment qu'une information mais évitent de réinscrire, pour chaque référence ou nouveau membre, des informations qui seront systématiquement les mêmes. ● Détail des tables La table TMEDIA: - L'ID est le nom de la clé primaire dans toutes les tables. Dans ce cas, il peut y avoir 99 médiums différents, ce qui laisse une certaine marge, étant donné qu'il y en a 6 dans la base pour l'instant (CD, DVD, livre, revue... ). La taille des variables ID est choisie de manière à pouvoir stoquer un nombre suffisants d'informations dans la base de données, sans que celle-ci devenienne devienne trop encombrante. - TYPE renferme, pour chaque ID, le type correspondant en toutes lettres. Les tables TGROUPES et TMOTCLE contiennent les mêmes champs, seule la taille des ID varie. La table TAUTEURS: - Ici le nom de l'auteur est décomposé en deux champs, afin de les afficher dans l'ordre souhaité. Meyer Michel & Peters Anthony 6 Les tables TJREF_AUTEUR et TJREF_EMPRUNTEUR: - Celles-ci ne renferment aucune donnée, elles sont remplies de valeurs numériques. Elles sont utilisés pour établir une relation entre les tables trefs, tauteurs et tmotcles. A chaque référence est associée l'ID de l'auteur. Autant de tuples sont créés qu'il y a d'auteur ou de sujets pour chaque référence. La table TREFS: - Les champs titre, image et commentaire doivent permettre de stoquer des chaînes de caractères suffisament longues pour contenir un url ou des phrases complètes. - La valeur NULL est affectée par défaut au champ commentaire car celui-ci n'est pas indispensable. - 0 ne correspond à aucun membre ni type de support, 0 ou NULL sont équivalents car la valeur du champ ne sera pas affichée. De toute façon, un propriétaire et un type de support sont systématiquement affectés. Meyer Michel & Peters Anthony 7 La table TMEMBRES: - Pseudo et pass sont les noms d'utilisateur et mot de passe, utilisés pour la connexion au serveur. - Etat indique si le compte de l'utilisateur est activé. - Le moment de création sert de référence, sa valeur correspond à l'instant où l'utilisateur a soumi le formulaire, et où ses informations ont été enregistrées. Cela permet d'effacer les données des comptes qui n'ont pas été validés après un certain temps. - Le champ Qualité n'est utilisé qu'à titre indicatif, afin de fournir une information supplémentaire sur le membre aux visiteurs. Libre à lui de ne pas le remplir. Meyer Michel & Peters Anthony 8 Manipulation des variables ● Variables de session Intérêt: Les variables de session permettent de stocker des informations concernant les utilisateurs tout au long de leur visite sur le site. Par contre elles ne permettent pas de conserver ces informations en vue d'une prochaine visite, pour cela il faut utiliser les cookies, l'équivalent stoqué sur le poste client. Mais étant donné le nombre d'informations à retenir (authentification), ce n'est pas nécéssaire dans notre cas. Fonctionnement: Une fonction débute lorsqu'un utilisateur arrive sur la page, grâce à la fonction session_start() et prend fin lorsque l'utilisateur s'en va, à condition que la conservation des variables ne se fasse pas par des cookies. Toutes les pages utilisant les variables session doivent appeler la fonction session_star() pour indiquer au moteur PHP de charger les informations relatives à la session dans la mémoire. La fonction session_star() essaye de trouver l'identificateur de la session. Si celui-ci n'a pas pu être trouvé, une nouvelle session est alors créée, et les données sont perdues. Cela se produit régulièrement avec Internet Explorer. Il y a possibilité de terminer la session grâce à la fonction session_destroy(), cela peut s'avérer utile lorsqu'un membre se déconnecte de son compte propre, mais reste présent sur le site en tant qu'invité. La variable qui l'identifie comme un membre n'a alors plus lieu d'être. Manipulation: Les sessions se manipulent de la même façon qu'un tableau, dont l'indice est le nom de la variable que l'on souhaite affecter. Exemple : $_SESSION['variable']=valeur; La destruction des variables peut se faire de deux façons, soit par la fonction unset($_SESSION['variable']), qui détruit uniquement la variable spécifiée, soit par la fonction session_destroy() qui elle met fin à la toute la session, et les valeurs qui lui avaient été assignées. Meyer Michel & Peters Anthony 9 ● Variables postées (par le biais de formulaires javascript) Exemple de formulaire <form name="nvcompte" method="post" action="index.php"> ... <td align="right" valign="top"> <h4>Adresse</h4> </td> <td align="left" valign="top"> <input type="text" name="adresse" size="24" border="0"> </td> ... <input type="button" value="Créer le compte" onclick="verifCompte(this.form)"> ... <input type="hidden" value="" name="nouvcompte"> </form> Chaque balise input pourra être récupérée en php une fois le formulaire soumis, ces variables sont soit le contenu de champs de saisie (ici adresse), soit l'option sélectionnée dans un menu déroulant, ou encore des variables invisibles, auxquelles l'utilisateur n'a pas accès, qui seront traitées par javascript. L'appel du script se fait grâce à l'attribut onclick . Fonction javascript qui vérifie l'intégrité du formulaire: function verifCompte(formulaire) { var pseudo=false; var qualite=false; var alias=formulaire.pseudo.value; ... //on crée une variable pour chaque champs du formulaire if(alias.length < 16) ... if(estCeUnMail(formulaire.courriel)) courriel=true; if(estCeUnPhone(formulaire.telephone)) { formulaire.telephone.value=transPhone(formulaire.telephone.value); tel=true; //vérification de l'existence des variables et de leur conformité, s'il s'agit d'un numéro de //téléphone par exemple, ou d'une adresse mel } if(!formulaire.id_groupe.value == "") comite=true; if(!formulaire.adresse.value == "") adresse=true; if(pseudo&&nom&&prenom&&comite&&adresse&&courriel&&tel) { formulaire.nouvcompte.value="ok"; formulaire.submit(); Le formulaire est soumis //si tous les champs sont correctement //remplis le formulaire est soumis grâce à la fonction submit } else //affichage d'un message d'erreur } Meyer Michel & Peters Anthony 10 Utilisation du javascript C'est dans les formulaires que la plus grande partie du javascript à été utilisé, essentiellement pour vérifier et formater les informations entrées par l'utilisateur. Le fichier form.inc.js contient les fonctions permettant la validation d'un numéro de téléphone, d'un champ de texte, d'un courriel, d'un paragraphe (avec certaines restrictions paramétrables comme le nombre de lignes et de caractères). L'ajout multiple Le problème de l'ajoute de plusieurs valeurs, pour les auteurs et pour les sujets, issu de la base de données ou nouveaux, c'est aussi posé et à trouvé sa réponse dans le javascript. La technique consiste à créer un tableau (Array()) et de lui affecté la valeur, sois du menu déroulant, soit des champs nom et prénom pour ensuite les ajouter à un autre menu déroulant (à droite). Un teste est effectué pour ne pas que l'on puisse ajouter plusieurs fois la même valeur. Pour supprimer un auteur, il suffit d'effacer la ligne sélectionnée du tableau et de réafficher le menu déroulant de droite. Le contenu du menu déroulant comprenant les noms déjà existants dans la base de donnée à été généré grâce au PHP par une requête SQL. Le javascript à aussi été utilisé pour afficher ou cacher certaine partie de menu en changeant l'attribut indiquant quelle type de formatage CSS est à appliquer à ce bloque, cette technique est utilisé à plusieurs endroits du site, et elle produit un effet dynamique sans avoir à recharger la page. Meyer Michel & Peters Anthony 11 Exemples de fonctions utilisées en javascript: Fonction permettant de changer la valeur de l'identifiant CSS d'un élément HTML function toggle(id_amont) id_amont est le nom d'un élément dont on alterne l'identifiant CSS { if (document.getElementById) si l'on peut utiliser la méthode getElementById { var fdiv = document.getElementById(id_amont); la variable est égal au chemin de id_amont if (fdiv.className != 'min') { fdiv.className = 'min'; on alterne les valeurs de classe min et max de id_amont } else { fdiv.className = 'max'; } } } Fonction utilisé pour faire l'alternance entre la description court et long des références (centre.php) function switch_aff(id) id est un chiffre générer par le fichier ref.xsl et qui compte les références à affichées { var court="desc_court"; chaque élément <div id='desc_court*'> est générer en xsl avec, comme var longe="desc_long"; pour le paramètre de la fonction, le chiffre qui les comptes en plus court+=id; longe+=id; if(document.getElementById(court).className=="montre" ) { alternance entre affichage de l'un et de masquage l'autre } else { } } document.getElementById(court).className="cache"; document.getElementById(longe).className="montre"; document.getElementById(court).className="montre"; document.getElementById(longe).className="cache"; Fonction limitant le nombre de caractères disponibles dans le champ de texte pour les commentaires (update.php) function transTxtArea(champs) champs correspond au nom de la balise textarea, fonction appelé à { chaque lettre tapée dans le textarea var retour=""; var txt= new Array(); var i=0; } txt=champs.split("\n"); on découpe la chaîne de caractère selon les retour à la ligne et chaque for(i ; i < txt.length ; i++) morceau est mis dans un cellule d'un tableau { retour+=txt[i]; on remplace les retour à la ligne pour des <br/> if(i < txt.length-1) retour+="<br/>"; } return retour; Meyer Michel & Peters Anthony 12 Les feuilles de style CSS (Cascading Style Sheets) Le principe des feuilles de style consiste à attribuer des caractéristiques de mise en forme à des groupes d'éléments. On définit par un nom une caractéristique de mise en forme, il suffit ensuite de l'appeler pour l'appliquer à un texte. Les feuilles de style permettent: • • • • • d'avoir une présentation homogène sur tout un site. de pouvoir changer l'aspect du site entier en modifiant quelques lignes. une plus grande lisibilité du HTML. le positionnement rigoureux des éléments. des chargements de page plus rapides. Exemples de styles de blocs utilisés : Le contenu d'un bloc est le code compris dans une balise <div></div>, son attribut id ou class (un « id » doit normalement être unique dans l'ensemble de la page contrairement au « class » qui peuvent s'appliquer à plusieurs balises) défini quel style devra lui être appliquer. définition des propriétés du bloc défini par un id log: #log { background-color: #ffffcc; couleur de fond border: #9D0000 thin dotted; affichage une bordure pointillée fine margin-top: 8em; taille de ma marge du haut (ici pour laisser la place d'afficher le bloc « titre » plus haut) position: absolute; le positionnement est faite par rapport à la page entière width: 7em; taille du bloc color: #9D0000; couleur par défaut du texte text-align:right; alignement par défaut du texte z-index:1; hiérarchie du bloc ( plus l'index est grand, plus le bloc est en avant par rapport aux autres blocs) overflow: auto; si les éléments dépassent la taille du bloc, un barre de défilement est affiché automatiquement } définition globale des styles de boutons et des champs de texte: (ici ces propriétés sont communes à toutes les pages) input[type='text'] propriétés des champs de texte { size: 24; nombre de caractères border: #9D0000 thin dotted; bordure pointillée fine } input[type='button'] propriétés des boutons { border: #9D0000 thin dotted; bordure pointillée fine color: red; couleur du texte background: white; couleur du fond cursor:pointer; affichage du curseur « zone cliquable » } Meyer Michel & Peters Anthony 13 Des propriétés peuvent être ajouté à un élément d'un bloc ou à un bloc entier pour détecter un évènement comme le passage de la souris sur cette élément. affichage des images qu'en il n'y a pas d'évènement #image img { border:black thin solid; petite bordure noir autour des images cursor:pointer;curseur « zone cliquable » margin:0.5em; marge toute autour de 0.5em width: 100px; taille de l'image de 100 pixels } Changement apporté aux propriétés précédentes lorsque le curseur de la souris est sur une image #image img:hover { border: black thick solid; grosse bordure noir width: 110px; taille augmentée de 10 pixels } Classe CSS activé par le bilai d'une fonction javascript appelé lorsque l'on clique sur l'image #image img.selectionner { border: red thick solid; grosse bordure rouge width: 110px; taille augmentée de 10 pixels } Meyer Michel & Peters Anthony 14 Positionnement des blocs: la bandeau « titre » #titre { background-color: #ffffcc; indique la couleur de fond du bloc border: #9D0000 thin dotted; indique le style des bordure position: absolute; positionnement par rapport à la page width: 49.75em; longueur du bandeau height: 7.5em; hauteur du bandeau z-index:1; positionnement par rapport aux autres blocs (audessus ou au-dessous) } le menu « log » #log { background-color: #ffffcc; border: #9D0000 thin dotted; margin-top: 8em; position: absolute; width: 7em; z-index:1; si le contenu dépassement la taille du bloc alors on affiche une barre de scroll overflow: auto; } c'est la marge qui défini la position du la page « centre », ainsi que « update » bloc par rapport à la page (en positionnement absolu). Le calcul peut #centre, #update { position: absolute; position par rapport à la être fait en fonction de la taille des page blocs adjacents. margin-top: 8em; marge du haut Le positionnement en valeurs absolus margin-left: 7.5em; marge gauche est très important pour que la page max-width: 42.25em; taille maximum du bloc soit compatible sous les navigateurs z-index:0; placement par rapport aux autres du type Netscape ou Internet Explorer. blocs } Meyer Michel & Peters Anthony 15 Les fichiers XML, XSL et le principe de fonctionnement du parser ● XML (eXtensible Markup Language) Il s'agit d'un langage permettant de mettre en forme des documents grâce à des balises comme le langage HTML mais contrairement à HTML, qui est à considérer comme un langage défini et figé (avec un nombre de balises limité), XML peut être considéré comme un métalangage permettant de définir d'autres langages, c'est-à-dire définir de nouvelles balises. La force de XML réside dans sa capacité à pouvoir décrire n'importe quel domaine de données grâce à son extensibilité. Il va permettre de structurer, poser le vocabulaire et la syntaxe des données qu'il va contenir. Les balises XML décrivent le contenu plutôt que la présentation (contrairement à HTML). Ainsi, XML permet de séparer le contenu de la présentation .. ce qui permet par exemple d'afficher un même document sur des applications ou des périphériques différents sans pour autant nécessiter de créer autant de versions du document que l'on nécessite de représentations ! Un document XML doit suivre scrupuleusement les conventions de notation XML et peut éventuellement faire référence à une DTD (Document Type Definition) décrivant l'imbrication des éléments possibles. Un document suivant les règles de XML est appelé document bien formé. Un document XML possédant une DTD et étant conforme à celle-ci est appelé document valide. Exemple d'un XML valide et de son DTD : Document XML(ex.xml) Document DTD (ex.dtd) Définition du document en tant que fichier XML <?xml version="1.0" encoding="ISO-8859-1"?> Lien avec le fichier DTD et définition de « biblio » en tant que balise racine <!DOCTYPE biblio SYSTEM "ex.dtd"> <biblio> <ref type="livre" dispo="oui"> <titre>Stop quelle violence</titre> <sujets> <sujet>exclusion</sujet> <sujet>politique sécuritaire</sujet> </sujets> <auteurs> <auteur> <nom>Tévanian</nom> <prenom>Pierre</prenom> </auteur> </auteurs> </ref> </biblio> Il doit y avoir au moins une balise « ref » dans la balise « biblio » (défini par le + après « ref ») <!ELEMENT biblio (ref+) > La balise « ref » doit contenir une seul fois les baises entre parenthèses (rien n'est précisé) <!ELEMENT ref ( titre, sujets, auteurs ) > Défini les noms des attributs et leurs valeurs possibles <!ATTLIST ref type (CD|DVD|livre)#REQUIRED > <!ATTLIST ref dispo (oui|non) #REQUIRED > <!ELEMENT titre ( #PCDATA ) > <!ELEMENT sujets ( sujet+ ) > <!ELEMENT sujet ( #PCDATA ) > <!ELEMENT auteurs ( auteur+ ) > « prenom » n'est pas une balise obligatoire <!ELEMENT auteur ( nom, prenom? ) > <!ELEMENT nom ( #PCDATA ) > <!ELEMENT prenom ( #PCDATA ) > Meyer Michel & Peters Anthony 16 ● XSL (eXtensible Stylesheet Language ) XML est un langage de structuration des données, et non de représentation des données. Ainsi XSL est un langage recommandé par le W3C pour effectuer la représentation des données de documents XML. XSL est lui-même défini avec le formalisme XML, cela signifie qu'une feuille de style XSL est un document XML bien formé. XSL permet aussi de retraiter un document XML afin d'en modifier totalement sa structure, ce qui permet à partir d'un document XML d'être capable de générer d'autres types de documents (PostScript, HTML, Tex, RTF, ...) ou bien un fichier XML de structure différente. Ainsi la structuration des données (définie par XML) et leur représentation (définie par un langage tel que XSL) sont séparées. Cela signifie qu'il est possible à partir d'un document XML de créer des documents utilisant différentes représentations (HTML pour créer des pages web, WML pour les mobiles WAP, ...). XSL possède deux composantes : 1. Le langage de transformation des données :(XSLT, eXtensible Stylesheet Transformation) permettant de transformer la structure des éléments XML. 2. le langage de formation des données (XSL/FO), c'est-à-dire un langage permettant de définir la mise en page (affichage de texte ou de graphiques) de ce qui a été créé par XSLT. Je n'est pas utilisé le XSL/FO car le reste du site est mis en page par le bilai du CSS. J'ai donc préféré réutiliser la même technique de mise en page des données sur l'ensemble du site. Principe de fonctionnement du XSLT: Le processeur XSLT (composant logiciel chargé de la transformation) crée un structure logique arborescente à partir du document XML et lui fait subir des transformations selon les template rules contenues dans la feuille XSL pour produire un arbre résultat représentant, par exemple, la structure d'un document HTML. Chaque template rule définit des traitements à effectuer sur un élément de l'arbre source. L'arbre source peut être entièrement remodelé et filtré ainsi qu'ajouter du contenu à l'arbre résultat, si bien que l'arbre résultat peut être radicalement différent de l'arbre source. Meyer Michel & Peters Anthony 17 Exemple d'un fichier XSL appliqué au fichier XML vu précédament : Fichier XSL (ex.xsl) définition du document en tant que fichier XML <?xml version="1.0" encoding="ISO-8859-1"?> instruction de traitement par la feuille de style (définition du type comme xsl par rapport à la norme W3C) <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> paramétrage de la sortie après l'avoir parsé à un fichier XML (type de code ASCII, HTML, indentation,...) <xsl:output method="html" encoding="ISO-8859-1" doctype-public="-//W3C//DTD HTML 4.01//EN" doctype-system="http://www.w3.org/TR/html4/strict.dtd" indent="yes" /> cette élément permet d'associé une sortie à l'entrée, « match » nous place à la racine du XML <xsl:template match="/"> <table border="1"> <tr> <td><h4>Titre</h4></td> <td><h4>Sujets</h4></td> </tr> cette élément applique les templates suivant à cette endroit <xsl:apply-templates/> </table> </xsl:template> nous sommes maintenant placé au noeud « biblio » <xsl:template match="biblio"> boucle passant par chaque noeud « ref » <xsl:for-each select="ref"> <tr> <td><h4> <xsl:value-of select="titre" /> affichage de l'élément contenu dans la balise titre </h4> </td><td> boucle passant par chaque noeud « sujets/sujet » (placé au niveau du noeud ref à cause de la dernière boucle, le chemin à précisé commence à ce dernier) <xsl:for-each select="sujets/sujet"> <h4> le chemin vers l'élément à affiché est le noeud courant c'est a dire « . » <xsl:value-of select="." /> </h4> </xsl:for-each> </td> </tr> </xsl:for-each> </xsl:template> </xsl:stylesheet> Résultat parsé en HTML <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <table border="1"> <tr> <td><h4>Titre</h4></td> <td><h4>Sujets</h4></td> </tr> <tr> <td><h4>Stop quelle violence</h4></td> <td><h4>exclusion</h4> <h4>politique sécuritaire</h4></td> </tr> </table> Meyer Michel & Peters Anthony 18 ● Parser en PHP (Sablotron) Comme il à déjà été dit, le parser à pour but de combiner un fichier XML, contenant seulement des données, avec un fichier XSL fournissant le squelette qui permettra à Sablotron de générer un fichier qui peut avoir plusieurs formats de sortie (PDF, texte, HTML, XML, ...). Le parsage est effectué au niveau du serveur, l'opération est donc transparent pour le Client (à par le temps de chargement) Sablotron est un logiciel libre écrit par Gingerall. C'est le premier processeur XSLT à avoir été intégré à PHP en tant qu'extension. Néanmoins il n'est pas toujours activé sur les serveurs apache ou, selon la version de PHP, il peut être nécessaire de l'installer. Exemple d'un traitement faisable par un Parser: Cette exemple est issu de l'utilisation qui est faite de Sablotron pour l'affichage de la bibliothèque, seul le parcourt en rouge nécessite l'utilisation du parser. Exemple de code permettant de parser les exemples de XML et XSL vu auparavant: Fichier Parser en PHP (ex.php) <?php //lecture des fichiers XML et XSL et affectation de leurs contenus à deux variables $xml et $xsl $file=fopen("ex.xml","r"); $xml_file=fread($file,1000); fclose($file); $file=fopen("ex.xsl","r"); $xsl=fread($file,1000); fclose($file); $xh = xslt_create(); //création du processus nécessaire pour parsé les fichiers et retour de sa valeur $arguments = array( '/_xml' => $xml_file, '/_xsl' => $xsl ); //création d'un tableau contenant le XML et le XSL $result = xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments); //les deux fichiers sont parsé ici xslt_free($xh); //libération de la mémoire occupé par le processus print "$result"; //affichage du résultat après avoir parsé les fichiers ?> Meyer Michel & Peters Anthony 19 Les fonctionnalités du site Intégration des différents éléments dans une même page index.php: Il sert de support pour les différentes pages du site. Une série de tests est réalisée, afin de charger ou non certaines pages suivant les choix de l'utilisateur. if(isset($_POST['connect'])) { include('connexion.php'); } La variable «connect» est celle envoyé lorsque le visiteur tente de s'identifier, un appele donc le fichier qui vérifie les données pour la connexion. Un grand nombre de tests sont effectués de cette façon afin de prendre en compte toutes les actions possibles du visiteur. ● Gestion des données par l'utilisateur Chacun peut ajouter des références, modifier leurs informations, leur associer des images, les rendre disponible ou non, ou bien les supprimer (les siennes uniquement). user_refs.php: Il s'agit de la page qui affiche les références dont le membre est propriétaire. Ce fichier utilise les mêmes fonction que pour effectuer une recherche en utilisant le bandeau en haut de page. On lui a ajouté une fonctionnalité cependant, la récupération des ID de chaque référence. Cela permet, lorsque l'utilisateur clique sur un des boutons asocié à chaque référence, d'accéder directement à la base pour d'éventuelles modifications. Bouton de gestion des emprunts Boutons de suppression et modification Lorsque l'utilisateur clique sur le bouton vert, la poubelle ou encore le stylo, les pages qui permettent de gérer les emprunts, de supprimer ou de modifier les informations sont appelées, et recoivent le numéro de la référence, qui est indispensable pour indiquer où opérer les modifications souhaitées dans la base de données. Cela se fait en utilisant une fonction javascript. Meyer Michel & Peters Anthony 20 retrait.php: Retrait.php et traite_update.php sont à peu près semblables, ils affichent les informations relatives à la référence sélectionnée, puis les suppriment une fois la confirmation donnée. Pour cela nous n'avons eu besoin que d'un simple bouton comme moyen d'intercation avec l'utilisateur. update.php - traite_update.php: Le même fichier qui est appelé pour créer une référence est aussi celui qui permet de la modifier. Pour cela un écrasement est réalisé au lieu d'une insertion dans la base de données, Afin de distinguer les deux cas d'utilisation, une variable a été crée. Cette variable est de type GET (permet de passer un lien en paramètre) , et est établie lorsque l'utilisateur clique sur le bouton correspondant, accessible uniquement aux membres. Les modifications de la base de données sont effectuées par traite_update.php, mais les modifications se font par le biais de update.php. Or la variable de type GET n'existe plus au moment où est appelée la seconde page. Nous avons eu recours une fois encore aux sessions. update.php if (isset($_GET['modif'])) traite_update.php if(isset($_POST['valider_ref'])&&!isset //le bouton a été cliqué { ($_SESSION['modif'])) //insertion dans la base de données $_SESSION['modif']=$_POST['id_ref']; //on «sauvegarde» en quelque sorte la variable } //contenant l'ID de la référece, qui sera détruite //sinon avec la variable POST au procahin appel if(isset($_POST['valider_ref'])&&!isset //de page } ($_SESSION['modif'])) //mise à jour de la base de données } //le cas de figure change selon l'existence de la variable session Meyer Michel & Peters Anthony 21 Gestion des comptes utilisateurs Celle-ci est effectuée par un module de plusieurs fichiers log.php: C'est un simple formulaire qui receuille les identifiants de l'utilisateur et les envoie au fichier connexion.php, qui gère l'authentification. Javascript est utilisé pour vérifier le remplissage des champs de texte. Ce fichier permet d'appeler le formulaire de création de comptes pour les nouveaux visiteurs. - logged.php: C'est un menu vers les différentes possibilités qui s'offrent à l'utilisateur. Il ne comporte que des liens. connexion.php: Ce fichier a pour fonction de vérifier les identifiants du membre qui tente de se connecter. Contenu du fichier include('include_php\sql.inc.php'); if(isset($_POST['connect'])) { $courriel=$_POST['adresse']; include('include_php\suppr_compte_inactif.php'); $pass=$_POST['pass']; //récupere les donnnes entrées par l'utilisateur $membre=sendReq("SELECT ID, COURRIEL "."FROM TMEMBRES WHERE "."COURRIEL='$courriel'"); //récupère l'identité et le courriel corresponsants dans la base de données //(s'ils existent) if($membre[0]!="") $pass_sql=sendReq("SELECT PASS, PSEUDO "."FROM TPASS A, TMEMBRES B "."WHERE A.ID_MEMBRE='$membre[0]' AND B.ID=A.ID_MEMBRE"); //réinjecte dans la requête l'identité du membre pour obtenir son mot de passe } if ($courriel==$membre[1] && $pass==$pass_sql[0]) //compare la valeur tapée par l'utilisateur avec celle enregistrée dans la base { $_SESSION['membre']=$pass_sql[1]; $_SESSION['id']=$membre[0]; $_SESSION['pass']=$pass_sql[0]; //On enregistre les infos sur le membre include('include_php\activ_compte.php'); } S'il y a correspondance entre les valeurs de la base de données et celles saisies, alors le test est vérifié et on affecte les variables de session, pour conserver l'ID du membre dans la base de données, et ses identifiants. Meyer Michel & Peters Anthony 22 nouvcompte.php: C'est un formulaire, plus élaboré que celui de connexion, qui permet de recceuillir les informations nécéssaires sur le membre. Le formulaire est vérifié par javascript afin d'éviter que l'utilisateur ne rentre n'importe quelles informations, que même si celles-ci sont éronnées, elles restent conformes au format défini. Une fois le formulaire correctement rempli, les données sont envoyées au fichier traite_nouvcompte, qui les inscrit dans la base de données. traite_nouvcompte.php: Remplit la table tmembres avec les informations de l'utilisateur. Les données sont affichées en premier lieu, afin de s'assurer de leur justesse. Ce n'est qu'une fois la confirmation donnée que le nouveau tuple est créé. if(isset($_POST['nouvcompte'])) //si la page est appelée par nouvcompte.php { $_SESSION['pseudo']=$pseudo=$_POST['pseudo']; ... } else //si elle est appelée par elle même { $pseudo=$_SESSION['pseudo']; ... } Un premier affichage permet de vérifier l'exactitude des données saisies dans le formulaire. La page contient un formulaire simple constitué uniquement d'un bouton <form name="confirm" action="index.php" method="post"> <div align="center"> <button name="valider_compte" value="ok" type="submit">Valider</button> </div> </form> Si le bouton «Valider» est cliqué, alors nous nous trouvons dans le deuxième cas de figure ci-dessus: la page est appelée par elle-même. Il faut alors récupèrer les valeurs des variables de session afin de les intégrer dans les requêtes SQL. if(isset($_POST['valider_compte'])) //deuxième appel de la page par le bouton "Valider" { $temps=time(); $code_long=md5(rand(1,10000)); $code=substr($code_long,0,6); Meyer Michel & Peters Anthony 23 La fonction time() retourne le nombre de secondes écoulées depuis le début de la période UNIX, fixée au 1er janvier 1970. La fonction rand (1,10000) génère un nombre aléatoire compris entre 1 et 10000. La fonction md5(chaîne) retourne le résultat de la chaîne passée en paramètre soumise à l'algorithme md5. Dans notre cas la chaîne est une valeur numérique. Le résultat est une nouvelle chaîne de 32 caractères héxadécimaux. Substr($code_long,0,6) retourne les éléments de la chaîne à partir de l'indice 0, jusqu'à l'indice 6. Le dernier argument est la longueur de la chaîne à partir de l'indice précisé (ici 0). Ces trois fonctions combinées permettent d'obtenir un mot de passe aléatoire d'une longueur raisonnable (sachant que l'utilisateur devra le taper pour se connecter à son compte) et contenant à la fois des nombres et des lettres. Une fois le mot de passe créé, il est envoyé par message à l'utilisateur, ainsi on s'assure de la validité de son adresse électronique. Si l'utilisateur ne reçoit pas de message, il ne pourra pas activer son compte, qui sera détruit après un certain temps. Pour l'envoi de messages, on utilise la fonction suivante: mail($courriel, $objet, $contenu, $entete) Les argument sont l'adresse du destinataire, l'objet du message, son contenu et l'en-tête, auquel nous n'avons généralement pas accès lors d'un envoi de mail «manuel». $entete = "X-Sender: <www.site.tld>\n"; $entete .= "X-Mailer: PHP\n"; //Pour éviter les filtres anti-spam $objet = "Demande de création de compte sur www.attac..."; $contenu = "Voici votre code d'identification : $code\nEn espérant vous retrouver très bientôt sur notre site"; Le mailer identifie l'éxpéditeur du mail comme un serveur php. L'autre attribut indique la provenance du message. Chaque élément de l'en-tête doit être précédé d'un X, ou le message sera bloqué par certaines messageries, notament hotmail et yahoo. Ceux-ci arriveront à destination, mais seront mis en quarantaine et supprimés au bout de quelques jours. Or il faut que le message arrive où l'utilisateur ne peut pas ne pas le voir. La variable contenant le code est insérée dans le message, l'utilisateur verra apparaître son contenu. Meyer Michel & Peters Anthony 24 Envoi de message et remplissage de la table tmembres if(mail($courriel, $objet, $contenu, $entete)) { $membre=sendReq("SELECT ID FROM TMEMBRES WHERE NOM=\"".$nom."\" AND PRENOM=\"".$prenom."\" AND ETAT=2"); ... sendReq("UPDATE TMEMBRES SET PSEUDO='".$pseudo."', PASS='".$pass."', ETAT=0,TEL='".$tel."',ADRESSE='".$adresse."',COURRIEL='".$courriel."', ID_GROUPE=".$comite.",QUALITE='".$qualite."',MOMENT_CREATION=".$temps." WHERE ID=".$membre[0],false); } ... sendReq("INSERT INTO TMEMBRE (PSEUDO,PASS,NOM,PRENOM,TEL,ADRESSE,COURRIEL, ID_GROUPE, QUALITE,MOMENT_CREATION) VALUES(\"".$pseudo."\",\"".$pass."\" \"".$nom."\",\"".$prenom."\",\"".$tel."\",\"".$adresse."\", \"".$courriel."\",\"".$comite."\",\"".$qualite."\",\"".$temps."\")",false); ... Une fois le courrier envoyé, les informations sur le nouveau membre sont incrites dans la base de données. Le code ci dessus illustre deux cas de figure possible: - Des données concernant la personne en question sont déjà présentes dans la base, mais celui-ci ne dispose pas encore de compte. Cela est possible car il n'y a pas de distinction entre les propriétaires, les emprunteurs et les membres qui ne sont ni l'un ni l'autre. Ils sont tous enregistrés dans la table des membres. Seul un indice les différencie: l'état. Or un emprunteur qui n'a pas de compte est à l'état 2. Il n'a ya qu'à écraser les données lorsqu'il y correspondance entre le formulaire et la base et que l'état est à 2. La requête SQL UPDATE assure cette fonction. - Les informations ne correspondent pas avec celles déjà enregistrées, un nouveau membre est créé grâce à la requête SQL INSERT. Meyer Michel & Peters Anthony 25 Suppr_compte_inactif.php: Son utilité est de détruire les comptes inactifs, comme son nom l'indique. Cela peut être réalisé très simplement de la façon suivante. contenu du fichier $heure=time(); $heure-=86400; //récupère l'heure courante а laquelle on enlève une journée $membre=sendReq("SELECT ID FROM TMEMBRES WHERE ETAT=0 AND MOMENT_CREATION<".$heure); $requete="DELETE FROM TMEMBRES WHERE ETAT=0 AND MOMENT_CREATION<".$heure; mysql_query($requete); //détruit les données utilisateur qui n'ont pas été validées au bout de 24 h Un état à 0 correspond à un compte inactif. On compare l'heure courante avec celle enregistrée, si la requête est exécutée plus de 24 heures après création du tuple, celui-ci est effacé. activ_compte.php: Ce fichier est utilisé pour créer le compte, non plus dans la base de données biblio, mais dans la table des privilèges mysql. Contenu du fichier $requete="GRANT SELECT, UPDATE, INSERT, DELETE ON biblio.* TO ".$membre[0]. "@localhost IDENTIFIED BY '".$membre[1]."'"; //crée le compte, dont l'identitiant est le pseudo de l'utilisateur mysql_query($requete); $requete="FLUSH PRIVILEGES"; mysql_query($requete); //Recharge les privilèges } Les deux requêtes SQL ci-dessus doivent être associées si l'on ne veut pas à avoir à redémarrer le serveur pour que les droits prennent effet. Une fois le site en ligne, le serveur risque de n'être réinitiallisé que rarement. Meyer Michel & Peters Anthony 26 Gestion des images pour les références La gestion des images se fait par l'intermédiaire de la page d'ajout d'une référence. Les images proviennent de deux sources: 1. le fichier est cherché par le bilai du site amazon.fr selon les informations entrées dans le formulaire. 2. Le fichier est sélectionné par le client grâce à une boîte de dialogue. Le traitement est complètement différent selon la méthode utilisé. 1- les images téléchargées sur amazon.fr: Le site de amazon.fr propose gratuitement le ACS (Amazon e-Commerce Service), si l'on se registre chez eux, donnant la possibilité d'effectuer des recherches sur leurs bases de données en utilisant une URL, comprenant les paramètres de recherche. Ils renvoient la réponse sous forme d'un document XML. Voici un exemple de requête faisable grâce à ce service: http://webservices.amazon.fr/onca/xml?Service=AWSECommerceService&Subscription Id=1ZZJ6642M3852C8150G2&Operation=ItemSearch&ItemSearch.Shared.SearchInde x=Books&ItemSearch.Shared.ResponseGroup=Images&ItemSearch.1.Keywords=Attac &ItemSearch.1.Title=fmi Pour faire cette requête un code d'identification (SubscriptionId) est nécessaire, ce qui oblige à s'inscrire sur le site d'amazon. Plusieurs opérations sont alors faisable, dont la recherche d'éléments (Operation). cette requête cherche une image (ResponseGroup) d'un livre (SearchIndex) contenant le mot Attac (Keywords) et comptant dans son titre le mot fmi (Title). Une page XML est alors chargé et un ensemble d'informations sont disponibles tels que: – la requête effectuée – le nombre de réponses trouvées – pour chaque réponse, l'url des images en version petite, moyenne et grande avec leurs dimensions. Une fonction PHP effectue la construction de l'adresse par le bilai des paramètres qu'il lui son affectés, puis elle enregistre en mémoire la page XML de réponse et la parse avec un fichier XSL (photo.xsl): amazonImageSearch(mot clé,titre,type de média,nb de réponses,fichier XML,fichier XSL); mot clé: cherche cette chaîne de caractère dans tous les textes des références/ titre: cherche dans les titres si ils contiennent cette chaîne type de média: CD, DVD, VHS, Livre ... fichier XML: fichier ou sera inscrit la réponse à la requête fichier XSL: description de la forme de l'HTML après le traitement du fichier XML Meyer Michel & Peters Anthony 27 Exemple du traitement fait sur le formulaire d'ajout de référence pour la sélection des images: Extrait du fichier photo.xsl affichant le résultat de la requête à amazon <xsl:template match="ItemSearchResponse"> on se place au niveau du noeud « ItemSearchResponse » <xsl:for-each select="Items"> <xsl:for-each select="Item"> pour chaque réponse <xsl:variable name="photo"><xsl:value-of select="MediumImage/URL" /> </xsl:variable> affectation à la variable « photo » l'URL de l'image moyenne <xsl:if test="$photo != ''"> si c'est une URL <img> on créé une image <xsl:attribute name="src"><xsl:value-of select="$photo" /> </xsl:attribute> <xsl:attribute name="id"><xsl:number/></xsl:attribute> <xsl:attribute name="onClick">select_img('<xsl:number/>'); attributs: </xsl:attribute> - id égale au numéro correspondant à sa place dans la liste d'éléments trouvés - OnClick déclenchant une fonction javascript mémorisant l'URL de limage cliquée et modifiant ses paramètres CSS, elle à comme paramètre son id se qui permet de la sélectionner </img> </xsl:if> </xsl:for-each> </xsl:for-each> </xsl:template> </xsl:stylesheet> Extrait du fichier update.php où est utilisé la fonction PHP <img src="http://images.amazon.com/images/P/2842056574.08._SCMZZZZZZZ_.jpg" id="1" onClick="select_img('1');"> <img src="http://images.amazon.com/images/P/288053027X.08._SCMZZZZZZZ_.jpg" id="2" onClick="select_img('2');"> Fonction javascript permettant la sélection d'une image et la récupération de son url var mem_img=0; variable globale mémorisant l'id de la dernière image sélectionnée var url_img=""; URL de l'image sélectionnée function select_img(id_img) { désélectionne la dernière valeur sélectionnée if(mem_img) document.getElementById(mem_img).className=""; document.getElementById(id_img).className="selectionner"; sélection la nouvelle url_img=document.getElementById(id_img).src; url_img égal à l'url de l'image sélectionnée mem_img=id_img; on garde en mémoire la valeur de l'image sélectionnée } Après que le fichier est été sélectionné, son url est transmit grâce à une variable HTML hidden à la page qui traite le formulaire et ajoute tout les éléments à la base de données (traite_update.php). C'est la que le fichier image est copié sur le serveur. Meyer Michel & Peters Anthony 28 Le téléchargement du fichier depuis son URL vers le serveur est fait grâce à une fonction PHP appelé dans le fichier traite_update.php. Elle ouvre l'URL dans une variable et la copie dans un nouveau fichier créé sur le serveur à l'emplacement voulut. upload_url(url de l'image,nouveau nom,chemin sur le serveur); 2- les fichiers client téléchargés par le serveur: pour cela on utilise une balise <input type='file' name='image'> dans le formulaire, ce qui permet au client de sélectionner un fichier sur son disque. La valeur de cette balise n'est pas accessible en écriture par du code javascript pour des raisons de sécurisées. Lorsque l'utilisateur choisi un fichier, il affecte une variable qui peut être récupéré en PHP, $_FILES[nomdebalisefile], mais cette image est pour l'instant stocké dans la mémoire temporaire du serveur, il faut ensuite l'enregistrer dans le répertoire voulu sur le serveur. Traitement de l'image client par le fichier traite_update.php if (is_uploaded_file($_FILES["image"]["tmp_name"])) si le fichier reçu est en mémoire temporaire { $_SESSION['img_client']=true; on signal que l'image de la référence vient du client $repertoireDest = "images/refs/"; on détermine le répertoire de destination du fichier $nomDest = $nom_image; on lui affecte son nouveau nom if (!@rename($_FILES["image"]["tmp_name"],$repertoireDest.$nomDest) déplacement du fichier echo "Le déplacement du fichier temporaire a échoué"."<br/> vérifiez l'existence du répertoire ".$repertoireDest."<br/> ou si le fichier n'existe pas déjà" ; } else sinon le fichier viens d'amazon ou il n'y en a pas ($url_img='') { if(isset($_POST['nouvref'])) $_SESSION['url_img']=$url_img=$_POST['url_img']; else $url_img=$_SESSION['url_img']; } Meyer Michel & Peters Anthony 29 Utilisation du parser XML+XSL dans l'affichage des références (update.php) Cette page affiche les références selon les données envoyées par le formulaire contenu dans le fichier titre.php. Ces paramètres sont défini par l'utilisateur pour trouver une référence. Il réduit ainsi le champ des données à explorer en choisissant un auteur, un sujet, un type de document ou un comité spécifique. Ces données sont récupéré en PHP sur la page update.php par le bilai de variables $_POST. Elles sont directement réintroduites dans un fonction chargé de générer un fichier XML regroupant toutes les informations sur références recherchées. Ces informations sont extraites de la base de données par un ensemble de requêtes SQL puis les résultats sont mis en formes et inscrits dans le fichier XML. La page centre.php parse ensuite le fichier XML généré et le fichier XSL(ref.xsl). Il transforme les donnée du XML en un tableau HTML contenant deux cellules pour chaque référence, une contenant les informations courantes et l'autre les informations détaillées mais qu'une seul est affichée à la fois, il faut cliquer dessus pour afficher l'autre cellule et cacher l'ancien. Cellule contenant les informations courantes Cellule contenant les informations détaillées Le changement d'une cellule à l'autre se fait grâce à une fonction javascript, utilisée tout au long du projet, qui permet de changer les attributs HTML des balises <div> utilisées par le CSS et donc d'afficher ou pas une partie du code HTML Meyer Michel & Peters Anthony 30 ● Ajout de références (update.php et traite_update.php) La page update.php est un formulaire permettant d'ajouter des références à la base de données. Un explication à déjà été faite sur l'utilisation du javascript pour le contrôle des informations qui y sont introduites et pour l'affichage dynamique de partie de menu, expliqué aussi dans la partie sur le CSS. C'est aussi sur cette page que l'on peut choisir une image pour la référence, soit sur son disque dur, soit en la cherchant automatiquement chez amazon. Les informations réunis sur cette page sont transmissent à traite_update.php par le bilai de balises <input type='hidden'> dans des POST. la page La page traite_update.php reçoit les fichiers et les stocks dans des variables SESSION pour pouvoir les garder tout au long de l'exécution de la page. Dans un premier temps la page affiche un récapitulation des données entrées dans le formulaire. Lorsque l'utilisateur clique sur Valider, la page est rechargé. La page exécute alors les requêtes SQL nécessaires à l'ajoute de la référence à la base de donnée. C'est aussi à ce moment que le fichier image est copié dans le répertoire qui lui est destiné. La page indique finalement comme c'est passé l'opération Meyer Michel & Peters Anthony 31 ➔ Détail d'une des opérations en PHP ajoutant des données à une table: remplie la table 'tauteurs' for($i=0;$i<sizeof($nom_a);$i++) pour chaque auteur { vérification de l'existence de l'auteur dans la base de donnée $ligne = sendReq("SELECT ID FROM TAUTEURS WHERE NOM=\"".$nom_a[$i]."\" AND PRENOM=\"".$prenom_a[$i]."\"");sélectionne les auteurs pour vérifier si il existe if($ligne[0]=="") pas déjà { ajout de l'auteur dans la base de donnée sendReq("INSERT INTO TAUTEURS(NOM,PRENOM) VALUES (\"".$nom_a[$i]."\",\"".$prenom_a[$i]."\")",false); recherche de l'identifiant du nouvel auteur $ligne2 = sendReq("SELECT ID FROM TAUTEURS WHERE NOM=\"".$nom_a[$i]. "\" AND PRENOM=\"".$prenom_a[$i]."\""); $id_auteur[$i]=$ligne2[0];stockage de l'identifiant } else $id_auteur[$i]=$ligne[0];remplissage d'un champ vide } ➔ Fonction téléchargeant les images provenant d'un URL dans un répertoire du serveur <?php function upload_url($fichier_url,$nom_dest,$rep_dest){ $fichier_local=$rep_dest.$nom_dest; on construit l'adresse de la nouvelle image $url=@fopen($fichier_url,"rb"); on affecte un variable au contenu ciblé par l'URL if($url!=0) si l'image est téléchargée en mémoire { $local=fopen($fichier_local, "wb"); ouverture de fichier destination while(!feof($url)) copie d'une variable à l'autre jusqu'au bout { $paquet=fread($url,65536); fwrite($local,$paquet,65536); } fclose($local); libération de la mémoire fclose($url); } } ➔ Création de code javascript en PHP <?php .... .... print("<script language=\"JavaScript\">\n"); en faisant afficher dans le document HTML une balise script on peut créer du code javascript qui sera exécuté a la réception par le client, cela permet de garder des valeurs de variable après un post print(" window.document.princ.selAuteurs.length=0; window.document.princ.selSujet.length=0; window.document.princ.reset();\n"); } print("</script>\n"); ?> Meyer Michel & Peters Anthony 32 Conclusion Grâce à ce projet, nous avons pu affronter concrètement les difficultés de gestion du php et d'une base de données. La logique et les techniques de ce langage apparaissent beaucoup plus clairement maintenant et nous pensons ne plus avoir de difficultés a réaliser la plupart des sites dynamiques. En effet nous avons du apprendre comment se transmettent les variables en php, le fonctionnement de la communication entre le javascript et le php, la façon d'accéder à une base de données et de l'exploiter. Nous avons aussi appris, au cours de recherches d'informations sur internet, les avantages à utiliser le XML, qui permet une séparation des données et de la présentation. La compréhension de cette technologie sera toujours utile car elle est utilisée dans beaucoup de domaines informatiques. Les connaissances acquises au cours de la réalisation de ce projet pourront être réexploitables si notre cursus se poursuit par la voie du développement web. Meyer Michel & Peters Anthony 33