Une plateforme communautaire de partage de projet – John Schulman

Sommaire

 

 

Introduction :

Objectifs:

Besoins du projet :

Modélisation/ Réalisation :

Mise en place des détails de l’étape un du projet :

La Base de Données :

La structure du WebService :

 

Partie technique :

A/ Autoload.php :

 

Partie technique : Répertoire extendable_classes : 

A/ La classe controler:

B/ La classe setup :

 

Partie technique : Le login:

A/ mysql.php :

B/ conf.php :

C/ La Classe LoginModel :

D/ La Classe LoginControler :

 

Contexte :

Il y a déjà beaucoup d’applications de gestion de projets disponibles et même en ventes mais ce que je cherche à réaliser c’est une webapp qui concernera des projets informatiques. Dans le contexte d’une meilleure communication et d’organisation, la création d’une plateforme de partage de projets aidera des programmeurs à mieux visualiser les tâches à faire ou déjà accomplies. Le progrès et l’évolution des travaux seront donc mieux appréhendés afin d’avoir une vision plus globale de l’école ou de l’entreprise.

Objectifs :

Créer une plateforme qui permette le suivi de projets informatiques

Points principaux :

  1. Mise en place d’un gestionnaire de login d’identification avec une partie administrative qui permettra de pouvoir modifier les permissions, les rôles et les tâches.
  1. Mise en place d’un gestionnaire d’importation, d’exportation de projets et de leur description, détails etc…
  2. Mise en place d’un gestionnaire de planning : calendrier, emploi du temps, carte de pointage
  3. Mise en place d’un gestionnaire de l’avancement : un contact de communication et de management

 

Globalement cette plateforme permettra de voir nos projets et les projets des autres mais seulement à partir de critères de sélections spécifiques. Les B1 ne pourront pas accéder aux projets des B2 par exemple et certains projets pourrons être vus mais pas téléchargés.

 

 

 

Besoins du projet :

En se servant d’un BDD créer un login avec une partie administrative

  • … Qui permet d’identifier
  • … Qui permet d’ajouter et de supprimer des projets spécifiques
  • … Qui gère plus spécifiquement les permissions du projet

(déléguer les rôles spécifiques dans la partie administrative: créer/supprimer utilisateurs, bloquer ou débloquer utilisateurs i.e. Les B1, modifier les rôles et tâches )

Créer un fenêtre principale

  • … Qui permet de naviguer une arborescence de projets accessibles
  • … Qui permet d’importer / d’exporter des projets ou des résultats
  • … Qui permettra de les lister et voir la description des projets

Créer un menu de gestion de planning

Ce support n’est relié à aucun projet mais n’existe qu’une seule fois par user et

  • … Qui permet de consulter l’emploi du temps pour les tâches actuelles
  • … Qui permet de consulter le calendrier où sont notés les délais
  • … Qui permet de consulter l’avancement avec un contact de communication et de management
  • … Qui permet d’utiliser une carte de pointage numérique (pour les entreprises)

 

 

Modélisation/ Réalisation :

-PHP, WAMP, BDD, API

- Voir MCD Modèle Conceptuel de Données (UML, MERISE)

- HTML, CSS, Javascript

-Bootstrap

 

 

Mise en place des détails de l’étape un du projet :

Je chercherai à faire un login, un administrateur et puis une inscription.

J’ai décidé d’avoir recours pour la partie importation à un poppin ce qui se fait plus récemment et puis à un bouton d’exportation.

En ce qui concerne les détails du projet, j’utiliserai également un poppin avec une suite d’informations et non un tableau ou une liste.

Après réflexion je vois que je vais créer mon propre webservice et non utiliser un API externe.

Je vais partir sur un model MVC (comme utilisé par le TP Urban Marginal en Java).

Plus spécifiquement, le Modèle va gérer les données c’est-à-dire toutes les requêtes (insert, delete, update…) de la BDD.

Le Contrôleur lui aura pour but de formater et contiendra les méthodes et récupérera les données des Modèles. Le Contrôleur prendra aussi la place du Vue car il renverra et affichera les fonctions Json. Le fichier index.php servira de Vue.

En ce qui concerne le frontend on se servira du HTML, CSS et javascript.

J’ai décidé pour avoir une interface graphique agréable d’utiliser bootstrap

La Base de Données :

Dans mon BDD que j’ai nommé « gestion_projets » j’ai créé 5 tables :

 

Les attributs spécifiques de chaque table sont les suivants :

 

  1. account: id, name, surname, mail, password, phone, role, inscription_date
  2. mail: id, mail, account
  3. phone: id, phone, account
  4. project : id, name, description, path, author, downloadable, create_date
  5. role: id, name

 

 

  • Chaque fois qu’on met account comme attribut on sait que c’est qu’il se réfère au ID account de la table comme pour account dans la table mail et phone. C’est un moyen mnémotechnique.

 

  • On crée une table de liaison pour email et téléphone pour donner la possibilité à l’utilisateur d’enregistrer un ou plusieurs mails ou téléphones.

 

 

J’ai décidé de partir sur une programmation objet orientée pour ce projet. On aura donc à gérer des classes en php

 

La structure du WebService

 

Autoload.php

Le fichier autoload.php est là où on va mettre tous nos require c’est-à-dire nos bibliothèques du setup, controller et model.

On va également créer un deuxième autoload.php à la racine pour gérer le répertoire des classes, des controllers et des modèles

 

Répertoire extendable_classes

 

La classe controler

Dans notre répertoire extendable_classes on va d’abord créer une classe controler.

D’abord j’initialise une variable $method en privé (accessible que dans la classe) puis une variable $params en protected (accessible dans la classe et par classes filles).

Ensuite dans le constructeur de ma classe controler je mets en paramètres : $action, $params

Grâce à la méthode get_class() je récupère la classe courante que je mets dans une variable $current_class et puis grâce au méthode get_class_methods() je récupère toutes les méthodes de la classe courante que j’attribue à la variable $class_methods.

Après je fais un test pour vérifier si $action est dans la tableau de $class_methods. S’il y est, c’est que la méthode existe. Dans le cas contraire elle n’existe pas.  Si l’existence de la méthode a une valeur de $action, grâce à la méthode in_array() un booléen est renvoyé positivement. Si ce test marche je valorise mes propriétés. S’il ne marche pas je lance une exception.

Il faut bien distinguer $method qui est le paramètre de ma méthode et $action qui est le paramètre de mon URL. C’est conversion est explicite.

A un autre niveau c’est dans un objet qui hérite du contrôleur qu’on peut avec la méthode get_model récupérer les données des modèles.  Du coup dans la classe controller, une fonction protégée qu’on nomme get_model est créé. Dans cette méthode, après avoir initialisé la première lettre en majuscule on va faire un test. Si le fichier model directory existe il fait un require du directory et puis on crée une instance du $model sinon il lance une exception.

 

La classe setup

Cette classe va gérer les controlleurs mais ce n’est pas le controlleur

Dans le constructeur si le controlleur existe on la valorise pour en avoir accès dans le run et s’il n’existe pas on lance une exception.

Ensuite dans la méthode run, on récupère $action qu’on met dans une variable, $action. Après cela on enlève en mémoire les paramètres « controller » et « action » car on instancie le controlleur qui avec le $_GET affiche les paramètres sans l’action et le controller sans le paramètre de l’URL action.

 

Voilà une présentation de l’URL

 

 

 

 

Il faut préciser que dans le « controler » et dans le « setup » on trouve dans les deux une méthode run cependant le contenu est différent.

Le lien entre les deux est le suivant. Dans le run du setup on instancie le controlleur et puis on lance le run du controlleur qui lui a son tour lance la méthode du controlleur.

Dans l’index.php qui prends la place de mon main, je vais faire un echo du run() de ma class Setup.

 

 

  1. Le login

 

 

mysql.php

