1 PHP Application Site de Bières avec authentification

Nous allons poursuivre notre utilisation du framework Laravel pour mettre en place le mécanisme d’authentification proposé par Laravel. Certaines utilisations et fonctions disponibles dans l’application seront conditionnées par une demande d’identification et d’authentification.

1.1 Présentation du TP

Le TP aura pour but de faire une présentation en ligne d’un catalogue de bières que les utilisateurs pourront découvrir, noter et commenter. Les utilisateurs pourront aussi ajouter de nouvelles bières.

1.2 Mise en place du contexte de développement

Nous allons avoir besoin d’un outil de développement (IDE) qui va accélérer notre production de code.
L’utilisation de PHPStorm n’est pas obligatoire, mais les enseignants utiliseront ce logiciel pour illustrer leurs propos pendant les séances de TPs.

1.2.1 A l’aide de la commande laravel :

Dans ce cas il faut dans un premier temps ajouter la commande laravel dans votre environnement personnel (à faire une fois).

composer global require "laravel/installer"

puis ajouter la commande dans votre PATH à l’aide de la commande :

export PATH=$HOME/.composer/vendor/bin:$PATH

Si vous ne voulez pas le faire à chaque fois que vous ouvrez un terminal, il faut ajouter la commande précédente dans votre fichier ~/.bashrc.

La commande laravel est maintenant disponible. Pour créer un nouveau projet Laravel, il faut utiliser la commande

laravel new tp_bieres

1.2.2 L’archive disponible

Si le réseau ne supporte pas la charge, demandez à l’enseignant de vous fournir l’archive de départ. Après l’avoir décompressée, vous avez un répertoire qui contient le même résultat que celui obtenu à l’aide des commandes précédentes.

Déplacez vous dans le répertoire créé et tapez la commande suivante :

Rappels:

  • A chaque modification du fichier de configuration .env, il est nécessaire de relancer le serveur pour que la modification soit prise en compte.

  • Si composer ne fonctionne pas sur votre machine, il faut récupérer composer.phar à l’aide de la commande suivante

       cd racine/de/votre/projet
       curl -sS https://getcomposer.org/installer | php
  • Si des classes sont ajoutées dans un nouveau namespace, il peut être utile de ré-initialiser l’autoloader
       composer dump-autoload (php composer.phar dump-autoload)

1.2.3 Lancer un serveur web pour visualiser le travail en cours

Le répertoire tp_bieres contient votre application créée à l’aide du framework Laravel. Sans aucune intervention supplémentaire, vous pouvez tester votre application à l’aide de la commande suivante.

 cd /le/chemin/de/tp_bieres
 php artisan serve
 

qui vous place dans le répertoire racine de votre application web. La commande php artisan serve lance un serveur web qui écoute sur le port 8000 par défaut. Il va permettre de tester le résultat de votre développement. Vous pouvez tester que l’initialisation de votre projet est correcte en tapant l’URL http://localhost:8000 dans votre navigateur.

La commande php artisan sera très souvent utilisée lancez la commande php artisan pour connaitre les options possibles

1.3 Validation de l’authentification

Pour la suite du TP, nous allons valider les mécanismes d’authentification. Laravel propose une commande qui valide les mécanismes d’authentification par défaut.

php artisan make:auth

Cette commande réalise les modifications suivantes :

  • ajoute la page login,
  • ajoute la page inscription (register),
  • modifie page racine avec ajout des liens vers les deux pages précédentes,
  • ajoute des règles de routage dans le fichier routes/web.php,
  • Valide les contrôles d’accès.

Mettre en place l’authentification

Tester votre application

1.4 Le modèle d’information

Nous allons générer les tables et y placer des données de manière automatique. Pour cela nous allons utiliser les outils mis à disposition par Laravel.

1.4.1 La connexion avec la base de données

Comme dans le TP précédent, vous devez modifier le fichier .env à la racine de votre projet pour connecter votre application avec une base de données.

Le fichier de configuration .env permet en particulier de spécifier

  • le système de gestion de base de données (mysql, pgsql, …)
  • le nom de la base de données
  • l’identifiant de l’utilisateur
  • le mot de passe de l’utilisateur

