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