<? FICHES TECHNIQUES ?>
base de données réalisée avec XML et php
[introduction] ajouter une nouvelle fiche - consulter la liste des fiches - rechercher les fiches d'un auteur [rapport]

Rapport


Choix d'un thème pour réaliser le projet Xml

Le choix du thème ne fut pas trop difficile car depuis quelques temps, j'essaie de conserver des fiches techniques sur les programmes ou langages informatiques que j'apprends. Actuellement, ces fiches sont écrites au format html et sont accessibles depuis ma homepage. J'ai pensé qu'Xml me permettrait de créer un dispositif plus souple et surtout qu'il laisserait la possibilité à d'autres de partager leurs trouvailles.


Exploration de diverses pistes...

La première étape fut de définir la structure du projet, ce qui fut loin d'être évident. Avec un collègue, nous avons exploré les différentes pistes qui s'offraient à nous, en passant par un simple fichier Xml que je remplirai au fur et à mesure, jusqu'à l'utilisation de Php pour effectuer du "parsing". Finalement, nous avons opté pour une démarche progressive, en commençant par réaliser un dispositif simple pour le complexifier par la suite. Pour cet exercice, j'ai beaucoup collaboré avec d'autres étudiants, ceci étant sûrement dû au fait que le langage Xml n'est pas encore très développé et qu'il est difficile de se débrouiller tout seul, car les informations ne sont pas faciles à trouver.


Construction du fichier "fichestechniques.dtd" (grammaire)

Pour construire ce fichier, j'ai commencé par définir une structure sur une simple feuille de papier "réelle"... Après plusieurs tentatives, j'ai décidé d'utiliser une structure simple, avec pas plus de deux niveaux pour simplifier de futurs développement (parsing php, etc.). J'ai commencé par coucher par écrit mes idées sur une feuille de papier "réelle" pour mieux visualiser la structure dans son ensemble. J'ai choisi d'opter pour une structure simple, correspondant à mon projet, en évitant de me lancer dans une structure trop compliquéee. C'est pour cette raison que j'ai décidé de ne faire que deux niveaux au maximum, en prévision d'une extension du projet vers le parsing php, par exemple. Je me suis appuyé sur la grammaire travaux.dtd, créée par Vivian pour noter de manière juste chaque élément. J'ai ainsi repris son introduction qu'elle met en commentaire, dans laquelle elle décrit ses coordonnées et le champ d'utilisation (but) du fichier dtd.
  • J'ai défini chaque élément et sous-élément, en spécifiant ainsi quelles sont les règles d'utilisation de mon dtd. La racine est au pluriel, qui peut contenir plusieurs enfants ( au singulier).
  • J'ai défini plus précisément certains éléments selon les règles d'éléments. J'ai ainsi décidé que l'élément "email" pouvait être optionnel (email?) et que l'élément "mots-clefs" pouvait apparaître au moins une fois (mots-clefs+).
  • J'ai repris certains éléments créés pour les transformer en attributs... Cela m'a permis de définir une grammaire plus logique. Le choix d'associer un attribut plutôt que de définir un élément ne fut pas aisé. Par exemple, si nous prenons l'élément système, j'ai choisi de créer un élément nommé "nom" et j'ai mis en attribut la "version". Mais j'aurais très bien pu mettre les deux en éléments...
    • J'ai utilisé un attribut de type littéral pour définir l'attribut "version" de l'élément "systeme". Cet attribut est #IMPLIED, car il est probable que les certaines personnes ne connaissent pas la version du logiciel sur lequel porte leur fiche technique...
    • J'ai utilisé un attribut de type énuméré pour définir l'attribut "statut" de l'élément "nom", enfant de l'élément "auteur". Les valeurs possibles dans la liste sont: étudiant et professeur, afin de savoir quel type de personne a écrit la fiche. Cet attribut prend la valeur "etudiant" pour defaut.
    • Je n'ai pas eu besoin de créer un attribut de type atomique.
  • J'ai enfin créé une "entité paramètre" qui s'utilise dans la dtd. Comme je ne l'utilise qu'une fois, cet artifice n'est pas très utile. Néanmoins, cela m'a permis de tester cette possibilité. Je l'ai utilisé pour définir la date de l'envoi d'une fiche.