Voici un extrait du fichier .env qui concerne les informations de connexion avec un SGBD :

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=lar_bieres
DB_USERNAME=duchmol
DB_PASSWORD=secret

1.4.2 La création des classes modèle

  • La création et les données de la table bieres peuvent être récupérer à partir de l’archive bieres.sql.zip qu’il faudra décompresser avant de l’utiliser.

    A l’aide de votre client SQL vous allez exécuter le fichier bieres.sql. Le résultat ajoute un catalogue de bières belges et françaises dans une table bieres de votre base de données. Pour chacune des bières on allouera aléatoirement un utilisateur lorsque ceux-ci auront été créés.

    Il faut aussi créer la classe modèle à l’aide de la commande :

    ``` 
    php artisan make:model Biere
    ```
  • Pour les autres tables

    Nous allons utiliser les commandes proposées par Laravel pour optimiser la création des tables et ajouter des données dans les tables. Pour chaque table nous allons :
    1. Créer une classe modèle

      php artisan make:model Commentaire

      qui crée un fichier Commentaire.php dans le répertoire app de votre projet.

    2. Créer un script de création de la table dans la base de données.

      Le script doit spécifier les colonnes (nom, type) de la table à créer.

      php artisan make:migration  create_commentaires_table

      qui crée un fichier xxx_create_commentaires_table.php avec xxx une datation de la création du fichier.

    3. Créer un fichier contenant une fonction qui fabrique un enregistrement qui sera ajouté dans la table.

      Ce fichier sera placé dans le répertoire database/factories de votre projet

    4. Créer une classe qui va déclencher la création des enregistrements de la classe modèle dans la table de la base de données

      php artisan make:seeder  CommentairesTableSeeder

      qui crée un fichier CommentairesTableSeeder.php dans le répertoire database/seeds

1.4.2.1 La table User

La classe modèle User existe déjà dans le répertoire app ainsi que le script xxx_create_users_table.php dans le répertoire database/migration et le fichier UserFactory.php dans le répertoire database/factories.

Nous allons légèrement modifier le fichier xxx_create_users_table.php en ajoutant la ligne :

le fichier UserFactory.php nous allons ajouter la ligne

et le fichier de la classe modèle User.php

Lors de la phase d’enregistrement, nous aurons besoin de donner une valeur par défaut. Pour cela nous allons modifier le fichier app/Http/Controllers/Auth/RegisterController.php et ajouter dans la fonction create() la ligne

Cela nous permettra d’associer une image à chaque utilisateur.

Pour créer plusieurs utilisateurs, nous allons créer la classe UsersTableSeeder dans le fichier UsersTableSeeder à l’aide de la commande

php artisan make:seeder  UsersTableSeeder

Puis remplacer le code de la fonction run() avec celui proposé ci-dessous :

Ce qui aura comme effet de créer 20 utilisateurs.

1.4.2.2 La table commentaires

Pour les commentaires, il faut mettre en place toutes les commandes.

php artisan make:model Commentaire
php artisan make:migration  create_commentaires_table
php artisan make:seeder  CommentairesTableSeeder

Cela va créer 1000 commentaires aléatoires.

1.4.2.3 La table notations

Pour les notations, il faut mettre en place toutes les commandes.

php artisan make:model Notation
php artisan make:migration  create_notations_table
php artisan make:seeder  NotationsTableSeeder

Cela va créer 1000 notations aléatoires.

1.4.2.4 La table bieres

Comme indiqué en introduction, pour compléter le modèle, il faut associer un user à une biere (l’utilisateur qui a ajouté la bière dans la base de données). Pour cela nous allons créer un fichier BieresTableSeeder.php dans le répertoire database/seeds avec le contenu suivant :

1.4.3 La mise en place du modèle d’informations

Pour mettre en place le modèle d’information, il reste à utiliser les commandes proposées par Laravel.

  1. La création des tables

    php artisan migrate:refresh
  2. Chargement des données dans les tables

    php artisan db:seed

    qui, par défaut recherche la classe DataBaseSeeder dans le répertoire database/seeds. Nous allons la modifier pour que son appel provoque le chargement de l’ensemble des tables :

