Persistance en Php

Transcription

Persistance en Php
Persistance en Php
Objectif : faire un site pour gérer des articles par catégorie. Chaque catégorie a un nom, chaque
catégorie est constitué d’articles (titre, auteur, texte), un article est dans une seule catégorie. Il y
aura 5 « pages » consultables (sans compter les fichiers php définissant des classes ou du code à
inclure):



une page pour afficher tous les articles de toutes les catégories
deux pages pour créer :
o une pour ajouter un article à une catégorie existante
o une pour créer une catégorie
deux pages pour administrer le site
o une (ou plusieurs) page pour ajouter/paramétrer des sources d’informations (avec le
type de persistance)
o une page pour choisir la quelle est affichée
Dans la réalisation, vous êtes libres de faire plus de pages (s’il y a des étapes) ou moins de pages (une
page pourra alors avoir plusieurs parties)
Note : les problèmes d’accès concurrents, de sécurité et de login sont laissés de côté.
La persistance des articles se fera : soit dans un des fichiers (texte) rangés dans des dossiers (1
dossier =une catégorie), soit dans un fichier xml (texte à balise), soit dans une base de données
(mysql).
Vous allez travailler par itération.
L’itération 1 est de faire une page pour afficher toutes les articles de toutes les catégories, faire la
lecture des données selon les 3 façons (juste ce qu’il faut).
L’itération 2 est d’ajouter une page pour « créer et affecter » un article dans une catégorie (sans qu’il
y ait de doublon) et faire l’écriture des données selon les 3 façons (juste ce qu’il faut).
L’itération 3 est d’ajouter la création d’une catégorie.
L’itération 4 sera de faire la page de configuration pour choisir / ajouter une source d’information
(sans s’occuper de télécharger les fichiers ou de configurer la base de données).
En réserve, pour ceux qui avanceraient vite, il y a 3 autres itérations supplémentaires possibles :
gérer les dates de création et de modification (voire d’accès), faire des recherches / tri et déployer les
sources (fichiers et/ou bd).
Note : Nous allons simplifier : un titre ne peut pas être partagé par deux articles de la même
catégorie.
Iteration 1 : Affichage
Le travail se découpe en deux parties :
-
la partie « front end », qui génère les pages pour manipuler les catégories / les articles. Le
« front end » est utilisé par les internautes.
la partie « back end », qui gère l’enregistrement des données et leur accès. Le « back end »
est masqué aux internautes.
Dans le cadre de ce tp, le « front end » utilise le « back end » : le « front end » demande des
informations au « back end ». L’utilisation est uniquement dans ce sens.
Pour faire la liaison entre les deux, nous allons définir une interface logicielle (ou API du « back end »,
c.f. vos cours de POO) pour définir un « back end ». Ainsi toutes les implémentations du « back end »
auront à implémenter cette interface et cela cachera la façon dont le service est rendu (csv, xml,
bd). Voici une interface de départ (pour l’itération 1) que vous aurez à faire évoluer :
Fichier : Persistance.inc
interface Persistance {
/**
* permet de charger toutes les catégories et tous les articles
* @return boolean : vrai en cas de succès, faux sinon
*/
public function charger();
/**
* @return array retourne un tableau de toutes les catégories lues
*/
public function getCategories();
/**
* @return array retourne un tableau de tous les articles lus de toutes les
catégories lues
*/
public function getArticles();
}
Notez que vous pouvez faire évoluer l’interface en classe abstraite si vous le souhaitez.
A vous de définir les classes Categorie (dans le fichier Categorie.inc) et Article (dans Article.inc) en
choisissant leurs attributs et leurs méthodes (comme par exemple une méthode pour obtenir un
code html les représentant).
Pourquoi des fichiers .inc
L’objectif de ne pas utiliser l’extension .php est de faire la différence entre les pages du site (.php) et
les fichiers qui structurent la programmation du site (.inc). Par ailleurs, avec une bonne configuration
du serveur web, il est possible de rendre inaccessible directement certains fichiers :
<Files *.inc>
Order allow,deny
Deny from all
</Files>
Ce principe s’applique aussi aux fichiers xml, csv, txt, etc.
Voici votre carnet de route pour ce tp :
-
-
Créer un projet eclipse (/usr/local/eclipse/eclipse-php-3.0.2/eclipse) : Lancez cet eclipse-php
et placez votre workspace dans votre dossier ~/www (directement ou dans un sousdossier). Ainsi vos projets seront accessible via une url du type :
http://www-mips.unice.fr/~<login>/<workspace/><nom de projet>/<chemin vers le fichier
php>.
Eclipse vous apportera de la complétion et comme vous serez amenez à l’utilisez en Projet
Développement (semestre 6), avec d’autres fonctionnalités, autant vous habituez.
Créez un projet php
Récupérer les données initiales (Categorie / Article)
o Récupérez l’archive qui contient un exemple de fichier xml, un dossier avec des
articles sous forme de fichier et un fichier sql (en mode de compatibilité ANSI)
o
o
-
-
Récupérez l’archives avec les « classes ou interface » Persistance / Categorie /
Article.
Créez vos tables dans votre bd en utilisant le fichier sql fournit dans l’archive
 Vous avez une bd disponible sur euterpe.unice.fr
 Le serveur n’est accessible que depuis certains réseaux (celui des machines
que vous utilisez mais pas du wifi).
 L’interface web du serveur est : http://euterpe.unice.fr/phpmyadmin/
 Votre login est 13_mia_<numero etudiant>
 Votre mot de passe est votre prénom (1ère lettre en majuscule, les accents…)
 Le nom de votre base est celui de votre login pour la BD : WEB_<votrelogin>
