Dans cet épisode 2 nous allons continuer à gérer nos formulaire en mettant en place la gestion des annonces par les utilisateurs.
Nous allons créer les pages qui permettront d'ajouter et modifier les annonces.
Modification de la base de données
Avant toute chose, modification de la base de données et du modèle "AnnoncesModel" qui lui est lié.
Nous allons mettre en place une relation entre la table "users" et la table "annonces" (voir la vidéo si vous ne savez pas comment faire)

Une fois la base de données modifiée, nous allons modifier notre modèle "AnnoncesModel" en y ajoutant les informations suivantes
protected $users_id;
/**
* Get the value of users_id
*/
public function getUsers_id():int
{
return $this->users_id;
}
/**
* Set the value of users_id
*
* @return self
*/
public function setUsers_id(int $users_id):self
{
$this->users_id = $users_id;
return $this;
}
Page d'ajout d'annonce
Nous allons créer une page permettant d'ajouter une annonce en vérifiant que l'utilisateur a le droit d'y accéder (il doit être connecté), puis mettre en place le traitement correspondant.
Dans notre exemple, l'annonce reste très simple, vous pourrez ajouter tous les champs nécessaires.
Créer le formulaire
Nous nous rendons dans le contrôleur "AnnoncesController" et ajoutons une méthode "ajouter" ce qui nous permettra d'avoir une route "/annonces/ajouter"
public function ajouter(){
}
Dans cette méthode, la 1ère chose que nous ferons est d'ajouter une condition vérifiant si l'utilisateur est connecté, dans le cas contraire il sera redirigé vers la page de connexion.
// On vérifie si la session contient les informations d'un utilisateur
if(isset($_SESSION['user']) && !empty($_SESSION['user']['id'])){
}else{
$_SESSION['erreur'] = "Vous devez vous connecter pour ajouter une annonce";
header('Location: /users/login');
exit;
}
Nous allons ensuite créer notre formulaire au moyen de la classe "Form" et l'envoyer à notre vue
$form = new Form;
$form->debutForm()
->ajoutLabelFor('titre', 'Titre de l\'annonce :')
->ajoutInput('text', 'titre', ['class' => 'form-control'])
->ajoutLabelFor('description', 'Description')
->ajoutTextarea('description', '', ['class' => 'form-control'])
->ajoutBouton('Valider', ['class' => 'btn btn-primary'])
;
$this->render('annonces/ajouter', ['form' => $form->create()]);
Enfin, nous afficherons le formulaire dans la vue "annonces/ajouter.php"
<h1>Ajouter une annonce</h1>
<?= $form ?>
Traiter le formulaire
Une fois le formulaire rempli par l'utilisateur, nous allons donc devoir le traiter.
Pour enregistrer une annonce il faut :
- Un formulaire rempli
- Un utilisateur connecté
Nous allons donc tout d'abord vérifier que le formulaire est rempli
if(Form::validate($_POST, ['titre', 'description'])){
}
Ensuite, nous allons récupérer et "nettoyer" les données. Pour nous protéger contre les failles XSS, nous allons retirer toutes les balises HTML éventuelles. Vous choisirez le cas qui vous convient le mieux.
$titre = strip_tags($_POST['titre']);
$description = strip_tags($_POST['description']);
Enfin, nous hydratons notre objet avec les informations reçues, sans oublier d'ajouter l'utilisateur, puis on crée l'annonce.
// On instancie le modèle
$annonce = new AnnoncesModel;
// On hydrate
$annonce->setTitre($titre)
->setDescription($description)
->setUsers_id($_SESSION['user']['id'])
;
// On enregistre
$annonce->create();
Vous n'oublierez pas de rediriger l'utilisateur vers la page de votre choix
Page de modification d'annonce
Nous allons maintenant créer la page permettant de modifier une annonce en vérifiant que l'utilisateur a le droit d'y accéder (il doit être connecté), en est le propriétaire, puis mettre en place le traitement correspondant.
Créer le formulaire
Nous nous rendons dans le contrôleur "AnnoncesController" et ajoutons une méthode "modifier" qui prendra un paramètre "id" ce qui nous permettra d'avoir une route "/annonces/modifier/2"
public function modifier(){
}
Dans cette méthode, la 1ère chose que nous ferons est d'ajouter une condition vérifiant si l'utilisateur est connecté, dans le cas contraire il sera redirigé vers la page de connexion.
// On vérifie si la session contient les informations d'un utilisateur
if(isset($_SESSION['user']) && !empty($_SESSION['user']['id'])){
}else{
$_SESSION['erreur'] = "Vous devez vous connecter pour ajouter une annonce";
header('Location: /users/login');
exit;
}
Ensuite, nous vérifierons si l'annonce demandée existe
// On instancie le modèle
$annonceModel = new AnnoncesModel;
// On cherche l'annonce avec cet id
$annonce = $annonceModel->find($id);
// Si l'annonce n'existe pas, retour à l'accueil
if (!$annonce) {
http_response_code(404);
header('Location: /');
exit;
}
Nous vérifions ensuite si l'utilisateur est propriétaire de l'annonce
if($annonce->users_id !== $_SESSION['user']['id']){
http_response_code(404);
header('Location: /');
exit;
}
Nous allons ensuite créer notre formulaire au moyen de la classe "Form", y insérer les valeurs et l'envoyer à notre vue
$form = new Form;
$form->debutForm()
->ajoutLabelFor('titre', 'Titre de l\'annonce :')
->ajoutInput('text', 'titre', ['class' => 'form-control', 'value' => $annonce->titre])
->ajoutLabelFor('description', 'Description')
->ajoutTextarea('description', $annonce->description, ['class' => 'form-control'])
->ajoutBouton('Valider', ['class' => 'btn btn-primary']);
$this->render('annonces/modifier', ['form' => $form->create()]);
Enfin, nous afficherons le formulaire dans la vue "annonces/modifier.php"
<h1>Modifier une annonce</h1>
<?= $form ?>
Traiter le formulaire
Une fois le formulaire rempli par l'utilisateur, nous allons le traiter de la même façon que pour l'ajout, à la différence que nous devrons lui passer l'id de l'annonce mais pas l'utilisateur.
Nous allons donc tout d'abord vérifier que le formulaire est rempli
if(Form::validate($_POST, ['titre', 'description'])){
}
Ensuite, nous allons récupérer et "nettoyer" les données. Pour nous protéger contre les failles XSS, nous allons retirer toutes les balises HTML éventuelles. Vous choisirez le cas qui vous convient le mieux.
$titre = strip_tags($_POST['titre']);
$description = strip_tags($_POST['description']);
Enfin, nous hydratons notre objet avec les informations reçues, sans oublier d'ajouter l'utilisateur, puis on crée l'annonce.
// On instancie le modèle
$annonceModif = new AnnoncesModel;
// On hydrate
$annonceModif->setId($annonce->id)
->setTitre($titre)
->setDescription($description);
// On enregistre
$annonceModif->update();
Vous n'oublierez pas de rediriger l'utilisateur vers la page de votre choix
Et voilà la gestion des annonces qui est terminée.
Obtenir de l'aide
Pour obtenir de l'aide, vous pouvez accéder au serveur Discord pour une entraide par chat