1.4.4 La gestion des associations entre classes modèles

Dans le diagramme de classes qui représente notre système d’information, vous aurez noté qu’il existe des associations entre classes. En effet une bière peut être commentée plusieurs fois par des utilisateurs différents (ou pas), une bière peut être notée par plusieurs utilisateurs (une note par utilisateur). Enfin un utilisateur peut être le créateur de plusieurs bières. Lors des traitements il nous faudra travailler avec ces associations. Laravel à l’aide d’Eloquent permet de faire la liaison entre les tables SQL et les classes modèles.

1.5 Le thème graphique

Dans la suite nous allons utiliser un thème gratuit Material Kit proposé par le site Creative Tim.

Quelques adaptations ont été apportées pour s’intégrer dans le contexte Laravel.

  1. Copier le fichier webpack.mix.js à la racine de votre projet
  2. Copier le fichier package.json à la racine de votre projet
  3. Copier l’archive ressourcesTP5.zip à la racine de votre projet, après avoir décompresser l’archive, copier l’ensemble des répertoires dans le répertoire resource de votre projet.
  4. Exécuter la commande npm install (attention cela peut prendre du temps)
  5. Exécuter la commande npm run dev

La dernière commande doit s’exécuter sans erreur. Si ce n’est pas le cas le thème graphique n’est pas bien configuré.

Le code des vues proposées par la suite est basé sur l’utilisation du thème graphique Material Kit.

1.5.1 Pages d’accueils

1.5.1.2 La page Contact

Cette page est statique, elle ne contient pas d’accès au système d’information.

Mettre en place le thème graphique.

Créer le contrôleur pour les pages statiques.

Ajouter les méthodes pour les pages statiques.

Modifier le fichier web.php pour les pages statiques.

Modifier le fichier navbar.blade.php pour les pages statiques.

Créer le fichier apropos.blade.php qui affiche la page d’A propos.

Créer le fichier contact.blade.php qui affiche la page Contact.

Créer le fichier accueil.blade.php qui affiche la page d’accueil avec un échantillon de bières.

1.5.1.3 La page d’accueil

La page d’accueil affiche un échantillon des bières disponibles dans la base de données.

  1. Récupérer un échantillon (5 ou 6) aléatoire des bières.
  2. Construire une vue qui affiche la page d’accueil
  3. Dans le contrôleur fournir la liste des bières à la vue

Dans le listing qui suit, on trouve un exemple d’une page d’accueil qui ne nécessite aucun droit (visible par un utilisateur anonyme).

Nous allons utiliser un composant biere.composant.blade.php qui affiche une bière

Créer la fonction accueil qui va récupérer 5 ou 6 bières de manière aléatoire dans la base de données.

1.6 Gestion des informations

Pour travailler avec notre base de bières, nous allons créer un contrôleur BieresController et ajouter les routes qui correspondent

Créer le contrôleur BieresController.

Ajouter les routes dans le fichier web.php.

1.6.1 La liste des bières

Dans un premier temps la liste des bières va afficher toutes les bières dans la même page. Ce type d’affichage devoir très rapidement inconfortable pour l’utilisateur lorsque que le nombre d’éléments à afficher devient grand.

Dans le code qui suit vous trouverez un exemple de vue qui affiche la liste des bières. Il faut noter qu’un script javascript a été ajouter, celui-ci permet de déclencher l’affichage d’une vue complète des informations qui concernent une bière et qui sera développée plus loin dans le TP.

@extends('layouts.master')

