10 - Live Coding : PHP Orienté Objet - Gestion des formulaires

Temps de lecture : 19 minutes environ.

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

10 - Live Coding : PHP Orienté Objet - Gestion des formulaires
Article publié le - Modifié le

Catégories : PHP Tutoriel Live-Coding poo

Mots-clés : Tutoriel Models MVC PHP Utilisateurs Live-Coding POO Formulaires objet forms

Partager : Partager sur Facebook Partager sur Twitter Partager sur LinkedIn