Description des différentes étapes pour réaliser le dispositif
  • CONTENU
    J'ai commencé par créer un fichier "fichestechniques.sxml" en parallèle à la création du dtd pour "voir" en temps direct quelle allait être la forme finale de mon fichier sxml. Ceci m'a permis de corriger certaines erreurs dans le dtd.

  • FEUILLE DE STYLE - présentation générale
    J'ai ensuite créé une feuille de style "fichestechniques.xsl". Pour tester sa validité, j'ai ajouté deux entrées à la main dans le fichier sxml. Le résultat fut décevant et pas du tout ergonomique, car les fiches étaient présentées dans leur totalité, ce qui avec un nombre importants de données serait très fastidieux à lire. Nous verrons par la suite, quelle solution j'ai trouvé pour obtenir une présentation plus agréable. La particularité du fichier xsl est qu'il contient une indication permettant de classer les fiches par ordre alphabétique selon le nom du système. J'ai ajouté la commande: "xsl:sort select="systeme/nom".

  • FORMULAIRE
    J'ai ensuite décidé de créer un formulaire ("ajouter_fichestechniques.html") qui permet à l'utilisateur d'insérer une nouvelle fiche. Ce formulaire contient les paramètres suivants: action="ajouter_fichestechniques.php" method="post".
  • Le fichier "ajouter_fichestechniques.php" reçoit les données du formulaire et les traite pour les ajouter dans trois fichiers sxml. Le premier est celui dont nous venons de parler. L'utilité des deux autres sera décrite ci-dessous. En gros et très vulgarisé, le code php de ce fichier donne les instructions suivantes: va ouvrir les trois fichiers sxml, va à la fin de ces fichiers, efface la dernière ligne (la fermeture de la racine...), puis insère les données provenant du formulaire et enfin referme la racine.
  • Ce fichier php, contient en plus un code permettant d'ouvrir un fichier text ("id.txt"), de prendre avec la fonction php fgets() les caractères qu'il contient (en l'occurence un chiffre), puis d'incrémenter ce chiffre, et enfin de l'insérer à nouveau dans le fichier id.txt. Ainsi, nous pouvons facilement créer un numéro d'identification pour chaque fiche, sans que l'utilisateur ait à le rentrer, ce qui serait difficile, car comment saurait-il quel est le numéro de sa fiche?

  • FEUILLE DE STYLE - affichage des commentaires
    Pour améliorer la présentation générale des fiches techniques, j'ai opté pour une présentation de chaque fiche en ne mentionnant que "ID SYSTEME AUTEUR SUJET DATE". Ainsi, le fichier de présentation générale des fiches n'était pas trop chargé. Cependant, un autre problème se présentait, et pas le plus simple. Comment en effet, pouvoir consulter une fiche en particulier et la lire dans sa totalité?
  • J'ai donc décidé de créer une colonne supplémentaire, nommée COMMENTAIRE, contenant un mini-formulaire, avec un champ de type "hidden", nommé "form_id" et dont la valeur reprend en fait le numéro d'identification (id) unique pour chaque fiche (value="{@id}"). Ce formulaire contient les paramètres suivants: action="commentaires_fichestechniques.php" method="post"
  • Le fichier "commentaires_fichestechniques.php" se charge simplement d'aller écraser l'ancienne feuille de style "commentaires_fichestechniques.php" pour en générer une nouvelle prenant en compte la valeur de l'id envoyé par le formulaire... On comprend maintenant pourquoi il m'a fallut créer trois fichiers sxml. En fait, comme on ne peut associer qu'une feuille de style à un fichier sxml, et comme la feuille de style que j'utilise pour voir une fiche dans son entier est différente de celle initiale (fichestechniques.xsl), il me faut bien un deuxième fichier sxml ("commentaires_fichestechniques.sxml"), identique au premier mais faisant référence à la deuxième feuille de style.

  • MOTEUR DE RECHERCHE
    Le moteur de recherche est construit sur le même principe. Un fichier html, "rechercher_fichestechniques.html", permet d'entrer un nom d'auteur de fiches. Ce fichier envoie sur un fichier php ("rechercher_fichestechniques.php") ...
  • ... qui se charge également d'aller écraser la feuille de style "rechercher_fichestechniques.xsl" pour en générer une nouvelle... d'où la présence d'un troisième fichier sxml ("rechercher_fichestechniques.sxml").



Limites et critiques
  • La première critique est la faiblesse du formulaire pour plusieurs raisons. Tout d'abord, nous avons constaté avec quelques étudiants que si une peronne entrait un caractère spécial, comme par exemple "&", elle pouvait rendre inutilisable l'utilisation de mon outil. Nous avons donc cherché comment d'une part supprimer les "/" qui viennent dès qu'on entre un "'"... et parer le problème causé par les caractères spéciaux. Nous avons utilisé ceci dans le fichier "ajouter_fichestechniques.php": $total_id = htmlentities(StripSlashes($total_id));. D'autre part, il faut que l'utilisateur entre de manière correcte et homogène les données pour rendre plus agréable l'ergonomie de la présentation générale et faciliter la recherche. En effet, une recherche sur touvet ne donnera rien, alors que sur TOUVET, on tombera sur mes fiches. Enfin, pour rendre possible l'insertion de nouvelles fiches dans les fichiers sxml, il faut permettre leur accès en écriture. Cette manipulation rend le système relativement fragile et "piratable"...
  • D'un autre côté, si l'utilisateur entre malheureusement ou intentionnellement une fiche incomplète, il faut que j'aille reprendre les fichiers sxml, que je supprime l'entrée en question, puis que je reprenne le id.txt, que je remette le compteur d'id au bon niveau, etc. Cela prend du temps et n'est pas très pratique. La solution serait de pouvoir éditer chaque fiche, et que moi, j'ai les droits de détruire celles que je désire. Il aurait fallu pour cela utiliser le parsing php, je pense.
  • Mais la critique principale que j'apporterai à mon dispositif est que devoir créer trois fichiers sxml n'est pas très malin, ni pratique. Or, j'ai trouvé une autre manière de faire cela à cette adresse. J'ai passé des heures à tout modifier mais peine perdue, ça ne marchait pas. En gros, le principe était de créer un seul fichier sxml, et de lui indiquer une feuille de style, par exemple nommée "style.xsl". Ensuite, cette feuille de style était comme séparée en deux, avec l'argument "xsl:choose". Selon la valeur d'une variable, ce fichier xsl attribuait une feuille de style particulière au fichier sxml... J'ai contacté Vivian (merci Vivian) mais après deux heures de dur labeur, nous n'avons pas trouvé comment faire... si jamais, tous mes fichiers sont là: adresse. Si j'ai du temps, j'essaierai de me remettre à la tâche...
Ressources
  • J'ai utilisé pour réaliser ce dispositif toutes les ressources distribuées lors du cours (polycopiés), ainsi que certaines pages du serveur TECFA: Introduction à XML, XML+XSL avec Cocoon et Introduction technique à XSLT + XPath.
  • Je profite également pour remercier Roberto, Nicolas et René avec qui nous avons souvent échangés au cours de cette période. Notre collaboration nous a permis de surmonter moultes difficultés et présenter un dispositif qui tienne la route.


© D. TOUVET (2001.03.22/2001.03.22)