Live Coding : PHP Orienté Objet - Gestion des formulaires

29 mai 2020 - : PHP Tutoriel Live-Coding - : 0 commentaire - Tutoriel Models MVC PHP Utilisateurs Live-Coding

Visualisez les fichiers de cette série sur GitHub

Dernière modification le 29 mai 2020

Dans la partie précédente nous avons créé une classe permettant de générer un formulaire et de l'afficher dans une vue.

Nous allons maintenant voir comment traiter ce formulaire et le lier à nos différents modèles.

Nous prendrons l'exemple, dans un premier temps, de l'inscription et la connexion d'un utilisateur ainsi que l'ouverture de sa session.

Avant toute chose, nous allons apporter des modifications à notre classe "Model" qui a une restriction trop importante sur la méthode "hydrate" que nous pourrions utiliser avec des tableaux ou des objets ainsi que dans les méthodes "create" et "update".

Nous allons donc retirer la mention "array" dans la déclaration de la méthode "hydrate"

public function hydrate($donnees)

 Et retirer les paramètres des méthodes "create" et "update" ainsi que modifier certaines de leurs lignes (ci-dessous) pour profiter de l'hydratation.

// Ci dessous les lignes modifiées uniquement

// Nous retirons le $model des paramètres
public function create()
{
    //.....

    // On boucle pour éclater le tableau
    foreach ($this as $champ => $valeur) {
        //.....
    }

    //.....
}

// Nous retirons tous les paramètres
public function update()
{
    //.....

    // On boucle pour éclater le tableau
    foreach ($this as $champ => $valeur) {
        //.....
    }
    $valeurs[] = $this->id;

    //.....
}

Ceci étant fait, nous allons également modifier le modèle pour les utilisateurs "UsersModel" pour pouvoir récupérer un utilisateur en base de données depuis son adresse e-mail. En effet, notre formulaire de connexion se basera sur l'adresse e-mail pour connecter l'utilisateur

/**
 * Récupérer un user à partir de son e-mail
 * @param string $email 
 * @return mixed 
 */
public function findOneByEmail(string $email)
{
    return $this->requete("SELECT * FROM {$this->table} WHERE email = ?", [$email])->fetch();
}

Inscription de l'utilisateur

Pour pouvoir s'inscrire, notre utilisateur aura besoin d'un formulaire.

Il va de soi que nous aurons besoin d'un formulaire permettant d'insérer toutes les informations utiles dans la base.

Nous allons mettre en place la logique de fonctionnement, il conviendra, par exemple, de doubler les champs pour vérifier les erreurs et de contrôler d'autres éléments.

Dans le contrôleur, nous mettrons tout d'abord en place la méthode qui permettra de créer notre route, appelons la "register"

public function register(){

}

Cette méthode fera deux choses :

  • Générer le formulaire et l'envoyer à la vue
  • Traiter le formulaire si il a été posté

Création du formulaire

Au moyen de notre classe "Form" nous allons générer un formulaire simple d'inscription

$form = new Form;

$form->debutForm()
    ->ajoutLabelFor('email', 'E-mail :')
    ->ajoutInput('email', 'email', ['class' => 'form-control', 'id' => 'email'])
    ->ajoutLabelFor('pass', 'Mot de passe :')
    ->ajoutInput('password', 'password', ['id' => 'pass', 'class' => 'form-control'])
    ->ajoutBouton('M\'inscrire', ['class' => 'btn btn-primary'])
    ->finForm();

Ensuite, nous allons l'envoyer à la vue

$this->render('users/register', ['registerForm' => $form->create()]);

La vue

Dans la vue, le code sera aussi court que pour la connexion

<h1>Inscription</h1>
<?= $registerForm ?>

Traitement du formulaire

Une fois le formulaire créé, nous allons traiter son envoi par l'utilisateur.

Ce traitement sera placé au début de la méthode "register" pour pouvoir éventuellement par la suite afficher des messages d'erreur.

Nous allons, pour commencer, vérifier si le formulaire est valide au moyen de la méthode "validate"

// On vérifie si notre post contient les champs email et password
if(Form::validate($_POST, ['email', 'password'])){

}

Dans ce if, nous allons ensuite "nettoyer" ce qui a été écrit dans l'e-mail pour éviter les failles XSS et nous allons chiffrer le mot de passe

// On nettoie l'e-mail et on chiffre le mot de passe
$email = strip_tags($_POST['email']);
$pass = password_hash($_POST['password'], PASSWORD_ARGON2I);

Les données sont prêtes, nous allons pouvoir créer notre utilisateur.

$user = new UsersModel;
$user->setEmail($email)
    ->setPassword($pass);
$user->create();

Voilà notre utilisateur inscrit. Une petite redirection vers l'accueil ou la page de connexion suffira.

Connexion de l'utilisateur

Dans la partie précédente nous avions créé la partie formulaire de connexion.

Il nous suffira donc, dans la méthode "login", d'ajouter le traitement du formulaire qui vérifiera :

  • Que l'utilisateur existe
  • Que le mot de passe fourni est le bon

Ensuite nous ouvrirons la session.

Préparation de la session

Nous allons utiliser la session PHP pour conserver la connexion de l'utilisateur.

Pour ce faire, nous allons ajouter une ligne dans notre méthode "start" de la classe "Main", en toute première ligne

session_start();

Nous allons également ajouter une méthode "setSession" dans le "UsersModel" qui permettra d'ajouter une session rapidement

public function setSession(){
    $_SESSION['user'] = [
        'id' => $this->id,
        'email' => $this->email
    ];
}

Traitement du formulaire

Comme pour l'inscription, nous allons, tout d'abord, vérifier si notre formulaire est complet

if(Form::validate($_POST, ['email', 'password'])){

}

Ensuite, nous allons chercher l'utilisateur dans la base de données au moyen de la méthode "findOneByEmail" écrite plus haut.

$userModel = new UsersModel;
$userArray = $userModel->findOneByEmail(strip_tags($_POST['email']));

Il conviendra de vérifier si un a effectivement un utilisateur avant de procéder à la vérification du mot de passe, et si il est bon, ouvrir la session

if(!$userArray){
    http_response_code(404);
    header('Location: /');
    exit;
}

$user = $userModel->hydrate($userArray);

if(password_verify($_POST['password'], $user->getPassword())){
    $user->setSession();
}

La déconnexion

La méthode de déconnexion de l'utilisateur sera assez simple, elle effacera le contenu de la partie 'user' de $_SESSION et redirigera l'utilisateur vers la page d'où il vient

/**
 * Déconnexion de l'utilisateur
 * @return exit 
 */
public function logout(){
    unset($_SESSION['user']);
    header('Location: '. $_SERVER['HTTP_REFERER']);
    exit;
}

Obtenir de l'aide

Pour obtenir de l'aide, vous pouvez accéder au serveur Discord pour une entraide par chat

Visualisez les fichiers de cette série sur GitHub

Partager

Partager sur Facebook Partager sur Twitter Partager sur LinkedIn

Commentaires

Ecrire un commentaire

Pas encore de commentaire

Ecrire un commentaire