@section('content')
    <div class="main main-raised">
        <div class="container">
            <h1 style="margin-top: 10rem">Liste des Bières</h1>

            @if(!(count($bieres) === 0))
                <table class="table">
                    <thead style="background-color: #ddd; font-weight: bold;">
                    <th></th>
                    <th class="header">Nom</th>
                    <th class="header">Type</th>
                    <th class="header">Frementation</th>
                    <th class="header">Pays</th>
                    <th class="header">Alcool</th>
                    <th class="header">Actions</th>
                    </thead>
                    <tbody>
                    @foreach ($bieres as $biere)
                        <tr class="une-biere" data-url="{{route('bieres.show',$biere->id)}}">
                            <td><img style="height: 70px" src="{{url("http://www.guidedesbieres.com".$biere->image)}}"
                                     alt="Circle Image"
                                     class="rounded-circle img-fluid"></td>
                            <td>{{$biere->nom}}</td>
                            <td>{{$biere->type}}</td>
                            <td>{{$biere->fermentation}}</td>
                            <td>{{$biere->pays}}</td>
                            <td>{{$biere->alcool}}</td>
                            <td>
                                <div class="btn-group">
                                    <a href="#" class="btn btn-warning" role="button">
                                        <span class="far fa-edit fa-2x" aria-hidden="true"></span>
                                    </a>
                                    <a href="#" class="btn btn-danger" role="button">
                                        <span class="far fa-trash-alt fa-2x" aria-hidden="true"></span>
                                    </a>
                                </div>
                            </td>
                        </tr>
                    @endforeach
                    </tbody>
                </table>
            @else
                <div class="alert alert-warning" role="alert">Aucune bière dans la base</div>
                <a href="{{route('statique.apropos')}}" class="btn btn-warning"> retour à l'accueil</a>
            @endif
        </div>
    </div>

@endsection

@section('scripts')
    <script type="text/javascript">
            $(document).on('click', 'tr.une-biere', function () {
                console.log($(this)[0].attributes['data-url'].value);
                let my_url = $(this)[0].attributes['data-url'].value;
                window.location.replace(my_url);
            });
    </script>
@endsection

Mettre en oeuvre cette version de la liste des bières.

1.6.1.1 Mise en oeuvre de la pagination

Nous allons mettre en oeuvre un affichage des bières par page. Pour cela nous allons utiliser la fonction paginate que propose Laravel.

De plus cette fonction est associée avec une génération automatique de liens qui permettent de se déplacer de page en page.

Mettre en oeuvre la version paginée de la liste des bières.

1.6.1.3 Mise en oeuvre d’une version de la liste des bières avec un formulaire de saisie de recherche

En ajoutant un formulaire de recherche, il est possible de limiter la liste aux noms de bières qui vérifient le nom indiqué par l’utilisateur.

Par exemple en utilisant un bandeau comme celui-ci :

Pour que le tri et/ou la recherche fonctionne avec la pagination, il faut modifier l’url générée par la fonction $bieres->links(). Voici un exemple de fonction index dans le contrôleur BieresController qui permet de gérer ces modifications.

Mettre en oeuvre la version paginée avec tri et recherche par nom de bière.

1.6.2 La page détail d’une bière

Dans cette page nous allons afficher toutes les informations qui concernent une bière avec la liste des commentaires et la note.

  • La route pour y arriver est ‘bieres.show’ qui sera déclenchée suite au clic sur le bouton Détails de la page d’accueil ou la sélection dans la liste des bières (voir plus loin).

  • La vue s’appelle show.blade.php est se trouve dans le répertoire views/biere

  • La méthode show dans le contrôleur BiereController devra récupérer
    1. Toutes les informations qui concernent la bière
    2. Tous les commentaires qui concernent la bière
    3. Toutes les notes qui concernent la bière et notamment
      • Le nombre total d’avis
      • La moyenne
      • le nombre de notes par valeur de note (0, 1, 2, 3, 4, 5)

Voici un exemple de code pour la vue show.blade.php

@extends('layouts.master')

@section('content')
    <div class="page-header header-filter clear-filter green-filter " data-parallax="true"
         style="background-image: url('{{url('/img/une-biere.jpg')}}');">
        <div class="container">
            <div class="row">
                <div class="col-md-8 ml-auto mr-auto">
                    <div class="brand">
                        <h1>{{$biere->nom}}</h1>
                        <h3>{{$biere->brasserie}}</h3>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="main main-raised">
        <div class="row container">
            <div class="col-3">
                <img src="{{url("http://www.guidedesbieres.com".$biere->image)}}" alt="{{$biere->nom}}"
                     class="img-thumbnail">
            </div>
            <div class="col-9">
                <div class="row">
                    <div class="col-3">
                        <h4 class="title text-primary">Nom : </h4>
                    </div>
                    <div class="col-9">
                        <h3 class="title">{{$biere->nom}}</h3>
                    </div>
                </div>
                <div class="row">
                    <div class="col-3">
                        <h4 class="title text-primary">Brasserie : </h4>
                    </div>
                    <div class="col-3">
                        <h3 class="title">{{$biere->brasserie}}</h3>
                    </div>
                    <div class="col-3">
                        <h4 class="title text-primary">Pays : </h4>
                    </div>
                    <div class="col-3">
                        <h3 class="title">{{$biere->pays}}</h3>
                    </div>
                </div>
                <div class="row">
                    <div class="col-3">
                        <h4 class="title text-primary">Type : </h4>
                    </div>
                    <div class="col-3">
                        <h3 class="title">{{$biere->type}}</h3>
                    </div>
                    <div class="col-3">
                        <h4 class="title text-primary">Fermentation : </h4>
                    </div>
                    <div class="col-3">
                        <h3 class="title">{{$biere->fermentation}}</h3>
                    </div>
                </div>
                <div class="row">
                    <div class="col-3">
                        <h4 class="title text-primary">Description : </h4>
                    </div>
                    <div class="col-9">
                        <p>{{$biere->description}}</p>
                    </div>
                </div>
            </div>
        </div>

        <div class="container">
            <h1 class="title">Notation</h1>
            @if($notations['nbAvis'] !== 0)
                @component('notation.component', ['note' => $notations['moyenne']*20, 'avis' => $notations['nbAvis'], 'avisParNote' => $notations['avisParNote']])
                @endcomponent
            @else
                <div class="alert alert-primary" role="alert">Soyez le premier à évaluer cette bière</div>
            @endif


            <h1 class="title">Commentaires</h1>
            @if(!(count($commentaires) === 0))
                <h3 class="text-center">{{count($commentaires)}} Commentaire(s)</h3>
                @foreach($commentaires as $commentaire)
                    <div class="row">
                        @component('commentaire.component', ['commentaire' => $commentaire])
                        @endcomponent
                    </div>
                @endforeach
            @else
                <div class="alert alert-primary" role="alert">Soyez le premier à poster un commentaire</div>
            @endif
        </div>
    </div>
@endsection

qui utilise le composant component.blade.php dans le répertoire views/notation

<h3 class="text-center">Note moyenne : {{$note/20}}/5 ({{$avis}} avis)</h3>

<div class="star-ratings-sprite"><span style="width:{{$note}}%" class="star-ratings-sprite-rating"></span></div>

<hr style="border:3px solid #f1f1f1">

<div class="row">
    <div class="col-1">
        5 <i class="fas fa-star"></i>
    </div>
    <div class="col-6">
        <div class="progress progress-line-primary">
            <div class="progress-bar progress-bar-primary" role="progressbar"
                 aria-valuenow="{{$avisParNote[5]/$avis*100}}" aria-valuemin="0" aria-valuemax="100"
                 style="width: {{$avisParNote[5]/$avis*100}}%;">
                <span class="sr-only">{{$avisParNote[5]/$avis*100}}% avis</span>
            </div>
        </div>
    </div>
    <div class="col-3">
        {{$avisParNote[5]}} avis
    </div>
</div>
<div class="row">
    <div class="col-1">
        4 <i class="fas fa-star"></i>
    </div>
    <div class="col-6">
        <div class="progress progress-line-success">
            <div class="progress-bar progress-bar-success" role="progressbar"
                 aria-valuenow="{{$avisParNote[4]/$avis*100}}"
                 aria-valuemin="0" aria-valuemax="100" style="width: {{$avisParNote[4]/$avis*100}}%;">
                <span class="sr-only">{{$avisParNote[4]/$avis*100}}% avis</span>
            </div>
        </div>
    </div>
    <div class="col-3">
        {{$avisParNote[4]}} avis
    </div>