Je crée tout d’abord un répertoire que je nomme conf (configuration) puis à l’intérieur je crée un fichier mysql.php. Dans ce fichier je mes les informations de la base de donnée et que j’attribue à des variables. i.e. ‘host’, ‘user’ etc…

Conf.php

Je crée après cela un fichier Conf.php dans le répertoire extendable_classes. Dans la constructeur de la classe Conf j’inclue le require_once. Ensuite je crée une méthode get avec comme paramètre $key. Si la $key de conf existe je la retourne sinon je ne renvoie rien.

Ensuite j’ajoute le require_once dans la bibliothèque extendable_classes.

Classe LoginModel

Comme on sait le modèle gère les données, on crée d’abord la classe LoginModel qui est une classe fille de Model. On établit ici d’abord deux propriétés privées $mysql_conf et $mysql. Dans le constructeur de cette classe j’instancie la classe Conf que j’attribue à une variable mysql_conf. Ensuite je récupère les données du fichier de configuration con/mysql.php dans la propriété mysql_conf. Autrement dit je récupère les données de la base de données grâce à la méthode mysqli.

La première fonction qu’on crée c’est user_exists avec comme paramètres $email et $password. Dans cette fonction je compte le nombre de lignes avec ces informations grâce à la méthode query. Si le nombre de ligne est 0 je retourne false et si il est différent de 0 je retourne true. Comme j’utilise un count à ligne suivante j’utilise un fetch_row() que j’attribue à une variable $result. Comme le variable $result est un string et que je le compare à 0 il faut le transtyper dans un int.

La deuxième fonction dans cette classe est get_current_user avec les mêmes paramètres que user_exists. La fonction permet de récupérer les informations de l’utilisateur. La requête est la suivante :

$query = $this->mysql->query('SELECT id, name, surname, email, phone, role, inscription_date FROM account WHERE email="'.$email.'" AND password="'.$password.'"');

 

  • Il ne faut pas oublier de mettre les double quotes autour des simple quotes pour tester si $email et $password est un string sinon c’est considéré comme un int.

 

Ensuite on utilise un fetch_assoc() (renvoie une clé en forme de string) de cette requête qu’on attribue  à $user et enfin on retourne $user.

La troisième fonction s’appelle set_session et est là pour créer la session en valorisant le user. Une session pour rappel permet de garder une variable sur plusieurs endroits sans devoir les redéclarer à chaque fois. Ma fonction set_session est comparable à ma connexion.

La quatrième fonction s’appelle get_logged_user. Concrètement dans cette fonction si la session[‘user’] existe je retourne la session. Cela permet de ne pas remettre la session_start() à chaque fois.

Enfin la quatrième fonction de cette classe est delete_session qui supprime grâce à la fonction unset la session en mémoire.

 

Classe LoginController

Dans cette classe fille qui hérite de la classe Controller, j’initialise d’abord une propriété privée $model. Ensuite dans la constructeur qui prend en paramètres $action et $params je crée d’abord le lien avec le constructeur parent. Ensuite j’appelle le model Login (c’est-à-dire je récupère une instance du model qui s’appelle Login) grâce à ma fonction get_model que j’attribue à la propriété $model. Ceci sera donc une signature globale pour l’ensemble des fonctions de cette classe.

Ensuite je crée ma première fonction que j’appelle login. Dans cette fonction je fais un test. Dans ce test, si j’appelle sur mon objet model la fonction user_exists avec comme paramètres un getter sur le mail et le mot de passe, mon utilisateur courant existe alors je la récupère dans $user. Ensuite je transforme mon utilisateur en session et je la retourne.  Sinon pour le moment je retourne un tableau vide.

Ma deuxième fonction je la nomme disconnect et il retourne comme clé ‘success’ et comme valeur l’appel de la fonction delete_session sur mon objet model.

Ma troisième et dernière fonction je la nomme is_logged et il retourne comme clé ‘result’ et comme valeur l’appel de la fonction get_logged_user sur mon objet model.

Laisser un commentaire

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