Plateforme Communautaire de Partage de Projet: Partie 2

Sommaire

 

Introduction :

Clarification du code:

Inscription :

SignupModel.php :

SignupController.php :

ProjectsController.php :

ProjectsModel.php :

Ajout dans la fonction erase de ProjectsModel :

Les fonctions d’installation et de désinstallation:

La fonction execute_file_script : 

Interpréter le code :

La fonction install : 

La fonction uninstall :

Retour dans le contrôleur : 

.htaccess :

File_uploaded.html : 

 

Introduction :

L’objectif de ce rapport sera d’approfondir les avancements de ma plateforme de partage de projet. Plus spécifiquement nous allons voir la réflexion de notre programmation qui nous permettra de jongler entre la BDD,  notre MVC ainsi que notre API qu’on a mis en place.

 

Clarification du code :

Afin d’enlever l’obligation de mettre une action dans l’URL j’ai créé une méthode index qui return la fonction login.  En effet dans l’URL on mettra comme valeur du paramètre contrôleur : login sans devoir préciser une valeur pour l’action.

Ensuite j’ai remplacé param par $_Get pour que ce soit plus parlant. Je vous rappelle qu’un Get permet d’insérer les paramètres dans l’URL contrairement à un Post où l’on doit obligatoirement passer par soit un formulaire ou login soit par une requête HTTP/AJAX.

Pour faciliter l’accès a BDD j’ai créé un model Database où je copie colle ce que j’avais dans le constructeur de la classe LoginModel : c’est-à-dire la connexion au BDD. Ensuite je crée une fonction get_mysql_connector où je retourne la valeur de mysql.

Dans un model que je nomme BaseModel, j’appelle dans le constructeur, la fonction get_mysql_connector() à la configuration, ce qui fait que ma connexion se tient désormais dans la variable mysql.

 

 

 

L’inscription :

SignupModel.php

Je crée pour l’inscription une petite fille SignupModel qui hérite de la classe BaseModel pour la connexion du BDD. Dans cette classe je crée d’abord une fonction add_user avec comme paramètres : $name, $username, $email, $password, $phone, $role. J’affiche ensuite la requête suivante :

 

 

Ensuite comme l’utilisateur peut avoir plusieurs téléphones et emails, je crée deux fonctions : add_phone et add_email avec $phone et $email comme paramètres.

Comme fonctions supplémentaire au modèle SignupModel est une fonction delete_account avec comme paramètre $id pour supprimer une inscription et enfin une fonction update_account avec comme paramètres $id, $name, $username, $email, $password, $phone, $role pour modifier une inscription.

 

 

SignupController.php

Dans cette classe qui hérite de Controller après mon constructeur j’instaure une fonction index qui retourne la fonction signup que je crée juste après. Dans cette fonction signup, j’appelle la fonction add_user de mon model avec comme paramètres des get de « name, surname, email, password (que j’encrypte grâce à sha1), phone et role ». Je récupère dans $result. Ensuite je test l’existence de $result qui retourne SUCCESS si vrai et ERROR si faux. Ce test je le récupère dans $status que je retourne à la fin de ma fonction.

La même procédure est faite pour les fonctions add_phone et add_email.

 

 

ProjectsController.php

Dans cette classe qui hérite de la classe Controller après l’écriture de mon constructeur je crée une fonction index qui retourne une fonction get_projects que je crée juste après. Dans cette fonction get_projects j’appelle de mon model «ProjectModel » la fonction get_all que j’étayerai plus bas.