o Placez le dossier « news » dans votre projet.
Faire la page d’affichage qui utilise une persistance (commencez par la lecture de fichier)
o Avec les fonctions glob et is_dir, identifiez les dossiers et examinez leurs contenus
(encore une fois la fonction glob) pour obtenir les fichiers « .news ». Ouvrez les pour
obtenir le contenu : la première ligne est le titre de l’article, la seconde ligne l’auteur
et le reste est le contenu de l’article.
Vous pourrez ainsi créez l’ensemble des objets Categorie et Article.
Puis dans n’importe quel ordre :
o Faire lecture fichier xml
 Pour le(s) fichier(s) XML, incluez la DTD, ainsi vous pourrez vérifier la validité
du document XML avec php (méthode DOMDocument::validate).
Avec getElementsByTagName obtenez toutes les catégories, et pour chaque
catégorie, obtenez tous les articles (avec getElementsByTagName). Puis
continuez l’analyse de l’élément pour obtenir le titre, l’auteur et le texte.
o Faire lecture bd
 Pour obtenir toutes les catégories, effectuez la requête SELECT * FROM
categories;.

Pour obtenir les articles par catégorie, effectuez la requête SELECT * FROM
articles WHERE `categorie` = \"$categorie\" ORDER BY
`articles`.`titre` ASC;".
Edition du php
Placez votre workspace dans votre dossier ~/www (sur votre site web).
Placez des commentaires « intelligents » dans php : devant une variable ou une méthode ou une
fonction, tapez : « /**<entrée> ». Vous pouvez alors rentrer les « types » avec l’annotation @var ou
@param ou @return (à ajouter pour chaque méthode qui a une valeur de retour). Ces commentaires
sont utiles pour la complétion (pas autant qu’en Java) et ce seront les commentaires pour la
génération de documentation – API avec phpDocumentor (vous verrez cela lors au semestre 6).
Pour éviter de mettre tous les « include » liés aux classes (surtout en cas d’utilisation de SESSION),
vous pouvez ajouter la fonction __autoload. Si vos classes sont dans des fichiers avec le même nom
et que tous vos fichiers sont aux mêmes endroits :
function __autoload($classname)
{
// il faut indiquer le chemin depuis le script qui utilise les classes
include_once "$classname.inc";
}
Pour exécuter vos codes php / pages web, vous pouvez consulter vos pages via un navigateur à l’url
URL http://www-mips.unice.fr/~<votre login>/<votre workspace>/[chemin de la page dans le projet
]. Vous pouvez aussi utiliser le navigateur interne à eclipse : cliquez droit sur un fichier à essayer,
choisissez « Run as » / « Php Web Application ». Dans la boite de dialogue « Launch », modifier l’url
pour qu’elle ressemble à http://www-mips.unice.fr/~<votre login>/<votre workspace>/[reste du
texte = chemin de la page dans le projet ].
Comment choisir dans un premier temps la persistance / source d’information, sans avoir à modifier
le code source ? Il y a plusieurs façons de faire, mais le plus rapide reste le paramètre placé dans l’url
: « ?persistance=<nom de la classe> ». Pour récupérer ce paramètre, et l’utiliser, voici un code
« minimal » (car il est possible de faire des tests sur le type pour ne pas utiliser n’importe quoi) :
/**
* indique le type de persistance utilisée, avec une valeur par défaut
* @var string
*/
$typepersistance = "PersistanceFichier";
if (isset($_GET["persistance"]))
{
$typepersistance = $_GET["persistance"];
}
/**
* persitance utilisée
* @var Persitance
*/
$persitance = new $typepersistance();
Pour faciliter les changements d’accès à la base de données entre un serveur distant (le vôtre
euterpe.unice.fr) et un serveur local (si certain développe sur un ordinateur portable… ou chez eux).
Dans ce cas, le 1er paramètre de mysql_connect variera d’une configuration à une autre :
$server = "euterpe.unice.fr";
if ($_SERVER["SERVER_NAME"]=="localhost") $server = "localhost";
// vous pouvez ajouter un test avec le port du server
// les paramètres utilisés à titre illustratif
$connexion = new PDO("mysql:host=$server;dbname=database",
'username','password');
Itération 2 (ajout d’article)
Le choix de la persistance dans laquelle vous ajouter un article est fait de la même façon que le choix
de la persistance dans l’itération 1. Depuis la page d’affichage ajoutez un lien vers la page d’ajout
d’article en conservant la persistance utilisée (paramètre de l’url ou variable de session). Depuis la
page d’ajout d’article, il y a un lien vers la page d’affichage (en conservant la persistance utilisée).
Pour cette itération, vous devez faire un formulaire d’ajout d’article. Les catégories que vous pourrez
choisir doit être limité à celles existent. Générez donc une balise « select » dont toutes les « option »
correspondent à une catégorie existante.
Au niveau du formulaire et de l’ajout, il faudra savoir quelle persistance est utilisée. Pour cela vous
pouvez utiliser une variable de session ou un paramètre dans l’url (du style ?persistance=<nom de
classe>, comme pour essayer les différentes persistances lors de l’itération 1).
Pour les différentes persistances, vous aurez à vérifier que la catégorie existe bien (le test peut se
faire sur le nom de la catégorie). Pour ajouter le nouvel article :
-
-
Pour les fichiers, il faudra créer un nouveau fichier « .news » dans le bon dossier (la
catégorie) en respectant le modèle : la première ligne est le titre de l’article, la seconde ligne
l’auteur et le reste est le contenu de l’article. Pour nommer l’article et ne pas écraser un
ancien article, vous pouvez choisir comme nom la valeur de strtotime("now")
Pour le fichier xml, vous devez créer un nouvel élément « article » et l’ajout (méthode
appendChild) au bon élément catégorie. Il faudra bien sauvegarder le fichier (méthode save)
Pour la base de données, il faudra faire une requête "INSERT INTO `articles`
(`creation`, `categorie`, `titre`, `auteur`, `texte`) VALUES
(CURRENT_TIMESTAMP, '$cat', '$titre', '$auteur', '$texte') ;".
Dans tous les cas, pensez à l’encodage des caractères (et aux fonctions utf8_encode ou
utf8_decode ou iconv).
Votre site devra dire si l’ajout d’article a bien été effectué ou non.
Itération 3 (ajout de catégorie)
De manière similaire à l’itération 2, faites une page pour ajouter une catégorie. La nouvelle catégorie
ne devra pas exister préalablement. Pour les trois types de persistances :
-
Pour les fichiers, ajouter une catégorie revient à créer un dossier
Pour le fichier XML, ajouter une catégorie revient à créer un nouvel élément à placer sous la
racine
Pour la base de données, ajouter une catégorie revient à insérer une nouvelle entrée dans la
table adéquate.
Dans tous les cas, pensez à l’encodage des caractères (et aux fonctions utf8_encode ou
utf8_decode ou iconv ou à paraméter PDO avec l’encodage).
Votre site devra dire si la création de catégorie a bien été effectuée ou non.
Itération 4 (page de configuration)
Pour la dernière itération, faite une page qui permettent de choisir la source d’information. Au début
commencez avec les trois persistances que vous avez réalisées.
Enfin ajoutez une page permettant d’ajouter une nouvelle persistance (en les nommant) :
-
Pour une persistance « Fichiers », le paramètre est le nom du dossier « racine » (voir le nom
de l’extension des fichiers)
Pour une persistance « XML », le paramètre est le fichier XML (voire le nom des balises)
Pour une persistance « BD », les paramètres sont : le serveur, le login / mdp / le nom de la
base de données (voire les noms des tables)