Sommaire
•	Partie I : Introduction
       1.  Introduction générale
           a.  Qu'est-ce que Scolar-help ?
           b.  Quel est son but concret ?
       2.  Description (rapide) des modules
           a.  Espace membre
           b.  News
           c.  Cours
           d.  Forum
           e.  Exercices
           f.  Quizs
        3.  Informations sur le codage
           a.  La convention
           b.  Le framework
•	Partie II : Espace membre
         1.  Introduction à l'espace membre
           2.  Description de la table sql membre_membre
           3.  Lib utilisé
           4.  Inscription
           5.  Connexion 
           6.  Mot de passe oublié
           7.  Profil
           8.  Modification du profil
•	Partie III : News
     1.  Introduction au système de news
     2.  Description de la table sql membre_news
     3.  Créer une news
     4.  Modifier une news
     5.  Supprimer une news
     6.  Envoyer une news en validation
     7.  Renvoyer en édition une news
     8.  Lire une news
     9.  Commenter une news
     10.  Aimer une news

PARTIE I : INTRODUCTION 

Introduction générale
Qu'est-ce que Scolar-help ?
Scolar-help est un site communautaire scolaire où l'on pourra retrouver des diverses cours variés que sa soit dans différentes matières comme la français, les mathématiques, la physique-chimie, etc. Les matières seront choisis en fonction du niveau scolaire du visiteur allant de la primaire au lycée mais on peut très bien aussi s'avancer, continuer à apprendre tout sa sur un seul site. D'autres modules qui pourront distraire tout en apprennant au visiteur avec des exercices avec les solutions, des quizs. Un système de news sera créer permettant de s'informer de l'actualité scolaire.
Quel est son but concret ?
Le but de Scolar-help est de permettre :
•	Aux élèves en difficulté : de pouvoir lire des cours en ligne si ils n'ont pas compris une matière spécifique en classe, de poser des questions sur le forum, de pratiquer les notions apprises lors d'un cours grâce aux exercices et aux quizs variés. et aux quizs.
•	Aux élèves doué : de continuer ou de pouvoir approfondir une matière dans différents niveaux, d'aider les autres personnes à l'aide du forum, créer des exercices, des quizs et même bien sûr, des cours.
Description des modules
Espace membre
Espace membre sert à gérer son profil principalement, avec un interface simple à utilisée, voici les fonctionnalités avec leur description assez précise  qui seront présentes dans cet interface de l'espace membre :
•	Inscription : Une inscription simple avec les champs suivants : pseudo, mot de passe, confirmation du mot de passe, email, question secrète et réponse secrète, catcha, newsletter et cgu.
•	Connexion : une connexion avec deux champs indispensables pseudo et mot de passe, un champs facultatif "se souvenir de moi" et un lien en cas d'oublie de mot de passe. Le visiteur à le droit à 3 tentatives sinon, il devra attendre 5 minutes par mesure de sécuriter.
•	Deconnexion : une deconnexion simple qui détruit tout l'array de la variable surperglobale $_SESSION.
•	Mot de passe oublié : la fonction de mot de passe oublié ce passe en plusieurs étape : la première étape consiste à entrer son pseudo et son adresse email, la seconde étape consiste à entrer la réponse de la question qui s'affiche, le visiteur à le droit à trois tentatives, si celle-ci échoue, il faudras attendre 5 minutes par mesure de sécurité.
•	Profil : un profil affichant par défault les informations suivantes : membre n°, le pseudo, l'avatar (par défaut si non modifier), l'email (si le visiteur a donner l'autorisation via la modification de son profil), inscrit le, dernière connexion le, le rang, la matière favoris, le niveau scolaire (entre autre la classe).
•	Modification de profil : comporte deux liens : un vers modification d'identifiants et l'autre modification des informations générales
•	Modification d'identifiants : comporte trois liens : modification du pseudo, modification de l'adresse email et modification du mot de passe.
•	Modification des informations générales : comporte les champs suivants : l'âge, le niveau scolaire, la newsletter, afficher l'email dans le profil et la matière favorite.
•	Modification du pseudo : un champs simple demandant le nouveau pseudo.
•	Modification du mot de passe : quatre champs : ancien mot de passe, nouveau mot de passe, confirmation du mot de passe et réponse secrète à la question afficher.
•	Modification de l'adresse email : trois champs : nouveau email, confirmation du nouveau email et mot de passe.
•	Liste des membres : sert à voir tout les membres du site avec un système de pagnation.
News
Les news de Scolar-help servent à s'informer de l'actualité scolaire et sûrement de l'actualité politique, d'hight-tech et d'informatique, donc voici les fonctionnalités du système de news :
•	Créer une news : comporte les champs suivants : le nom de la news, l'icône, catégorie, licence et contenu.
•	Modifier une news : permet de modifier une news en édition seulement
•	Supprimer une news : permet de supprimer définitivement une news
•	Valider une news : permet de valider une news et envoyer automatiquement un mp comme quoi une news vient d'être envoyer en validation aux validateurs et newsers.
•	Renvoyer en édition une news : permet de renvoyer une news en édition quand le statut de la news est soit en validation ou en publication.
•	Voir une news : permet de voir une news en édition (que l'auteur, les admins, les validateurs et les newsers peuvent voir la news seulement si ils ont le lien)
•	Poster un commentaire : permet de commenter une news
Cours
Les cours de Scolar-help sont faits comme dis plus haut, de sois essayer de comprendre ou s'avancer dans différentes matières, voici les fonctionnalités pour le système de cours :
•	Créer un cours : comporte les champs suivants : le nom du cours, l'icône, la catégorie, la licence, l'avancement, l'introduction et la conclusion.
•	Créer une sous-partie : permet de créer une sous-partie, comporte les champs suivants : le nom de la sous-partie et le contenu.
•	Modifier le cours : peremt de modifier l'introduction et/ou la conclusion.
•	Modifier une sous-partie : permet de modifier une sous-partie.
Informations sur le codage

La convention
La convention est un technique de codage permettant de mieux si retrouver, voici une liste d'informations sur la convention de ce projet :
•	Les variables : les variables ne commencent pas par un chiffre, si il y a plusieurs mots, séparé par une majuscule par exemple cours informatique va se noter en variable $coursInformatique.
•	Les constantes : les constantes sont toujours en majuscules, et sont séparées par un _ si il y a plusieurs mots dans le nom de la constante.
•	Les tables sql : elles ont toujours comme préfixe membre_ par exemple : membre_news correspond à la table sql news.
•	Les colonnes sql dans un table : elles ont toujours le préfixe du nom de la table, reprenos l'exemple de membre_news le nom principale est news donc une colonne de cette table pour l'auteur devient news_auteur.
•	Les bonnes pratiques : pensez à espacer votre code, commenter des points difficiles et/ou complexe, au début d'une fonction, une description courte et obligatoire.
        Le framework

        Scolar-help va utilisé le framework GCsystem conçu par fab@c++, voici pourquoi prendre le GCsystem :
•	Le framework à une architecture MVC
•	Le code est mieux structuré est organisé
•	De nombreuses class sont toutes prêtes pour faciliter le codage aux développeurs comme un bbcode, une class de moderation (insulte), etc
Le principe de ce framework ce base sur l'url, en effet, avec des rubriques et des actions. Une rubrique comporte plusieurs actions, un exemple : la rubrique membre va contenir comme actions : inscription, connexion, profil, etc.
                                                                                                                               
PARTIE II : ESPACE MEMBRE
Introduction à l'espace membre
L'espace membre va être un moyen au visiteur, de gérer tout ce qui est profil, compte, etc. L'inscription permet de s'enregistrer dans la bdd, ensuite il faudra se connecter, pour entrer dans la communauté de Scolar-help. Le mot de passe a été oublié ? Pas de problème ! Un système de mot de passe oublié est prévu pour envoyer un nouveau mot de passe à l'adresse email renseigner lors de l'inscription au site, il est donc important de spécifier l'email dans les cas où l'on peut oublier le mot de passe. On peut aussi voir si son camarade est inscrit sur le site, avec la liste des membres, il faut juste le pseudo est vous pourrez le retrouver ! On peut tout modifier dans l'espace membre : pseudo, mot de passe, email, newsletter, age, matiere favorite, niveau scolaire, vous avez donc de nombreux choix de modification. 
En résumé, l'espace membre va permettre au visiteur de démarrer dans la communauté.
Description de la table sql membre_membre
La table sql va permettre de stocker les données du visiteur, le pseudo, le mot de passe, etc. 
Voici la structure de la table sql, elle comporte X colonnes :
•	membre_id
•	membre_pseudo
•	membre_mdp
•	membre_email
•	membre_rang
•	membre_di
•	membre_dc
•	membre_matiere
•	membre_age
•	membre_avatar
•	membre_ip
Membre_id : correspond à l'id du membre, permettant d'effectuer des requêtes sql, il s'incrémente à chaque nouvelle entrée dans la table, il est de type int puisque c'est un nombre entier.
Membre_pseudo : correspond au pseudo du membre, permet d'identifier le membre, pour par exemple l'ajouter en amis, lui envoyer un message privé, etc. Le champs est de type VARCHAR avec une valeur de 255.
Membre_mdp : correspond au mot de passe du membre, sert à se connecter. Il est du même type que la colonne membre_pseudo.
Membre_email : correspond à l'adresse email du membre, sert lors d'un oublie de mot de passe et à la newsletter si celui-ci a cocher la case newsletter lors de l'inscription. Il est du même type que la colonne membre_pseudo.
Membre_aff_email : correspond à l'autorisation de l'email à afficher sur le profil, il est de type int.
Membre_rang : correspond au rang du membre, sert à savoir si le membre a accès à certaines parties du site comme l'administration, la modération, etc. Il est de type int car un numéro correspond à un rang, en voici la liste :
•	0 = Banni
•	1 = Membre
•	2 = Newser
•	3 = Modérateur 
•	4 = Ancien
•	5 = Validateur
•	6 = Administrateur
Membre_di : correspond à la date d'inscription du membre, sert à savoir quand le membre s'est inscrit sur le site. Il est de type bignit car c'est un timestamp.
Membre_dc : correspond à la date de dernière connexion du membre, sert à savoir quand le membre s'est connecter pour la dernière fois. Il est de même type que membre_di, entre autre de type bignit.
Membre_matiere : correspond à la matière favorite du membre, sert à savoir quel est la matière sa matière préférée pour pouvoir suggéré des topics où des membres réclament de l'aide dans sa matière préférée avec un niveau scolaire égal au posteur. Il est de type varchar est sa valeur est de 255.
Membre_ecole : correspond au nom de l'école du membre, sert à savoir si son camarade ou un élève de la même école s'est inscrit sur Scolar-help. Il est de type varchar est sa valeur est de 255.
Membre_age : correspond à l'âge du visiteur, sert à quel est l'âge du visiteur et l'afficher ou non, dans son profil. Il est de type int puisque c'est un membre.
Membre_avatar : correspond au nom de l'avatar stocké dans le dossier upload/image, sert à afficher l'avatar du membre dans son profil, dans le forum dès qu'il poste, dans un mp, etc. Il est de type varchar est sa valeur est de 255 puisque cette colonne correspond au nom de l'avatar du membre.
Membre_genre : correspond au sexe du membre soit masculin soit féminin.
Membre_ip : correspond à l'adresse ip du membre, sert à au système de sécurité, par exemple au brute-force, au bannissement permanent, etc. Il est de type varchar et sa valeur de 255. Il n'est pas de type int car une adresse ip comporte des points (.).

Lib utilisée
Scolar-help utilise plusieurs lib php. Pour les formulaire, au lieu de les écrire en html ce qui fait moche avec du code php, on utilise la lib formsgc qui va généré les formulaires, codé par fab@c++ de même pour la validation, trop de condition, donc on utilise formsgcValidator, qui se couple avec formsgc.
Cette partie est assez cours mais c'est comme même une petite source d'information indispensable, il n'y a pas encore de tuto sur cette lib dommage, mais voici quelques liens utiles : pour formsgc -> http://www.legeekcafe.com/forum-sujet-589-formsgc--formsgenerator.html et pour formsgcValidator -> http://www.legeekcafe.com/forum-sujet-592-formsgcvalidator--forms-validator.html topic assez intuitif et permet les bases de formsgc donc utile.
Inscription
L'inscription va être la page qui permet au membre de s'enregistrer dans la base de données, mais attention, pas n'importe comment, on doit vérifier si tous les champs sont remplies, que l'adresse email a un format correct, etc.
Un petit rappel, la page d'inscription comporte les champs suivants : 
•	Le pseudo
•	Le mot de passe
•	La confirmation du mot de passe
•	L'email
•	La question secrète
•	La réponse secrète
•	Une captcha
•	Une case newsletter (facultatif)
•	Une case CGU (conditions générales d'utilisation)
Tout ces champs devront être répartis dans des fieldset, les-voici :
•	Identifiants : le champs pseudo, mot de passe et email.
•	Question secrète : la question secrète et la réponse secrète.
•	Captcha : une image de la captcha et un champ pour recopié la captcha 
•	Plus : une case newsletter et cgu.
Chaque champs devra être précédé d'un label.
Détaillons les champs de l'inscription plus précisément :
•	Le pseudo : un input de type text avec valeur pour l'attribut name "pseudo".
•	Le mot de passe : un input de type password avec comme valeur pour l'attribut name, "mdp".
•	La confirmation du mot de passe : un input de type password avec la valeur "mdp_conf" dans l'attribut name.
•	L'email : un input de type email avec comme valeur dans l'attribut name "email".
•	La question secrète : un select avec la valeur "question" dans l'attribut name.
•	La réponse secrète : un input de type text avec un attribut name comme valeur "reponse".
•	Une captcha : une image pointant vers la page captcha.html
•	Une case newsletter : un input de type radio avec la valeur "newsletter"  dans l'attribut name.
•	Une case CGU : un input de type radio avec la valeur "cgu" dans l'attribut name.
Pour la validation, voici les étapes à faire pour chaque champs :
•	Le pseudo : vérifier si celui-ci : contient entre 3 et 20 caractères, si le pseudo est disponible (n'est pas dans la base de donnée) et que le pseudo ne contient pas d'espace au début.
•	Le mot de passe : vérifier si il correspond à la confirmation du mot de passe.
•	L'email : vérifier si il a un format correct et qu'il n'est pas déjà associé à un compte.
•	La captcha : vérifier si elle corresponde à l'image généré.
•	CGU : vérifier si ce champs existe sinon, c'est que la case n'est pas cochée donc le membre ne peut pas s'enregistrer.
Bien sûr, la validation principale avant tout et de vérifier si tous les champs on était remplie a part la case facultatif : newsletter.
Note : La méthode de cryptage pour le mot de passe et la question secrète et un sha1 entouré par un strrev.
Si tout est bon, le visiteur s'enregistra dans la bdd à l'aide d'une requête sql (insert into) est un message de bienvenue lui incitera à se connecter !
Connexion
La connexion va servir à s'identifier pour entrer dans la communauté et avoir accès aux fonctionnalités pour les membres.
Le système de connexion est très simple, deux champs entouré d'un fieldset avec la legend "Identifiants" :
•	Pseudo : le membre doit entrer son pseudo qui l'a choisi lors de son inscription.
•	Mot de passe : le membre doit entrer son mot de passe choisi lors de l'inscription.
Comme l'inscription, chaque champs doit avoir un label, détaillons la création des champs :
•	Le champs pseudo : un input de type text avec pseudo comme valeur pour l'attribut name.
•	Le champs mot de passe : un input de type password avec mdp comme valeur pour l'attribut name.
La validation est hyper simple, puisqu'on a rien besoin de vérifier au niveau de comment l'utilisateur a écrit, on a juste besoin de vérifier :
•	Si tous les champs sont bien remplis.
•	Si le pseudo est le mot de passe sont dans la BDD.
Tout est bon ? Vous devez ensuite créer trois sessions :
•	$_SESSION['membre_id'] : correspond à l'id du membre.
•	$_SESSION['membre_pseudo'] : correspond au pseudo du membre.
•	$_SESSION['membre_rang'] : correspond au rang du membre.
Ensuite, il y aura un message du genre "Vous êtes connecté pseudo !"; et le membre sera rediriger vers le fichier index.php soit la page d'accueil.
Mot de passe oublié
Le système de mot de passe oublié va être un petit peu plus complexe que l'inscription et la connexion. En effet, ce dernier va se dérouler en deux étapes, donc pour faire ce système en une fonction, on va utiliser un switch qui teste la variable $statut_mdp en deux valeurs :
•	Etape 1 : le visiteur doit entrer son pseudo est son adresse email.
•	Etape 2 : le visiteur doit répondre à la question affiché choisi lors de son inscription.
Etape 1
Pour rappel, l'étape 1 va générer un formulaire de deux champs : pseudo et email.
Detaillons ces champs tout comme l'inscription et la connexion :
•	Pseudo : un input de type text avec l'attribut name comme valeur "pseudo".
•	Email : un input de type email avec la valeur "email" dans l'attribut name.
Pour la validation, il faut vérifier si le pseudo est dans la bdd (à l'aide d'une requête sql), que l'email a un format correct et qu'il correspond au pseudo dans la bdd. Si c'est incorrect, un message d'erreur devra s'affcher.
Etape 2
A l'étape 2, on va afficher la question secrète du membre pour qu'il y réponde. Le membre à le droit à 3 tentatives, sinon il doit patienter 5 minutes par mesure de securiter.
Note : le champs réponse a un label, est un input de type text avec l'attribut name comme valeur "reponse". Tout sa entouré bien sûr d'un fieldset dont la legend est "Question secrète".
Ensuite, générer un nouveau mot de passe, et dite le à l'utilisateur !
Profil
Voir le profil d'un membre peut être très utile, pour regarder si le membre est dans la même école que moi, etc. 
Dans le profil pour rappel, nous allons afficher les informations suivantes :
•	Le n° du membre
•	Le pseudo
•	L'email (si autorisé)
•	Le rang
•	La matière favorite
•	L'école
•	L'âge
•	Son avatar
•	La date d'inscription
•	La date de dernière connexion
Toutes ces infos entourés d'un fieldset dont la legend est Profil de "pseudo".
Pour récupérer ses informations, il faut faire une requête sql avec l'id du membre qui est dans l'url, il faut donc le récupérer et le mettre dans la requête sql préparée. Les informations seront dans une liste à puce. Si l'id du profil demandé correspond à la session membre_id, il faut affiché un bouton "Modifier mon profil" ce qui ménera à la page modif-profil.html .
Modification du profil
La modification de profil est un moyen de modifier ses informations dans la bdd, que ce soit le pseudo, l'email, l'âge, etc.
Donc on va avoir plusieurs fonctionnalités, je vais les lister :
•	Modifier son pseudo
•	Modifier son mot de passe
•	Modifier son adresse email
•	Modifier ses informations générales
Les fonctionnalités suivantes : modifier son pseudo, mot de passe et email fonctionne sur une seul page avec un système d'onglet en javascript.
Je vais toutes les détaillers, une par une.
Modifier son pseudo
Fonction simple, un fieldset dont la legend est "Modifier mon pseudo", deux champs :
•	Nouveau  pseudo : un input de type text dont l'attribut name vaut "nouv_pseudo".
•	Confirmation du nouveau pseudo : un input de type text dont l'attribut name vaut "conf_nouv_pseudo".
Il faut ensuite vérifier :
•	Si tous les champs sont remplis à l'aide de la fonction isset.
•	Le nouveau pseudo est différent du pseudo actuel à l'aide de la session membre_pseudo.
•	Les deux pseudos sont identiques à l'aide d'un condition.
•	Si le pseudo est disponible avec une requête sql.
•	Si le pseudo contient entre 3 et 20 caractères à l'aide de la fonction strlen.
Tout est bon ? Il faut faire une requête sql (update) qui change l'ancien pseudo de la bdd. Après, il faut inviter l'utilisateur à se deconnecter pour mettre les sessions à jour donc avec le nouveau pseudo.
Modifier son mot de passe
Modifier son mot de passe peut être utile si on pense que son mot de passe est trop facile à deviner.
Le formulaire sera entouré d'un fieldset dont la legend est "Modifier mon mot de passe", voici les champs :
•	Ancien mot de passe : un input de type password dont l'attribut name vaut "ancien_mdp".
•	Nouveau mot de passe : un input de type password dont l'attribut name vaut "nouv_mdp".
•	Confirmation du nouveau mot de passe : un input de type password dont l'attribut name vaut "conf_nouv_mdp".
Il faut ensuite vérifier au traitement :
•	Si tous les champs sont remplis à l'aide de la fonction isset.
•	Si l'ancien mot de passe correspond à celui dans la bdd (crypté) avec une condition.
•	Si le nouveau mot de passe correspond à celui dans le champs de confirmation à l'aide d'une condition.
Si tout est correct, même chose que le pseudo, fait une requête sql (update) pour modifier le mot de passe actuel de la bdd (crypté) et il faut dire à l'utilisateur que tout est bon.
Modifier mon email
Si on a perdu son email, on est confronté à le changer sur tous les sites où on c'est inscrit avec celle-ci, une fonction "modifier mon email" peut donc être utile.
Le formulaire de modification d'email sera entouré d'un fieldset dont la legend est "Modifier mon email", voici ce que va contenir le formulaire : 
•	Nouveau email : un input de type email avec l'attribut name qui vaut "nouv_email".
•	Confirmation du nouveau email : un input de type email dont l'attribut name 
Il faut ensuite vérifier : 
•	Si tous les champs sont remplis à l'aide de la fonction isset.
•	Si le nouveau email a un format correct.
•	Si les adresses emails correspondent à l'aide d'une condition.
Après, si tout est bon, vous pouvez executer la requête sql.
Modifier mes informations générales
Cette page contient 2 onglets : profil et avatar.
Commençons par détaillé l'onglet profil :
Il aura plusieurs champs mais ce que l'on veut modifier se modifiera par exemple si je veut modifier mon âge, seulement mon âge sera modifier les autres champs ne sont pas obligatoire, pour voir si le champs a été modifier, une condition devra être effectué, voici comment elle se traduirai : "Si le champs âge et différent à celui de la bdd, alors modifie-le".
Le principe partira de là, on va juste lister les champs :
•	La matiere favorite du membre : une liste déroulante.
•	L'école du membre : un input de type text.
•	Afficher l'email dans le profil : une case à cocher.
•	Age : une liste déroulante générer à l'aide d'une boucle.
•	Newsletter : une case à cocher.
•	Genre : une liste déroulante.
Pour la validation, il n'y a rien a vérifier.
Passons à l'avatar, il y a 3 onglets dans cet onglet :
•	Depuis une url : affiche un input de type text.
•	Depuis mon ordinateur : affiche un input de type file.
•	Depuis mon email (gravatar) : affiche un input de type email.
Pour la validation, si le membre à choisi "Depuis une url", il faut vérifier à l'aide d'une regex que c'est bien une url ou si le membre a choise "Depuis mon email (gravatar)", il faut vérifier à l'aide d'une regex que le format de l'email est bien exact.
PARTIE III : News
Introduction au système des news
Le système des news va permettre aux membres de s'informer de l'actualité scolaire, politique, hight-tech, etc il faut beaucoup varié dans les news. Pour rester régulier, une ou deux news par jour devront être écrite pour ne pas perdre le système c'ets-à-dire l'avoir créer que pour faire 1 news par semaine ce qui remplirai la base de donné à rien. Mais au fond, dans une news on l'a consulte, on l'a commente si on veut dire son avis ? Oui, j'ai donc pensé à mettre un système de débat, pour que chaque membre poste ce qu'il a à dire. Dans une news, on peut toujours l'adhérer c'est-à-dire l'aimé ou pas.
Description de la table sql membre_news
La table sql membre_news, va permettre de stocker le nom de l'auteur de la news, la date de la news, le contenu, etc.
Voici tout les champs de la table membre_news :
•	news_id
•	news_auteur
•	news_contenu
•	news_date
•	news_aime
•	news_statut
Détaillons chaque champs :
•	News_id : correspond à l'id de la news, mysql l'increment automatiquement donc elle est de type int auto_increment.
•	News_auteur : correspond à l'id du membre qui a posté la news, il est de type int.
•	News_contenu : correspond au contenu de la news, il est de type text puisqu'il y a beaucoup de contenu.
•	News_date : correspond à la daye de création de la news, il est de type bignit.
•	News_aime : correspond au nombre de personne qui aime la news, il est de type int.
•	News_statut : correspond au statut de la news, chaque statut correspond à un numéro, en voici la liste : 
1.	1 = en edition
2.	2 = en validation
3.	3 = refusé