La fonction suivante sera expliquée à cause sa longueur en étape:

  1. Dans une fonction que je nomme add_projects, je récupère les infos du fichier dans la variable $file.
  2. S’il y a une erreur je lance une exception
  3. Je définis les extensions du projets valable que je récupère en $extensions_valides
  4. Je détermine quelle extension le fichier que je viens d’uploader possède. Je fais cela grâce à la fonction explode qui transforme une chaine en tableau et la fonction count qui compte la taille et ici plus spécifiquement le dernière index du tableau -1 (car on commence par 0) c’est-à-dire l’extension.
  5. Je fais ensuite un test grâce à in_array pour voir si extension_upload est dans extensions_valides. Si c’est le cas, je vérifie que le fichier n’est pas un directory. Si c’est vrai j’en crée un. Ensuite je l’encrypte pour qu’il soit illisible. Je mets ensuite le fichier temporaire dans le répertoire et je le récupère en $resultat. Après cela je fais un test pour vérifier s’il existe et si c’est le cas je l’appelle en post sur mon model (c’est-à-dire sur « name, description, author, downloadable » et enfin je le mets dans result. Sinon result retourne false. Après cela je fais un autre test où si $result est true, je retourne SUCCESS et sinon ERROR. Ma fonction à la fin retourne le status.

 

 

Ensuite j’ai crée une fonction upload qui affiche le formulaire.html et qui le retourne. La dernière partie de cette classe est la fonction delete qui en faisant un test avec comme condition appelle la fonction erase avec la bonne indication du model et qui return vraie et sinon qui return faux.

La dernière fonction de cette classe sera la fonction delete qui permet de supprimer l’ensemble des propriétés de la BDD et du MVC. Je commence à faire un test. Si la désinstallation a réussi, je lance la fonction erase afin de tout supprimer.  Enfin je retourne dans un tableau le résultat

NB :

J’ai décidé ensuite de créer dans l’index.php un constant « Root » et je le remplace par _DIR_ : afin d’éviter un retour dans l’arborescence.

 

ProjectModel.php

Dans cette classe qui hérite de BaseModel je crée d’abord une fonction get_all. Dans celle-ci j’attribue à la variable $request une requête qui permet de tout sélectionner du projet. Comme après chaque SELECT je fais un while qui récupère directement les valeurs dans un tableau grâce à la fonction fetch_assoc()  que j’attribue à la variable $projects. A la fin la fonction retourne $projects.

J’écrie ensuite une fonction add avec comme paramètres $name, $description, $path, $author et  $downloadable. Ensuite j’attribue à ma variable $path et je remplace le «\\ » par un « / » pour qu’il soit compatible en Windows. Je retourne enfin la requête qui permet d’insérer dans project : name, description, path, author et downloadable pour les valeurs passées en paramètres.

 

 

J’ai créé une autre fonction « erase » qui contient la requête pour supprimer un projet dans mon modèle grâce à la fonction unlink. Cette fonction concrètement commence par $req qui récupère une requête qui affiche le chemin de project là où l’id égale celle passée en paramètres. Ensuite comme la fonction get_all après la requête SELECT on trouve un while qui boucle sur le chemin dans un tableau grâce à la fonction fetch_array().

Ensuite je fais un « if ». Si le $_path existe je la supprime grâce à la fonction unlink. Puis je fais un  deuxième « if » avec comme condition de savoir si le chemin $_path n’existe pas et qui le supprime grâce à une requête de la BDD. Ce « if » imbriqué retourne false si il n’as pas pu supprimer le zip et enfin le return false à la fin s’il n’as pas réussi à le trouver dans le BDD.

La dernière fonction dans cette classe est la fonction extract qui a comme rôle de dézipper le projet. Il prend comme paramètres $zip_name et $extracted_name. La première chose que je fais c’est que j’instancie zipArchive que je récupère dans $zip. Ensuite j’ouvre $zip grâce à la fonction open qui prend en paramètre le bon chemin avec le paramètre $zip_name. Tout cela je récupère dans la variable $opened. Après cela je fais un test pour voir si $opened existe.

Si le test d’ouverture du fichier n’a pas marché je retourne false.

Après je fais deux tests dans lesquels je crée un répertoire et que j’extrais le projet.

 

 

Dans le premier, je teste que l’upload n’est pas un répertoire. Si c’est le cas je crée un répertoire avec les bonnes permissions. Juste après je teste si j’ai pu dézipper $zip grâce à la fonction extractTo. Si c’est le cas mon $status passe à true. Ensuite une deuxième test imbriqué va passer le $status à false si on ferme le $zip.

Si les tests d’extractions n’ont pas marché je retourne le $status à false

Si les tests de création du répertoire et d’extraction n’ont pas marché je retourne le $status.

Ajout dans la fonction erase du ProjectsModel

Afin de supprimer le répertoire lorsqu’on appelle la fonction erase, j’ai ajouté un deuxième paramètre : $project_name que je récupère dans $_project_name.  On rajoute un test pour supprimer le répertoire  grâce à la fonction  del_dir_recursive. Pour faire un petit bilan des trois if : la première supprime le fichier, la deuxième supprime le répertoire et la troisième retourne le résultat de requête.

 

 

Les fonctions d’installation et désinstallation

La fonction execute_file_script

Dans cette classe il reste trois fonctions, une grande et deux petites. La grande s’appelle execute_file_script et qui est implémentée dans les deux autres : install et uninstall.

Pour étayer la première, la fonction execute_file_script prend les deux paramètres suivants : $project_name et $file_type. Tout d’abord, je récupère le contenu du fichier install.txt de mon projet courant. Ensuite grâce à mon fonction explode je transforme ensuite chaque ligne en ligne de tableau puis grâce à la fonction unset je boucle avec un foreach pour supprimer les espaces.

Ensuite afin de transformer le fichier en forme de tableau j’initialise d’abord un tableau vide, $commands. J’initialise une variable $last_key à null. Je boucle sur chaque ligne et à l’intérieur j’établis 3 tests : le premier permet de vérifier la suppression d’espaces, le deuxième permet de tester si une ligne contient la chaine de caractère « **php** ».  Si c’est deux tests marchent j’enregistre ‘php’  dans ma variable $last_key pour pouvoir réutiliser la même clé dans les autres lignes de la boucle. Enfin si la clé n’existe pas je la crée et je l’initialise avec un tableau vide. Au contraire si le tableau existe on ne le crée pas. Je termine ces tests par la mot clé « continue » qui permet de stopper la boucle et puis de passer à la boucle suivante. Il enlève aussi la première ligne « **php** ». Je fais les mêmes tests avec « **shell_lin** » et puis pour «**shell_win** » et aussi pour des lignes de commandes.

 

 

Interpréter le code

Toujours dans la même fonction je fais un test pour exécuter le code php. Plus concrètement je teste si le tableau existe. Si oui grâce à la fonction implode, je transforme les lignes du tableau en string et puis grâce à la fonction eval, je les exécute.

Pour détecter si on est sous windows ou linux je sers de

 

 

Je fais plus concrètement un test avec cette condition et si cette condition est égale à win, la clé devient ‘shell_win’ sinon elle devient ‘shell_lin’. Ensuite je fais un foreach sur le clé et à l’intérieur de la boucle j’exécute la commande.

La fonction install

Dans ma fonction installe j’appelle tout simplement la fonction execute_file_script avec le paramètre $project_name et le type qui ici sera ‘install’

La fonction uninstall

Dans cette fonction je fais d’abord une requête pour récupérer le nom du projet en fonction de son ID. Comme après chaque SELECT je fais une boucle while pour remplir le tableau avec les noms. Ensuite si le projet existe je lance la désinstallation et je renvoie true, sinon je renvoie false.

 

Retour dans le contrôleur

Ensuite dans le contrôleur, j’appelle la fonction installe après la réussite du dezippage c’est-à-dire après le test d’extraction.

Pour la désinstallation je teste dans la fonction delete en premier la fonction uninstall et si c’est valide j’exécute l’autre test.

.htaccess

Pour pouvoir mieux recevoir le nom du répertoire et factoriser du code j’ai décidé d’instaurer un fichier .htaccess qui définit  des règles de rootage. Plus concrètement, je définis grâce à des expressions régulières des url dans la barre de recherche et puis celles-ci redirigent vers des alias.

 

 

Plus concrètement toutes les url tapées dans la barre de recherche qui fonctionnent avec la première expression (commencée par my_project) et un nom de répertoire qui suit redirige vers la seconde expression en remplaçant $1 par le contenu équivalant de l’expression régulière.

 

File_uploaded.html

J’ai dans un fichier qui s’appelle file_upoaded.html crée un formulaire qui permet de remplir un certain nombre de champs et puis de lancer le téléchargement d’un projet. Parmi ces informations on doit pouvoir remplir le nom du projet (grâce à une balise input)  suivie par une description (grâce à un balise textarea)  et enfin l’auteur (grâce à une balise input). Ensuite en cliquant sur « Downloadable » (grâce à un for)  cela coche le carré à côté. Enfin en cliquant sur parcourir on peut importer notre projet en forme de zip (grâce à un type = « file »)  et puis de l’envoyer (grâce à un type = « submit ») vers la plateforme qui l’enregistre aussi dans la BDD.

 

 

 

 

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *