Sélectionner une page

Laravel permet de créer assez simplement des formulaire sécurisé avec des options. Si vous désirez utiliser cette option, il faut depuis Laravel 5.4 installer un package de la façon suivante. (Vous trouvez une information complète sur le site de doc Laravel.

composer require "laravelcollective/html":"^5.3.0"

et aller modifier ensuite le fichier config/app.php en ajoutant les 3 lignes suivante:

'providers' => [
    //....
    Collective\Html\HtmlServiceProvider::class,
 ],
 'aliases' => [
    //....
    'Form' => Collective\Html\FormFacade::class,
    'Html' => Collective\Html\HtmlFacade::class,
 ],

Création des pages du backend, des contrôleurs et modification du routage

Affichage de liste dans le backend

Nous allons maintenant créer les pages permettant de modifier, créer et supprimer nos catégories depuis la partie backend de notre site. Je vais vous donner tout le code et expliquer ensuite ce qui se passe.

Routage avec contrôle de paramètres et de connexion

J’ai ajouté les nouvelles routes suivantes à mon fichier routes/ web.php afin de pouvoir éditer, lister, créer et supprimer des catégories.

A noter 3 choses:
Les Route::get et Routes::any : any me permet de récupérer les valeurs de mes formulaires en POST.
Le ->where(‘id’, ‘[0-9]+’) : Qui permet de mettre une expression régulière qui contrôle que l’id est bien transmis et est numérique.
Le ->middleware(‘auth’); : Qui permet de restreindre l’accès aux utilisateurs connectés

Contrôleurs du backend et options de validations

Vous voyez ici le code source complet de mon controller Http/ Controllers/ Backend/ CategoriesController.php. J’ai décidé de faire un seul contrôleur pour toute la gestion des catégories. Ce n’est pas forcément idéal mais ca permet des fois d’aller plus vite ou d’être plus lisbible.

namespace App\Http\Controllers\Backend;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
//use Illuminate\Support\Facades\DB; nécessaire pour l'utilisation de DB::table

class CategoriesController extends Controller
{
   public function listAll(){
     $categorie = \App\Categorie::paginate(5);
     return view('backend.categories.list',array('categories'=>$categorie));
   }
   public function newCat(Request $request){
 
   if(!is_null($request->input('name'))){
     $this->validate($request, [
       'name' => "required|max:255|min:4|unique:categories",//validateur contrôle le nom
     ]);
     $new_cat = new \App\Categorie; 
     $new_cat->name = trim($request->input('name'));
     $new_cat->save();
     return $this->listAll()->withSuccessMsg('Catégorie '.$new_cat->name.' créee avec succès');
   }
   return view('backend.categories.new');
 }
 
 public function delete($id){
   $categorie = \App\Categorie::find($id);
   if(!is_null($categorie)){ //la catégorie n'a pu être trouvé, on retourne sur l'accueil
     $categorie->delete();
     return $this->listAll()->withSuccessMsg(sprintf('suppression %s effectuées',$categorie->name));
   }
   return $this->listAll();
 }
 public function edit($id,Request $request){

   $categorie = \App\Categorie::find($id);
   if(is_null($categorie)){ //la catégorie n'a pu être trouvé, on retourne sur l'accueil
     return redirect('home');
   }
   if(!is_null($request->input('name'))){
 
       $this->validate($request, [
       'name' => "required|max:255|min:4|unique:categories,name,".$id,//validateor controle le nom sauf pour cet id
     ]);
 
     $name = trim($request->input('name'));
     /* 
     $check = \App\Categorie::where('name', $name)->where('id','!=',$id)->get()->count();
     $check = DB::('categories')->where('name', '=', $name)->where('id', '!=', $id)->get()->count();
     if($check!=0){
       $categorie->name = $name;
       return view('backend.categories.edit',array('categorie'=>$categorie))->withErrorMsg(sprintf('Le nom %s est déjà utilisé',$name)); 
     } 
     */ 
     $categorie->name = $name;
     $categorie->save();
     return view('backend.categories.edit',array('categorie'=>$categorie))->withSuccessMsg('Modifications effectuées');
   }
   return view('backend.categories.edit',array('categorie'=>$categorie));
 }
}

Charger un modèle

Vous avez un exemple de chargement de modèle de 3 manières différentes. Nous utilisons find() afin de charger selon l’id ou avec la clause where() qui permet d’effectuer une recherche sur n’importes quels champs.

//retourne un objet de mon modèle Categorie ou null s'il n'en trouve pas 
$categorie = \App\Categorie::find($id);
//retourne le nombre d'élément du même nom et avec un id différent
$check = \App\Categorie::where('name', $name)->where('id','!=',$id)->get()->count();
//Même chose de la ligne précédente mais d'une autre manière
//pour cette solution il faut ajouter [use Illuminate\Support\Facades\DB;] en haut de votre controller
$check = DB::('categories')->where('name', '=', $name)->where('id', '!=', $id)->get()->count();

Validation des champs de formulaire

Laravel fourni de nombreux outils permettant de contrôler la validation des champs de formulaire. Vous avez-ici un exemple d’utilisation.

//validateur qui contrôle que le champs est setté, qu'il est de la bonne 
//taille et qu'il est unique
$this->validate($request, [
 'name' => "required|max:255|min:4|unique:categories",
]);
//validateur qui contrôle en plus que le nom est unique sauf pour lui-même
$this->validate($request, [
 'name' => "required|max:255|min:4|unique:categories,name,".$id,
]);
//////les erreurs de validation sont affichés par notre fichier app.blade.php
//@if (count($errors) > 0)
// @foreach ($errors->all() as $error)
// {{ $error }}
// @endforeach
//@endif

Formulaires dans les vues

L’exemple ci-dessous affiche le formulaire de modification. Comme @extends(‘home’) le signale, il va utiliser le template et ajouter dans sa section content le code contenu entre section(‘content’) et endsection. Ce code contient la création simplifié de formulaire et d’ajout de champs et bouton

Ajouter une valeur par défaut à un champ de formulaire:
Form::text(‘input name’,’valeur par defaut’,$fiche->npa,array(‘class’ => ‘small_input’) );

{ { Form::open(array('url' => 'backend/categories/edit/'.$categorie->id)) } }
 <table style='width:100%'>
 <tr>
 <td>ID</td>
 <td>{ { $categorie->id } }</td>
 </tr>
 <tr>
 <td>Categorie</td>
 <td><?php echo Form::text('name',$categorie->name );?></td>
 </tr>
 <tr>
 <td></td>
 <td> <?php echo Form::submit('Save');?></td>
 </tr>
 </table> 
 { { Form::close() } } 
@endsection</pre>
 <td></td>
 <td> <?php echo Form::submit('Save');?></td>
 </tr>
 </table> 

@endsection