Un site d’annonces – l’administration (2/2)
Dans cet article nous allons terminer la partie administration du site d’annonces. Il nous reste la gestion des annonces obsolètes et des messages à modérer.
Pour vous simplifier la vie vous pouvez télécharger le dossier complet pour le code de cet article.
Annonces obsolètes
Les routes
On doit ajouter des routes pour les annonces obsolètes :
- affichage des annonces obsolètes
- ajout d’une semaine à la date limite de publication pour prolonger l’annonce
- suppression définitive de l’annonce
Route::prefix('admin')->middleware('admin')->group(function () { ... Route::prefix('annonces')->group(function () { Route::get('obsoletes', 'AdminController@obsoletes')->name('admin.obsoletes'); ... }); Route::prefix('admin/annonces')->group(function () { Route::middleware('ajax')->group(function () { Route::post('addweek/{ad}', 'AdminController@addWeek')->name('admin.addweek'); Route::delete('destroy/{ad}', 'AdminController@destroy')->name('admin.destroy'); }); });
On place les routes d’ajout et de suppression en dehors du groupe des administrateurs pour les rendre accessibles pour les auteurs de annonces.
AdRespository
Dans le repository on ajoute les méthode suivantes :
- obsolete : pour renvoyer les annonces obsolètes paginées
- addWeek : pour ajouter une semaine à l’annonce
public function obsolete($nbr) { return Ad::where('limit', '<', Carbon::now())->latest('limit')->paginate($nbr); } public function addWeek($ad) { $limit = Carbon::create($ad->limit); $limit->addWeek(); $ad->limit = $limit; $ad->save(); return $limit; }
AdminController
Dans le contrôleur on utilise le repository pour envoyer les données dans la vue en précisant la pagination :
public function obsoletes() { $ads = $this->adRepository->obsolete(5); return view('admin.obsoletes', compact('ads')); }
Vue admin.obsoletes
On crée la vue admin.obsoletes :
@extends('layouts.admin') @section('content') @include('partials.alerts', ['title' => 'Annonces obsolètes']) @include('partials.table-add-del-view') @endsection @section('script') @include('partials.script-add-del-view') @endsection
On a déjà la vue partielle des alertes. On va créer les deux autres.
Vue partielle table-add-del-view
C’est la vue pour afficher le tableau :
<div class="table-responsive"> <table class="table table-hover"> <thead class="thead-light"> <tr> <th scope="col">Titre</th> <th scope="col">Limite</th> <th scope="col"></th> </tr> </thead> <tbody> @foreach ($ads as $ad) <tr id="{{ $ad->id }}"> <td>{{ $ad->title }}</td> <td class="date-id">{{ date_create($ad->limit)->format('d-m-Y') }}</td> <td class="float-right"> <a class="btn btn-primary btn-sm" href="{{ route('annonces.show', $ad->id) }}" target="_blank" role="button" data-toggle="tooltip" title="Voir l'annonce"><i class="fas fa-eye"></i></a> @isset($edit) <a class="btn btn-warning btn-sm" href="{{ route('annonces.edit', $ad->id) }}" role="button" data-toggle="tooltip" title="Modifier l'annonce"><i class="fas fa-edit"></i></a> @endisset <i class="fas fa-spinner fa-pulse fa-lg" style="display: none"></i> @empty($noAdd) <a class="btn btn-success btn-sm" href="{{ route('admin.addweek', $ad->id) }}" role="button" data-id="{{ $ad->id }}" data-toggle="tooltip" title="Ajouter une semaine"><i class="fas fa-arrow-alt-circle-up"></i></a> @endisset <a class="btn btn-danger btn-sm" href="{{ route('admin.destroy', $ad->id) }}" role="button" data-id="{{ $ad->id }}" data-toggle="tooltip" title="Supprimer l'annonce"><i class="fas fa-trash"></i></a> </td> </tr> @endforeach </tbody> </table> </div> <div class="d-flex"> <div class="mx-auto"> {{ $ads->links() }} </div> </div>
Vue partielle script-add-del-view
C’est le Javascript pour gérer les actions du tableau :
<script> $(() => { const init = (e) => { e.preventDefault(); let that = $(e.currentTarget); that.hide(); that.closest('td').find('i.fa-spinner').show(); return that; } const alertServer = () => { that.show(); that.closest('td').find('i.fa-spinner').hide(); $('.alert-warning').removeClass('d-none').addClass('show'); } $('.alert-warning button').click(() => { $('.alert-warning').addClass('d-none').removeClass('show'); }); $('.btn-danger').click((e) => { that = init(e); $.ajax({ method: 'delete', url: that.attr('href'), }) .done(() => { document.location.reload(true); }) .fail(() => { alertServer(); }); }); $('.btn-success').click((e) => { that = init(e); $.post(that.attr('href')) .done((data) => { that.show(); that.closest('td').find('i.fa-spinner').hide(); that.closest('tr').find('td.date-id').text(data.limit); if(data.ok) that.closest('tr').addClass('table-success'); }) .fail(() => { alertServer(); }); }); }) </script>
Layout admin
Dans notre layout admin il faut ajouter le lien pour accéder à la vue des annonces obsolètes (on n’avait pas renseigné le href) :
<li class="nav-item @if(request()->route()->getName() == 'admin.obsoletes') active @endif"> <a class="nav-link" href="{{ route('admin.obsoletes') }}"> <i class="fas fa-fw fa-hourglass-end"></i> <span>Obsolètes</span></a> </li>
Le lien devient alors actif et en cliquant on arrive sur le page des annonces obsolètes :
Pour chaque annonce on dispose de 3 icônes de commande pour :
- voir l’annonce
- ajouter une semaine à la date de validité de l’annonce
- supprimer l’annonce
Le codage existe déjà pour la première action et nous n’avons donc à nous intéresser aux deux dernières.
Ajouter une semaine
On va coder maintenant côté serveur pour l’ajout d’une semiane à annonce. On a déjà créé la méthode dans le repository ci-dessus.
AdminController
Il ne nous reste plus qu’à coder le contrôleur :
public function addWeek(Request $request, Ad $ad) { $this->authorize('manage', $ad); $limit = $this->adRepository->addWeek($ad); return response()->json([ 'limit' => $limit->format('d-m-Y'), 'ok' => $limit->greaterThan(Carbon::now()), ]); }
On commence par vérifier que l’utilisateur est bien autoriser à faire cette action. On n’a pas encore créé la méthode manage dans cette autorisation, on va la créer, elle nous servira en fait à auroriser le rédacteur de l’annonce a lui aussi ajouter une semaine. Donc on crée cette méthode dans AdPolicy :
public function manage(User $user, Ad $ad) { return $user->id == $ad->user_id; }
Ensuite dans le contrôleur on fait appel au repository pour ajouter effectivement une semaine à l’annonce. pour finir on retourne au client la nouvelle date limite de l’annonce et aussi une valeur booléenne qui indique si l’annonce est devenue valide. Il serait délicat de coder ça côté client, autant le faire ici avec les possibilités vraiment pointues de Carbon.
Fonctionnement
Voyons maintenant le fonctionnement pour l’ajout d’une semaine à l’annonce…
Dans la vue partielle du tableau pour le lien d’ajout on a ce code :
<a class="btn btn-success btn-sm" href="{{ route('admin.addweek', $ad->id) }}" role="button" data-id="{{ $ad->id }}" data-toggle="tooltip" title="Ajouter une semaine"><i class="fas fa-arrow-alt-circle-up"></i></a>
L’url générée est de la forme admin/annonces/addweek/{annonce_id}. Comme on est en Ajax c’est le Javascript qui gère la requête :
$('.btn-success').click((e) => { that = init(e); $.post(that.attr('href')) .done((data) => { that.show(); that.closest('td').find('i.fa-spinner').hide(); that.closest('tr').find('td.date-id').text(data.limit); if(data.ok) that.closest('tr').addClass('table-success'); }) .fail(() => { alertServer(); }); });
Comme on l’a déjà vu pour les actions précédentes on affiche une icône animée le temps de la communication avec le serveur.
On a vu plus haut le code du contrôleur qui gère la requête. On sait qu’on renvoie deux informations :
- la nouvelle date limite
- un booléen pour dire si l’annonce est devenue active
On a donc deux cas :
- l’annonce a une semaine de plus mais n’est pas encore active, on change juste la date :
that.closest('tr').find('td.date-id').text(data.limit);
- l’annonce est devenue active alors on met le fond en vert pour le signaler visuellement :
if(data.ok) that.closest('tr').addClass('table-success');
Supprimer une annonce
On va coder maintenant côté serveur pour la suppression d’une annonce.
AdminController
Il n’y a qu’à coder le contrôleur :
public function destroy(Request $request, Ad $ad) { $this->authorize('manage', $ad); $this->adRepository->delete($ad); $request->session()->flash('status', "L'annonce a bien été supprimée."); return response()->json(); }
On vérifie qu’on a le droit de supprimer l’annonce (administrateur ou auteur comme on l’a déjà vu plus haut). On utilise le repository pour supprimer effectivement l’annonce. On envoie un message en session flash et enfin on renvoie une réponse vide.
Fonctionnement
Voyons maintenant le fonctionnement pour l’approbation d’une annonce…
Dans la vue du tableau pour le lien de suppression on a ce code :
<a class="btn btn-danger btn-sm" href="{{ route('admin.destroy', $ad->id) }}" role="button" data-id="{{ $ad->id }}" data-toggle="tooltip" title="Supprimer l'annonce"><i class="fas fa-trash"></i></a>
L’url générée est de la forme admin/annonces/destroy/{annonce_id}. Comme on est en Ajax c’est le Javascript qui gère la requête :
$('.btn-danger').click(e => { that = init(e); $.ajax({ method: 'delete', url: that.attr('href'), }) .done(() => { document.location.reload(true); }) .fail(() => { alertServer(); }); });
Si la réponse du serveur est positive (done) on recharge la page et l’alerte s’affiche :
Sinon on affiche un ealerte serveur comme on l’a déjà vu :
Messages à modérer
On a vu que lorsqu’un visiteur (non connecté) laisse un message à un auteur d’annonce ce message est mémorisé et doit être validé par un administrateur. On va maintenant coder cette partie.
Les routes
On doit ajouter des routes pour la modération des messages :
- accès à la liste
- approbation
- refus
Route::prefix('admin')->middleware('admin')->group(function () { ... Route::prefix('messages')->group(function () { Route::get('/', 'AdminController@messages')->name('admin.messages'); Route::post('approve/{message}', 'AdminController@messageApprove')->name('admin.message.approve'); Route::post('refuse', 'AdminController@messageRefuse')->name('admin.message.refuse'); }); ... });
Dans le groupe des administrateurs on crée un nouveau groupe messages avec les 3 routes.
MessageRepository
Dans le repository on crée la methode all pour récupérer tous les messages en attente :
public function all($nbr) { return Message::latest()->paginate($nbr); }
AdminController
Dans le contrôleur on crée la méthode messages et on fait appel au repository pour récupérer les messages paginés et les envoyer dans la vue :
public function messages() { $messages = $this->messagerepository->all(5); return view('admin.messages', compact('messages')); }
Vue admin.messages
On crée la vue admin.messages :
@extends('layouts.admin') @section('content') @include('partials.message', ['url' => route('admin.message.refuse')]) @include('partials.alerts', ['title' => 'Messages à modérer']) <div class="table-responsive"> <table class="table table-hover"> <thead class="thead-light"> <tr> <th scope="col">Email</th> <th scope="col">Texte</th> <th scope="col"></th> </tr> </thead> <tbody> @foreach ($messages as $message) <tr id="{{ $message->id }}"> <td>{{ $message->email }}</td> <td>{{ $message->texte }}</td> <td class="float-right"> <a class="btn btn-success btn-sm" href="{{ route('admin.message.approve', $message->id) }}" role="button" data-toggle="tooltip" title="Approuver le message"><i class="fas fa-thumbs-up"></i></a> <i class="fas fa-spinner fa-pulse fa-lg" style="display: none"></i> <a class="btn btn-danger btn-sm" href="#" role="button" data-id="{{ $message->id }}" data-toggle="tooltip" title="Refuser le message"><i class="fas fa-thumbs-down"></i></a> </td> </tr> @endforeach </tbody> </table> </div> <div class="d-flex"> <div class="mx-auto"> {{ $messages->links() }} </div> </div> @endsection @section('script') @include('partials.script') @endsection
On a déjà créer toutes les vues partielles utilisées (d’où l’intérêt de ces vues parteilles pour partager du code).
Layout admin
Dans notre layout admin il faut ajouter le lien pour accéder à la vue des annonces à modérer (on n’avait pas renseigné le href) :
<li class="nav-item @if(request()->route()->getName() == 'admin.messages') active @endif"> <a class="nav-link" href="{{ route('admin.messages') }}"> <i class="fas fa-fw fa-question"></i> <span>A modérer</span></a> </li>
Le lien devient alors actif et en cliquant on arrive sur le page des messages à modérer :
Pour chaque message on dispose de 2 icônes de commande pour :
- approuver le message
- refuser le message
Approuver un message
MessageRepository
On va avoir besoin de récupérer l’annonce qui correspond à un message et aussi de supprimer le message :
public function getAd($message) { return $message->ad()->firstOrFail(); } public function delete($message) { $message->delete(); }
Notification MessageApprove
On va prévoir aussi une notification pour l’auteur du message, pour le prévenir que son message a été approuvé :
php artisan make:notification MessageApprove
<?php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Notification; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; use App\Models\ { Ad, Message }; class MessageApprove extends Notification { use Queueable; protected $ad; protected $message; public function __construct(Ad $ad, Message $message) { $this->ad = $ad; $this->message = $message; } public function via($notifiable) { return ['mail']; } public function toMail($notifiable) { return (new MailMessage) ->line('Nous avons approuvé ce message que vous avez déposé pour une annonce :') ->line('--------------------------------------') ->line($this->message->texte) ->line('--------------------------------------') ->action('Voir cette annonce', route('annonces.show', $this->ad->id)) ->line("Merci d'utiliser notre site !"); } public function toArray($notifiable) { return [ // ]; } }
AdminController
Il ne nous reste plus qu’à coder le contrôleur :
use App\Models\ { Ad, Message }; use App\Notifications\ { AdApprove, AdRefuse, MessageApprove, AdMessage }; ... public function messageApprove(Request $request, Message $message) { $ad = $this->messagerepository->getAd($message); $message->notify(new MessageApprove($ad, $message)); $ad->notify(new AdMessage($ad, $request->message, $message->email)); $this->messagerepository->delete($message); $request->session()->flash('status', "Le message a bien été approuvé et le rédacteur va être notifié."); return response()->json(['id' => $message->id]); }
Le code ressemble à ce que nous avons déjà vu avec :
- récupération de l’annonce qui correspond au message
- envoi de la notification en passant en paramètre l’annonce et le message
- envoi du message à l’auteur de l’annonce
- suppression du message dans la base
- préparation d’un texte pour l’alerte
- réponse au client en renvoyant l’identifiant du message
Mais pour que la notification fonctionne avec les message on doit compléter le modèle Message :
use Illuminate\Notifications\Notifiable; class Message extends Model { use Notifiable;
Si tout se passe bien la page est rechargée et l’alerte est affichée :
Et l’auteur du message reçoit cet email :
Et évidemment l’auteur de l’annonce reçoit le message.
Refuser un message
Dans le cas de refus d’un message on va faire apparaître en page modale un formulaire pour que l’adminstrateur justifie sa décision pour informer l’auteur du message.
MessageRepository
On va avoir beosin de récupérer un message à partir de son identifiant :
public function getById($id) { return Message::findOrFail($id); }
Notification MessageRefuse
On va prévoir aussi une notification pour le rédacteur pour le prévenir que son message a été refusé :
php artisan make:notification MessageRefuse
<?php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Notification; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; use App\Models\ { Ad, Message }; class MessageRefuse extends Notification { use Queueable; protected $message; protected $messageRefus; protected $ad; public function __construct(Ad $ad, Message $message, $messageRefus) { $this->ad = $ad; $this->message = $message; $this->messageRefus = $messageRefus; } public function via($notifiable) { return ['mail']; } public function toMail($notifiable) { return (new MailMessage) ->line('Nous avons refusé ce message que vous avez déposé :') ->line('--------------------------------------') ->line($this->message->texte) ->line('--------------------------------------') ->line('Pour la raison suivante :') ->line('--------------------------------------') ->line($this->messageRefus) ->line('--------------------------------------') ->action('Voir cette annonce', route('annonces.show', $this->ad->id)) ->line("Merci d'utiliser notre site pour vos annonces !"); } public function toArray($notifiable) { return [ // ]; } }
AdminController
Il ne nous reste plus qu’à coder le contrôleur :
use App\Notifications\ { AdApprove, AdRefuse, MessageApprove, Messagerefuse, AdMessage }; ... public function MessageRefuse(MessageRefuseRequest $request) { $message = $this->messagerepository->getById($request->id); $ad = $this->messagerepository->getAd($message); $message->notify(new MessageRefuse($ad, $message, $request->message)); $this->messagerepository->delete($message); $request->session()->flash('status', "Le message a bien été refusé et le rédacteur va être notifié."); return response()->json(['id' => $ad->id]); }
Là on :
- récupère le message à partir de son identifiant
- récupère l’annonce qui correspond à ce message
- notifie l’auteur du message du refus
- supprime le message dans la base
- prépare le texte de l’alerte
- retourne l’indentifiant de l’annonce au client
Fonctionnement
Voyons maintenant le fonctionnement pour l’approbation d’une annonce…
Dans le tableau pour le lien de refus on a ce code :
<a class="btn btn-danger btn-sm" href="#" role="button" data-id="{{ $message->id }}" data-toggle="tooltip" title="Refuser le message"><i class="fas fa-thumbs-down"></i></a>
L’action va ouvrir une page modale :
$('.btn-danger').click((e) => { e.preventDefault(); $('#id').val($(e.currentTarget).attr('data-id')); $('#messageModal').modal(); });
C’est la même page et le même code qu’on a vu pour l’envoi d’un message lors du refus d’une annonce.
Je ne détaille donc pas ce fonctionnement. L’adminsitrateur obtient ce message :
Le rédacteur reçoit cet email :
Conclusion
On en a terminé avec l’administration du site. On peut désormais accepter ou refuser annonce et message. On peut également prolonger la durée publication d’une annonce. Dans le prochain article on mettra en place la gestion du profil de l’utilisateur en lui donnant accès à ses données et à ses annonces.
20 commentaires
golli
bonjour bestmomo
j’ai volu ajouté une barre de recherche mais je galaire avec l’affichage du résultat:
en premier lieu j’ai créer une nouvelle vue dans partials au nom de search.blade.php en liaison avec la vue app.blade.php(@include(‘partials.search’)) avec ce code:
et apres la route exciste deja:
Route::post(‘recherche’, ‘AdController@search’)->name(‘annonces.search’)->middleware(‘ajax’);
et pour finir le controlleur AdController.php avec la fonction search que j’ai un peu modifier:
public function search(Request $request)
{
setlocale (LC_TIME, ‘fr_FR’);
if ($q = request()->input(‘q’)){
$ads = ads::where(‘titel’, ‘like’, « %$q% »)
->orwhere(‘texte’, ‘like’, « %$q% »)
->paginate(3);
return view(‘partials.ads’)->with(‘ads’, $ads);
}
if( $ads = $this->adRepository->search($request)){
return view(‘partials.ads’, compact(‘ads’));
}
}
mon problème est que la recherche traditionnel du ton Tuto fonctionne normalement, mais quand je tape un mot pour faire une recherche j’obtiens rien que du 404
merci pour votre aide
bestmomo
Salut,
Tu envoies bien une requête en POST ?
Drope
Hello Bestmomo,
Si je comprends bien le mécanisme des notifications et des emails… Tu ne précises pas d’adresse email dans la création des notifications :
$ad->notify(new MessageApprove($ad, $message));
D’apès la doc de Laravel, en fait, il va automatiquement chercher la propriété email. Donc $ad->email
Tu confirmes ?
Mais si ton user changes d’adresse mail comme il peut le faire, ne faudrait-il pas repasser sur toutes ses annonces pour mettre a jour le champ ? Sinon les messages des autres utilisateurs ne lui arriveront pas. Si ?
Merci.
bestmomo
Salut,
La notification ira effectivement au mail mémorisé lors de la création de l’annonce, si l’utilisateur change d’email entre temps c’est sûr que ça va poser un problème…
golli
bonsoir
mon probleme maintenant
quand j’aprouve le message il l’envoi au proprietaire de l’annonce et non a l’expediteur dont j’ai remplie son adresse mail sans indiquer qui a envoyé le message c a dire il n’ya pas le mail de l’expediteur qui veux contacter l’annonceur
et quand je refuse le message c la même chose sauf normalement l »metteur reçois le refus et non l’annonceur !!!!!
merci pour votre aide mon ami
bestmomo
Bonjour,
C’est pas très clair. Tant qu’une annonce n’a pas été approuvée il n’y a qu’une adresse : celle de l’auteur de l’annonce.
Drope
Salut,
Je crois que le problème de Golli, c’est de notifier un utilisateur après modération de son message.
En fait, dans le code de Bestmomo, tu retrouves $ad->notify. Donc tu notifies bien l’auteur de l’annonce.
Si tu souhaites notifier l’expéditeur du message, c’est à partir de l’email que tu as stocké dans ta table de messages.
Donc tu dois ajouter $message->notify dans tes fonctions messageApprove et MessageRefuse
++
golli
pardon je clarifie exactement mon probleme
Quand un utilisateur non inscrit envoie un message il sera modéré :
1- quand j’accepte le message le message sera envoyé a l’auteur de l’annonce !! normalement il s’envois ver l’untilisateur non inscrit pour l’informé que son message a été aprouvé mon probleme ici quand j’aprouve le message il l’envoi a l’auteur de l’annonce et non a l’expediteur
Et l’utilisateur qui à envoyé le mail n’as pas reçu la confirmation que le message a été approuvé et transmis a l’auteur de l’annonce
2- quand je refuse un message il sera envoyé lui aussi a l’auteur de l’annonce et non a l’utilisateur c a dire que l’expéditeur ne reçoit pas le mail de refus c l’annonceur qui reçoit le refus
C pas logique normalement l’expéditeur reçoit le refus et non l’auteur d’annonce
Merci pour votre collaboration mon ami
bestmomo
Salut
Cette fois j’ai compris et effectivement on envoie pas les messages à la bonne personne. Ce qui m’étonne c’est que personne ne l’ait vu avant. Il va falloir corriger ça…
Merci !
golli
ouiiiiii merciii infiniment car je galére depuis 3 jours lool
j’ai suivie ton tuto ligne par ligne depuis des semaine dans mon temps libre car réellement je suis pas un développeur pro j’aime le développement
je l’ai juste etudié il y a 10 ans lool
svp envoyé moi la correction par commentaire ou par mail :golliyoussef@gmail.com
1- quand j’approuve le message : 2 actions seront prisent 1) confirmation pour l’expediteur que son message a était approuvé et 2) le message sera expédier a l’auteur de l’annonce en l’informant du mail de l’expéditeur
2- le refus doit être envoyé a l’expéditeur et non a l’auteur de l’annonce
et svp si il ya possibilité de me dire comment inclure une barre de recherche ces très important dans un site d’annonce
merciiii infiniment
bestmomo
Salut,
J’ai mis à jour l’article et le ZIP.
golli
bonsoir bestmomo
merci pour la correction mais il ya toujour une erreur:
{message: « Call to undefined method App\Models\Message::notify() », exception: « BadMethodCallException »,…}
exception: « BadMethodCallException »
file: « C:\xampp\mesannonces\vendor\laravel\framework\src\Illuminate\Support\Traits\ForwardsCalls.php »
line: 50
message: « Call to undefined method App\Models\Message::notify() »
trace: [{,…},…]
golli
c bon j’ai réglé l’erreur il falait just ajouter dans le model Message :
use Illuminate\Notifications\Notifiable
class Message extends Model
{
use Notifiable;
golli
pardon juste un tout petit détail l’auteur reçois ça :
Bonjour !
Vous avez reçu un message concernant une annonce que vous avez déposée :
{« id »:61, »texte »: »helloooooo », »email »: »zacboww@gmail.com », »ad_id »:82, »created_at »: »2020-06-03T22:15:02.000000Z », »updated_at »: »2020-06-03T22:15:02.000000Z »}
c pas claire
golli
mercii c resolu tout les probleme ;)))))
il faut juste ajouter
$ad->notify(new AdMessage($ad, $message->texte, $message->email));
pour avoir un mail clair
mercii Mr bestmomo
bestmomo
Oui je l’ai corrigé dans les fichiers mais je ne l’ai pas mentionné dans l’article.
golli
Oui bien reçu mercii
golli
bonjour bestmomo
j’ai volu ajouté une barre de recherche mais je galaire avec l’affichage du résultat:
en premier lieu j’ai créer une nouvelle vue dans partials au nom de search.blade.php en liaison avec la vue app.blade.php(@include(‘partials.search’)) avec ce code:
form action= »{{route(‘annonces.search’)}} » class= »d-flex mr-3″>
et apres la route exciste deja:
Route::post(‘recherche’, ‘AdController@search’)->name(‘annonces.search’)->middleware(‘ajax’);
et pour finir le controlleur AdController.php avec la fonction search que j’ai un peu modifier:
public function search(Request $request)
{
setlocale (LC_TIME, ‘fr_FR’);
if ($q = request()->input(‘q’)){
$ads = ads::where(‘titel’, ‘like’, « %$q% »)
->orwhere(‘texte’, ‘like’, « %$q% »)
->paginate(3);
return view(‘partials.ads’)->with(‘ads’, $ads);
}
if( $ads = $this->adRepository->search($request)){
return view(‘partials.ads’, compact(‘ads’));
}
}
mon problème est que la recherche traditionnel du ton Tuto fonctionne normalement, mais quand je tape un mot pour faire une recherche j’obtiens rien que du 404
merci pour votre aide
Mody
merci davantage!!
lamine
Merci beaucoup c’est vraiment parfait