RAPPORT
Ric’ard
ROMAIN RICARD
Table des matières
I. Introduction .................................................................................................................................... 4
A. Présentation............................................................................................................................... 4
B. Présentation de l’entreprise et l’environnement informatique ............................................ 4
C. Présentation du projet .......................................................................................................... 4
II. Cadre du projet ............................................................................................................................. 5
A. Enjeux et objectifs..................................................................................................................... 5
B. Livrables ..................................................................................................................................... 5
III. Conception graphique .............................................................................................................. 5
A. Brief créatif ................................................................................................................................. 5
B. Charte graphique ...................................................................................................................... 5
IV. Spécifications fonctionnelles ................................................................................................... 6
A. Périmètre fonctionnel ............................................................................................................... 6
1. Les acteurs ............................................................................................................................ 6
2. Les fonctionnalités ................................................................................................................ 6
B. Arborescence ............................................................................................................................ 7
C. Aperçu des contenus ........................................................................................................... 9
1. Page d’accueil : A propos/Présentation ............................................................................ 9
2. Peintures ................................................................................................................................ 9
3. Catégorie................................................................................................................................ 9
4. Détail produit ......................................................................................................................... 9
5. Tarifs ..................................................................................................................................... 10
6. Expositions........................................................................................................................... 10
7. Contact ................................................................................................................................. 10
8. Authentification.................................................................................................................... 10
9. Gestion des articles ............................................................................................................ 11
10. Gestion des catégories .................................................................................................. 12
11. Gestion des expositions................................................................................................. 13
V. Spécifications techniques .......................................................................................................... 14
A. Choix technologiques ............................................................................................................. 14
1. Langage de programmation .............................................................................................. 14
2. Type de base de données ................................................................................................. 14
3. Localisation des applications et des bases de données............................................... 14
4. Validation des formulaires ................................................................................................. 14
B. Accessibilité ............................................................................................................................. 15
C. Service tiers ......................................................................................................................... 15
Romain Ricard 1
D. Performances attendues ................................................................................................... 15
E. Sécurité .................................................................................................................................... 16
F. Maintenance et évolutions..................................................................................................... 16
VI. Réalisation et suivi du projet ................................................................................................. 17
A. Informations générales .......................................................................................................... 18
1. Langage ............................................................................................................................... 18
2. Structure de la base de données ..................................................................................... 18
B. Développement des fonctions .............................................................................................. 21
1. Mise en place de la base de données ............................................................................. 21
C. L’authentification ................................................................................................................. 23
D. Gestion des articles ............................................................................................................ 27
1. Liste d’articles ...................................................................................................................... 27
2. Supprimer un article ........................................................................................................... 28
3. Création et modification d’article ...................................................................................... 29
VII. Test et Recettage ................................................................................................................... 33
VIII. Déploiement............................................................................................................................. 34
IX. Les backups............................................................................................................................. 34
X. Conclusion ................................................................................................................................... 34
Romain Ricard 2
Compétences professionnelles Réalisations
Romain Ricard 3
I. Introduction
A. Présentation
Je m’appelle Romain Ricard, je suis âgé de 29 ans. J’ai découvert l’informatique par
hasard et relativement tard lors d’un voyage au Canada via quelqu’un de ma famille
qui m’a fait connaître ce métier. J’ai trouvé une satisfaction personnelle, réussir à
avoir quelque chose de fonctionnel. J’ai donc poursuivi dans ce sens.
J’ai été durant 2ans au sein de deux entreprises différentes en tant que développeur
PHP en alternance.
L’entreprise est une auto-entreprise gérée par mon père, Michel Ricard et ma mère,
Françoise Ricard. Mon père fait de nombreux marchés et expositions à l’année dans
toute la région vendéenne.
Il propose la vente d’œuvres de peinture réalisé au fer à repasser et à la cire
d’abeille.
Divers formats et types de tableaux sont disponibles. L’intérêt étant de voir le peintre
en action, comme avec un caricaturiste. C’est en le voyant faire ses démonstrations
qu’il permet au public de découvrir et d’apprécier ce style bien particulier.
Pour ce qui est de l’environnement informatique comme il s’agit d’un projet personnel
je suis seul dans mon bureau à Chalonnes sur Loire.
C. Présentation du projet
The project is simple realization of a website in PHP with a Mysql database for
individuals to see the paintings of Michel Ricard. There will of course be a back office
managed by his wife Françoise Ricard.
The site is not made to sell but to have a rendering of the works of the artist. A bit like
a cartoonist, what leads a person to make a purchase is to see the painter do it. We
will put in place the maximum recommendation and security of the code throughout
the development. I will also make sure to make a site in accordance with web eco-
design so as little external element as possible.
A. Enjeux et objectifs
L’objectif du projet est de mettre en place un site web en PHP sans framework avec
une base de données pour inviter d’autres gens à découvrir les œuvres de mon père.
B. Livrables
Le graphisme du site doit être épuré, le plus lisible et facile d’utilisation pour
l’administrateur et les visiteurs.
B. Charte graphique
Romain Ricard 5
Palette de couleur tournera autour de couleur sobre blanc, beige et noir pour
l’écriture.
Typographie de contenu : Comic Neue, cursive
Typographie de titre : Permanent Marker, cursive
Design graphique : Responsive Bootstrap
A. Périmètre fonctionnel
1. Les acteurs
Donc pour ce qui est de la gestion des rôles c’est très simple il y en a qu’un :
l’administrateur.
2. Les fonctionnalités
Romain Ricard 6
Fonctionnalité Contrainte(s) associée(s)
B. Arborescence
Romain Ricard 7
Arborescence pour les administrateurs :
Romain Ricard 8
C. Aperçu des contenus
2. Peintures
Fonctionnement : Possibilité de clique soit sur le titre soit sur l’image associée de la
catégorie pour avoir accès à toutes les peintures de cette catégorie
3. Catégorie
Fonctionnement : Possibilité de clique soit sur le titre soit sur l’image associée de la
peinture pour avoir au détail de cette peinture
4. Détail produit
Résultat attendu : à gauche une image d’une plus grande taille environ la moitié de
l’écran sans déformation et à droite le titre suivi de sa description, de sa date de
création et de sa ou ses catégories.
Romain Ricard 9
5. Tarifs
Résultat attendu : Affichage d’un grand tableau qui indique le prix en fonction des
catégories, du format et des options.
6. Expositions
Résultat attendu : Liste des expositions sous forme de liste de grande taille, il y
aura l’affichage des expositions qui arrive bientôt avec un badge qui indique si
l’exposition est dans 2 jours ou moins. Si l’exposition est passée, pas d’affichage.
7. Contact
Résultat attendu : Une grande carte avec google map du plan où se situe l’artiste
ainsi que son mail, son adresse et son numéro de portable.
8. Authentification
Romain Ricard 10
9. Gestion des articles
a) Liste des articles
Résultat attendu : Affichage des articles avec son id, son titre et les actions que
sont la création, la modification et la suppression.
Romain Ricard 11
10. Gestion des catégories
a) Liste des catégories
Résultat attendu : Affichage des catégories avec son id, son titre, son url ainsi que
les actions de création, modification, suppression.
Romain Ricard 12
11. Gestion des expositions
a) Liste des expositions
Résultat attendu : Affichage des expositions avec son id, sa localisation et sa date
et heure de début ainsi que les actions que sont la création, modification,
suppression.
Le formatage de la date sera en français. Un badge indiquera quand est ce que
l’exposition est fini.
Romain Ricard 13
V. Spécifications techniques
A. Choix technologiques
1. Langage de programmation
Le type de base de données utilisé par l’application est MySQL. Le système étant
une application Web la communication entre eux est simple et l’outil est gratuit. Je ne
passe pas par une ORM écriture de la base de données en langage sql. Je passe
néanmoins par une interface phpmyadmin.
La base de données et notre application vont être hébergé chez OVH hébergeur
français.
La validation est une tâche très courante dans les applications Web. Les données
saisies dans les formulaires doivent être validées. Les données doivent également
être validées avant d'être écrites dans une base de données ou transmises à un
service Web.
Je passe par une librairie Validator acquis sur packagist qui me facilite la tâche.
On pourra ainsi gérer différentes contraintes comme :
Romain Ricard 14
• Des contraintes de base par exemple les types savoir si le champ doit être nul
ou vide.
• Des contraintes de chaînes pour les champs spécifiques comme les mots de
passe ou les e-mails, la longueur attendue dans ses champs.
• Des contraintes de date pour avoir un datetime adapté dans notre cas.
• Des contraintes de choix utilisées pour les listes déroulantes.
B. Accessibilité
C. Service tiers
D. Performances attendues
Romain Ricard 15
E. Sécurité
Pour la sécurité autour de la session je passe par un bouton déconnexion qui détruit
la session en cours pour l’administrateur.
Concernant la protection des données en transit je passe par un certificat ssl et dans
mon htaccess il y a une redirection de tous les liens http vers https. J’utilise des
méthodes post pour la modification et transmission de donnée et get pour la
récupération d’informations. Grâce à ce certificat je m’assure que le corps est chiffré.
Donc protection CORS (cross origin resource).
La base de données ovh est accessible seulement via un utilisateur qui a un nom et
un mot de passe, moi-même. De plus dans ma table user je hash le mot de passe en
bcrypt.
J’empêche l’exploitation des contrôles d’accès grâce à des routes spécifiques qui ne
sont accessibles que si on a une session d’admin valide donc que l’on s’est
connecter auparavant sur le site avec les bons identifiants.
F. Maintenance et évolutions
Romain Ricard 16
VI. Réalisation et suivi du projet
Dans la partie qui suit, nous allons nous attarder sur le développement des
fonctionnalités de l’application. Nous allons rentrer en détail sur le fonctionnement et
sur la méthode de développement mise en place.
Romain Ricard 17
A. Informations générales
1. Langage
Pour développer l’application, j’ai utilisé le langage PHP version 7.2 sans Framework
afin de structurer le développement j’ai créé des dossiers qui m’ont permis de
constituer mon modèle en couche.
Dans un premier temps mon application sera développée sur wamp qui sera mon
environnement de test avant le déploiement.
L’application va être structurée en différentes couches ayant chacune un objectif
différent :
Romain Ricard 18
Figure 5: Modèle logique
User correspond à nos utilisateurs donc nos admin notre champ password sera
haché.
Il y a 5 entités :
• Category
o Id :
▪ Clé primaire
▪ Auto-implement
▪ Type : integer.
o Name :
▪ Unique
▪ Type : varchar (255)
▪ Null : non
o Slug
▪ Unique
▪ Type : varchar (255)
▪ Null : non
o Image
Romain Ricard 19
▪ Unique
▪ Type : varchar (255)
▪ Null : oui
• Post
o Id :
▪ Clé primaire
▪ Auto-implement
▪ Type : integer.
o Name :
▪ Unique
▪ Type : varchar (255)
▪ Null : non
o Slug :
▪
Unique
▪
Type : varchar (255)
▪
Null : non
o Image :
▪ Unique
▪ Type : varchar (255)
▪ Null : oui
o Created_at :
▪ Type : datetime
▪ Null : non
o Content :
▪ Type : text
▪ Null : oui
• Exhibition
o Id :
▪ Clé primaire
▪ Auto-implement
▪ Type : integer.
o Location :
▪ Type : varchar (255)
▪ Null : non
o Start_date :
▪ Type : datetime
▪ Null : non
• User
o Id :
▪ Clé primaire
Romain Ricard 20
▪ Auto-implement
▪ Type : integer.
▪
o Username :
▪ Unique
▪ Type : varchar (255)
▪ Null : non
o Password :
▪ Type : varchar (255)
▪ Null : non
• Post_category :
o post_id :
▪ Clé primaire
▪ Type : integer.
o category_id :
▪ Clé primaire
▪ Type : integer.
▪ Clé étrangère
Il y a 2 relations, une qui fait la liaison post et post_category et une autre qui fait
category et post_category.
Pour la création de la base de données je passe directement par du langage sql pas
de terminal, ni d’orm. Une fois satisfait du résultat j’importe le tout sur phpmyadmin.
Romain Ricard 21
Figure 6 Concepteur phpmyadmin de ma bdd
Romain Ricard 22
C. L’authentification
Chaque utilisateur étant considéré comme un admin il n’y aura pas de rôle associé à
un utilisateur pour se connecter l’administrateur du site aura un identifiant et un mot
de passe afin de pouvoir accéder aux fonctionnalités de l’application.
Figure 7 views/auth/login.php
Pour le mot de passe je passe par form.php de mon dossier HTML j’ajoute dans ma
méthode input le type pour mettre password et dans mon input j’ajoute le type.
Figure 8 HTML/Form.php
Romain Ricard 23
Le fichier Form.php me permet de faciliter la création de mes formulaires j’y gère la
création des labels et types de champs pour chacun de mes formulaires donc tout
est regroupé ce qui m’évite une redondance du code dans mes vues.
Maintenant on traite les données au-dessus on vérifie si le $_post est vide ou si l’un
des deux post est vide et on y met notre erreur.
Pour se souvenir des données entrées par l’utilisateur on utilise notre setUsername.
Pas nécessaire pour le mot de passe.
On doit démarrer la session, on sauvegarde l’id de l’utilisateur en session
Figure 9 views/auth/login.php
Dans HTML/Form.php : Si error est un tableau alors on fait un imlode de nos error
sinon on indique directement l’erreur.
Figure 10 HTML/Form.php
Romain Ricard 24
On passe par la création d’un UserTable dans notre dossier Table afin de vérifier si
le mot de passe de l’utilisateur et son identifiant son correct.
On prépare notre requête avec une clause where on l’execute puis on récupère
l’enregistrement via le setFetchMode.
Si la variable forbidden est définie alors on affiche le message d’erreur qui sera
indiqué via une alerte.
Figure 11 Table/UserTable.php
Maintenant on va devoir gérer tout ce qui est session donc on crée à la racine de
notre dossier src un fichier Auth.php pour s’assurer que la session est démarrée si la
session n’est pas démarrée on fait un session_start.
Figure 12 src/Auth.php
Romain Ricard 25
Pour rediriger vers la bonne url on se rend dans notre Router.php on catch les
forbiddenException et on redirige vers la page login.
Voilà notre partie d’authentification est terminer maintenant on passe par la
déconnexion
On définit notre route de déconnexion en logout dans le public/index.php
Dans le menu du dashboard admin qui se trouve dans layouts/default.php on créer
un lien supplémentaire dans le menu, ce sera un formulaire avec comme action
logout et une méthode post.
A l’intérieur on aura qu’un boutton de type submit.
Dans le fichier des view/auth on crée un fichier logout.php dedans on fait juste un
session_strat session_destroy pour détruire la session et ensuite on redirige vers la
page login.
Romain Ricard 26
D. Gestion des articles
La gestion des articles consiste à pouvoir lire une liste d’articles mais aussi de créer,
modifier, supprimer un article
Pour cela il faudra auparavant se connecter pour avoir accès au tableau de bord
d’administration.
1. Liste d’articles
Création de la route, puis de la vue on créer un dossier admin puis un dossier post
qui contiendra toutes les vues de nos peintures/articles donc l’index, l’édit, la création
et la suppression.
On crée nos model post.php et category.php qui contiendra nos getters et nos
setters.
Dans notre index on instancie notre pdo, on créer une nouvelle post table avec
l’instance de pdo et on lui demande d’utiliser la méthode findPaginated qui permet de
gérer la pagination de nos articles.
Figure 13 views/admin/post/index.php
On crée une boucle pour aller afficher les différents attributs dont on va avoir besoin
se sera sous forme de table. On passe par htmlentities pour sécuriser le code.
Figure 14 views/admin/post/index.php
Romain Ricard 27
On crée différents boutons pour éditer et supprimer les articles. On y ajoute un peu
de js avec onclick pour faire une vérification si l’utilisateur souhaite vraiment
supprimer. Pour ce qui est de l’action supprimée ce sera un formulaire en post avec
seulement un bouton submit. Ce qui fait que si quelqu’un m’envoie le lien de
suppression ça ne fonctionnera pas.
2. Supprimer un article
Dans mon dossier de vue et mon dossier admin je crée un fichier delete.php.
Je récupère ma pdo, je fais un new postTable et ensuite je fais un delete avec l’id de
l’url de l’article.
Puis une redirection.
Cependant je n’ai pas encore créé ma méthode delete donc je me rends dans mon
Table pour créer cette méthode qui aura comme paramètre l’id qui sera un entier et
on va étendre notre Table dans notre PostTable car certaines méthodes reviendront.
J’écris ma requête sql de DELETE, je sauvegarde la requête dans une variable puis
je l’exécute. Si une suppression ne se passe pas correctement on affiche une erreur.
Figure 15 Table/Table.php
Figure 16 views/admin/post/delete.php
Romain Ricard 28
3. Création et modification d’article
On crée une route en match qui sera soit en post soit en get qui sera une méthode
créer dans notre Router.php
On récupère l’instance de pdo, puis on crée notre postTable et j’injecte l’instance de
pdo.
On crée un nouvel objet post qui sera vide
On dit que la date du jour se sera la date actuelle.
Il y aura aussi une vérification via Validator, une librairie valitron que j’ai installé avec
composer. Pour chacun des dossiers formulaires type il y a un validator qui lui es
associé pour l’edit et le create post il y a un fichier PostValidator.php ou des règles
nous indique si le champ est requis ou nom, la longueur de celui-ci si c’est une image
et on pourra même crée des nouvelles règles qui nous permettrons de vérifier si un
champ utilise déjà ce nom.
Figure 17 src/Validators/PostValidator.php
On crée une méthode create dans notre postTable qui correspond à peu de chose
prêt à notre méthode update. Une fois la création réussie on redirige vers la page de
listage des articles sinon on affiche le tableau d’erreur.
Romain Ricard 29
Figure 18 views/admin/post/_form.php
Cependant il nous manque la liste déroulante qui fait la liaison avec nos catégories.
On va dans notre HTML/Form.php et on crée une nouvelle méthode pour notre liste
déroulante qui aura 3 paramètres la clé de mon champ, le nom de mon label et un
tableau d’options qui contiendrait le numéro de la catégorie et le nom de celle
associée. Ce fichier me servira pour tous mes formulaires.
Maintenant sur mon edit.php je dois récupérer la liste des catégories sous le format
clé, valeur. Je fais donc un new CategoryTable pour récupérer sous forme de liste.
Je crée la méthode list dans mon CatégoryTable qui récupère toutes les catégories.
On crée un tableau result où on récupère l’id et et le nom.
Il faut aussi penser à hydrater nos post afin de voir ce qui a été sélectionné par
l’utilisateur dans le cas d’une modification. Pour cela on droit créer une nouvelle
fonction dans model post.php qui récupère les id des catégories. Ensuite dans mon
Form.php on vérifie si l’élément est sélectionné.
Pour faire en sorte qu’un utilisateur ne puisse pas sélectionner une catégorie qui
n’est pas présente en base de données on doit se rendre sur notre PostValidator et
on ajoute la règle subset qui permet justement cette vérification.
Romain Ricard 30
Pour vérifier dans notre edit que sa enregistre bien dans le champ ce qui est présent
en base de données on passe par notre postTable on récupére les informations de
l’article dans la méthode update et en plus le tableau des catégories d’article. On fait
une suppression en post_category en fonction de son post_id et maintenant on
insère les enregistrements toujours en fonction du post_id et category_id.
Figure 19 views/admin/post/edit.php
Figure 20 Table/PostTable.php
Romain Ricard 31
Figure 21 Page d'index d'administration des articles
Romain Ricard 32
VII. Test et Recettage
Dans un premier temps, afin de générer un jeu de données pour les tests j’ai utilisé
faker une librairie open source PHP trouvée sur packagist et ajoutée via composer.
Le but étant de générer un nombre défini d’enregistrement sur chaque table présente
en base de données. Afin d’avoir un rendu visuel sur ce que pourrait donner
l’application lors du déploiement.
Pour cela j’ai créé un dossier command avec un fichier fill.php qui contient les
requêtes d’insert ion en base de donnée pour l’intégralité de mes tables.
Figure 22 fill.php
L’environnement est basé sur les mêmes configurations que le serveur sur lequel il
va être déployé.
Romain Ricard 33
VIII. Déploiement
Je prends un nom de domaine et une offre sur OVH puis une fois l’opération finie je
télécharge Filezilla.
X. Conclusion
Ce projet m’a permis de découvrir diverses choses comme :
• L’élaboration d’un cahier des charges avec les spécifications techniques et
fonctionnelles
• La création de diverses maquettes
• La création de jeu de données
• La mise en place de backup
• Le déploiement d’une application sur OVH
Romain Ricard 34