</div>
<div class="row">
    <div class="col-1">
        3 <i class="fas fa-star"></i>
    </div>
    <div class="col-6">
        <div class="progress progress-line-info">
            <div class="progress-bar progress-bar-info" role="progressbar" aria-valuenow="{{$avisParNote[3]/$avis*100}}"
                 aria-valuemin="0" aria-valuemax="100" style="width: {{$avisParNote[3]/$avis*100}}%;">
                <span class="sr-only">{{$avisParNote[3]/$avis*100}}% avis</span>
            </div>
        </div>
    </div>
    <div class="col-3">
        {{$avisParNote[3]}} avis
    </div>
</div>
<div class="row">
    <div class="col-1">
        2 <i class="fas fa-star"></i>
    </div>
    <div class="col-6">
        <div class="progress progress-line-success">
            <div class="progress-bar progress-bar-striped" role="progressbar" aria-valuenow="{{$avisParNote[2]/$avis*100}}"
                 aria-valuemin="0" aria-valuemax="100" style="width: {{$avisParNote[2]/$avis*100}}%;">
                <span class="sr-only">{{$avisParNote[2]/$avis*100}}% avis</span>
            </div>
        </div>
    </div>
    <div class="col-3">
        {{$avisParNote[2]}} avis
    </div>
</div>
<div class="row">
    <div class="col-1">
        1 <i class="fas fa-star"></i>
    </div>
    <div class="col-6">
        <div class="progress progress-line-warning">
            <div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="{{$avisParNote[1]/$avis*100}}"
                 aria-valuemin="0" aria-valuemax="100" style="width: {{$avisParNote[1]/$avis*100}}%;">
                <span class="sr-only">{{$avisParNote[1]/$avis*100}}% avis</span>
            </div>
        </div>
    </div>
    <div class="col-3">
        {{$avisParNote[1]}} avis
    </div>
</div>
<div class="row">
    <div class="col-1">
        0 <i class="fas fa-star"></i>
    </div>
    <div class="col-6">
        <div class="progress progress-line-danger">
            <div class="progress-bar progress-bar-danger" role="progressbar" aria-valuenow="{{$avisParNote[0]/$avis*100}}"
                 aria-valuemin="0" aria-valuemax="100" style="width: {{$avisParNote[0]/$avis*100}}%;">
                <span class="sr-only">{{$avisParNote[0]/$avis*100}}% avis</span>
            </div>
        </div>
    </div>
    <div class="col-3">
        {{$avisParNote[0]}} avis
    </div>
</div>

<hr style="border:3px solid #f1f1f1">

et le composant component.blade.php dans le répertoire views/commentaire

Mettre en oeuvre la vue qui affiche les détails d’une bière.

1.7 Modification des pages pour l’authentification

Nous allons modifier le style des pages login et register avec par exemple pour

Mettre en oeuvre les vues modifiées pour l’authentification.

1.7.1 Ajouter une bière

Nous allons donner la possibilité d’ajouter une bière aux visiteurs connectés. Pour cela il faut

  • Protéger l’exécution de la méthode create du contrôleur BieresController et la rendre accessible uniquement quand la requête provient d’un utilisateur connecté.
  • Ajouter un bouton dans la page d’index des bières qui déclenche la requête
  • Créer une vue pour saisir les informations de la nouvelle bière
  • Protéger et Modifier la méthode store du contrôleur BieresController pour valider la saisie et sauvegarder la bière dans la base de données.

Pour protéger l’exécution d’une méthode nous allons mettre en place une politique d’autorisations pour le modèle Biere.

1.7.1.1 Création d’une politique d’autorisations

  1. Création d’une classe BierePolicy à l’aide de la commande

  2. Enregistrer la politique d’autorisations dans l’application Dans la classe AuthServiceProvider dans le répertoire app/Providers il faut modifier la variable $policies :

Pour pouvoir créer une nouvelle bière, il suffit d’être identifié, dans la méthode create de la classe BierePolicy nous aurons donc le code suivant :

``` php
public function create(User $user) {
    // renvoie true si un utilisateur est connecté et false sinon
    return Auth::check();
}
```

Pour pouvoir modifier une bière, il faut être connecté et être l’utilisateur créateur de la bière.

``` php
public function update(User $user, Biere $biere) {
    return $user->id === $biere->user_id;
}
```

1.7.1.2 Utilisation de la politique d’autorisation

Les actions create et update doivent être protégées, pour cela il suffit d’utiliser la politique d’autorisation qui a été développée.

``` php
public function create() {
    $this->authorize('create', Biere::class);
    return view('biere.create',['user'=>Auth::User()]);
 }
```

Si la requête n’est pas autorisée, l’utilisateur sera rédigé vers une page d’erreur (requête non autorisée), sinon la vue create.blade.php dans le répertoire views/biere sera affichée.

Voici un extrait de la vue create.blade.php :

@extends('layouts.master')

@section('content')
    <div class="main main-raised">
        <h1 style="margin-top: 10rem">Creation d'une Bière</h1>
        <form method="post" action="{{route('bieres.store')}}">
            @csrf
            <input type="hidden" name="user_id" value="{{$user->id}}">
            <div class="container">
                <div class="row">
                    <div class="col-lg-3 col-sm-4">
                        <div class="form-group">
                            <label for="nom" class="bmd-label-floating">Nom de la bière</label>
                            <input name="nom" type="text" class="form-control" id="nom" value="{{old('nom')}}" required>
                            <span class="bmd-help">Saisir le nom de la bière.</span>
                        </div>
                    </div>
                    <div class="col-lg-3 col-sm-4">
                        <div class="form-group">
                            <label for="brasserie" class="bmd-label-floating">Brasserie</label>
                            <input name="brasserie" type="text" class="form-control" id="brasserie" value="{{old('brasserie')}}" required>
                            <span class="bmd-help">Indiquez le nom de la brasserie.</span>
                        </div>
                    </div>
                    <div class="col-lg-3 col-sm-4">
                        <div class="form-group">
                            <label for="pays" class="bmd-label-floating">Pays</label>
                            <input name="pays" type="text" class="form-control" id="pays" value="{{old('pays')}}" required>
                            <span class="bmd-help">Pays où est brassé la bière.</span>
                        </div>
                    </div>
                </div>
                {{-- --}}
                <div class="row">
                    <div class="col-lg-12">
                        <div class="form-group">
                            <h6>Description</h6>
                            <textarea name="description" id="description" cols="80" rows="10"  required>{{old('description')}}</textarea>
                        </div>
                    </div>
                </div>
                <div class="row buttons-row">
                    <div class="col-md-3 col-sm-3">
                        <button type="submit" class="btn btn-outline-primary btn-block btn-round">Sauve</button>
                    </div>
                </div>
            </div>
        </form>
    </div>
@endsection

1.7.1.3 Ajouter un bouton pour ajouter une bière

Le bouton qui permet d’ajouter une bière ne doit être afficher que lorsque l’utilisateur qui visualise la page en a le droit.

Nous allons modifier la vue index.blade.php du répertoire views/biere, nous allons ajouter le bouton dans la balise nav et utiliser la directive blade @auth pour cela :

Mettre en oeuvre l’ajout d’une bière.

1.7.2 Modifier une bière

Pour modifier une bière nous allons reprendre le travail fait dans la section précédente.

  1. Vérifier les droits d’utilisation de l’action edit
  2. Vérifier les droits d’utilisation de l’action update

Nous allons afficher un bouton qui permet de modifier une bière uniquement lorsque l’utilisateur connecté est le créateur de la bière.

Pour cela nous allons modifier la vue index.blade.php du répertoire views/biere et utiliser la directive @can de blade qui va utiliser la fonction update de la classe BierePolicy.

Voici un extrait de la vue index.blade.php :

Il faut ensuite créer la vue edit.blade.php dans le répertoire views/biere. Voici un extrait de cette vue :

et traiter le formulaire dans la méthode update du contrôleur BieresController.

Mettre en oeuvre la modification d’une bière.

1.7.3 Les autres possibilités à ajouter

L’application n’est pas encore terminée, il faut ajouter les possibilités

  • de saisie d’un commentaire si on est connecté
  • de modification d’un commentaire si on est le créateur
  • de saisie d’une note si on est connecté
  • de supprimer une bière

Il n’y a pas de nouveau concept à introduire pour ajouter ces possibilités, elles vous sont laissées comme exercices d’approfondissement.

 

IUT de Lens Département Informatique

2018