Bonjour,
Voila je rencontre un petit problème avec mon code.
J'essaye de faire un redirect vers la route de la page d'accueil de l'Admin si la request n'est pas dans le in_array
<?php
protected function orderBy($request)
{
if ($request->get('orderby') !== null) {
if (!in_array($request->get('orderby'), ['h1', 'updated_at']) OR !in_array($request->get('order'), ['asc', 'desc'])) {
redirect()->route('admin_home'); // marche pas
}
$this->orderBy = $request->get('orderby');
$this->order = $request->get('order');
} else {
$this->orderBy = 'id';
$this->order = 'desc';
}
return $this;
}
Je veux rediriger vers la homepage de mon admin si la request n'est pas dans le in_array
Les orderby et order ne sont pas pris en compte...
Pourquoi ?
Merci beaucoup.
Sinon tu mets un deuxième paramètre à ta méthode genre :
protected function orderBy($request, &$redirect)
et si tu veux rediriger tu mets $redirect = true, sinon false, et dans la méthode de ton controlleur:
public function index(Request $request)
{
$this->status = 1;
$redirect = false;
$this->orderBy($request, $redirect)->runArticles($request, route('admin_article_index'));
if($redirect) return redirect()->...;
return $this->returnView($request, 'index');
}
Salut,
Tu as debug les variables rennvoyées par ton formulaire voir si les infos dont tu as besoin sont bien définies ?
dd($request->all());
Yes. $request est bien pris en compte. C'est le redirect() qu'il ne veut pas prendre en compte.
Merci.
Salut,
Je ne te demande pas si $request est bien pris en compte mais si les valeurs correpsondent bien à celles que tu essayes de match.
if (!in_array($request->get('orderby'), ['h1', 'updated_at']) || !in_array($request->get('order'), ['asc', 'desc'])) {
redirect()->route('admin_home');
}
a ok.
Il y a bien 'orderby' et 'order' qui sont passés en GET.
Si je leur passe comme valeur, les valeurs autorisés dans le array, le orderby et order marchent bien.
Par contre si l'utilisateur modifie l'URL (par example pour 'orderby' mettre autre chose que 'h1' et 'updated_at'), je voudrai le rediriger vers la route 'admin_home'.
Mais le redirect ne marche pas. (par contre si je met un header location au lieu de la function redirect de Laravel ça marche bien, mais le but avec un framework est d'utiliser ses functions).
Merci.
Yes, c est vraiment le redirect qui pose problème.
Et à cet endroit la, je ne peut pas mettre de return devant le redirect.
Merci.
Car cette methode orderBy je l'appelle dans une autre methode où je ne peut pas mettre de return orderBy()...
Donc faut que je trouve comment avec Laravel on peut faire un redirect sans mettre de return.
merci
Euh ... en gros tu veux rediriger SANS quitter la page courante ? Y'a pas comme un problème ? :'D
Tu peux envoyer les ressources dont tu as besoin dans la redirection (tu as lu la doc ???) :
$data = ['resource_1' => $resource_1, 'resource_2' => $resource_2/*, ...*/];
return redirect('route_name')->with('data' => $data);
https://laravel.com/docs/5.1/responses#redirecting-with-flashed-session-data
MErci à tous pour vos réponse.
En fait si je ne peut pas mettre de return à ma function orderBy, c'est parceque j'appelle cette function comme ceci :
<?php
/**
* Afficher la liste des articles publiés
*
* @param Request $request
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function index(Request $request)
{
$this->status = Article::STATUS_PUBLISHED;
$this->orderBy($request)->runArticles($request, route('admin_article_index'));
return $this->returnView($request, 'index');
}
Et je ne peut donc pas mettre de :
return orderBy();
Si au lieu du redirect, je met un header location suivi d'un exit, ça fonctionne.
Voici un extrait de mon ArticleController :
<?php
/**
* Afficher la liste des articles publiés
*
* @param Request $request
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function index(Request $request)
{
$this->status = 1;
$this->orderBy($request)->runArticles($request, route('admin_article_index'));
return $this->returnView($request, 'index');
}
/**
* Afficher la liste des articles en brouillons
*
* @param Request $request
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function indexDrafts(Request $request)
{
$this->status = 2;
$this->orderBy($request)->runArticles($request, route('admin_article_index-drafts'));
return $this->returnView($request, 'index-drafts');
}
/**
* Afficher la liste des articles en corbeille
*
* @param Request $request
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function indexTrash(Request $request)
{
$this->status = 3;
$this->orderBy($request)->runArticles($request, route('admin_article_index-trash'));
return $this->returnView($request, 'index-trash');
}
/**
* Ordre d'affichage lors du clic sur les liens du thead
*
* @param $request
* @return $this
*/
private function orderBy($request)
{
$varGet = RequestC::andIfIssetGet(['page', 'pp', 'q', 'category']);
if ($request->get('orderby') !== null) {
if (!in_array($request->get('orderby'), ['h1', 'updated_at']) OR !in_array($request->get('order'), ['asc', 'desc'])) {
redirect()->route('admin_home'); // marche pas...
}
$this->orderBy = $request->get('orderby');
$this->order = $request->get('order');
if ($request->get('orderby') == 'h1' && $request->get('order') == 'asc') {
$this->tableHrefH1 = 'orderby=h1&order=desc'.$varGet;
$this->tableClassH1 = 'orderby-icon';
} elseif ($request->get('orderby') == 'h1' && $request->get('order') == 'desc') {
$this->tableHrefH1 = 'orderby=h1&order=asc'.$varGet;
$this->tableClassH1 = 'orderby-icon-2';
} elseif ($request->get('orderby') == 'updated_at' && $request->get('order') == 'desc') {
$this->tableHrefLastEdit = 'orderby=updated_at&order=asc'.$varGet;
$this->tableClassLastEdit = 'orderby-icon-2';
} elseif ($request->get('orderby') == 'updated_at' && $request->get('order') == 'asc') {
$this->tableHrefLastEdit = 'orderby=updated_at&order=desc'.$varGet;
$this->tableClassLastEdit = 'orderby-icon';
}
} else {
$this->orderBy = 'id';
$this->order = 'desc';
$this->tableHrefH1 = 'orderby=h1&order=asc'.$varGet;
$this->tableClassH1 = 'orderby-icon-n';
$this->tableHrefLastEdit = 'orderby=updated_at&order=desc'.$varGet;
$this->tableClassLastEdit = 'orderby-icon-n-2';
}
return $this;
}
/**
* Select et count articles. Possible aussi avec un searche WHERE LIKE h1
*
* @param $request
* @param string $viewPath - Pour préciser path de la pagination
* @return $this
*/
private function runArticles($request, $viewPath)
{
// pagination - par page
if ($request->get('pp') !== null && in_array($request->get('pp'), [5,10,30,50,100,500,'all'])) {
$this->limit = ($request->get('pp') == 'all') ? null : $request->get('pp'); // == 1 pour "tous"
} else {
$this->limit = 10;
}
$this->articles = Article::where('status', $this->status)->orderBy($this->orderBy, $this->order)->paginate($this->limit);
$this->count = Article::where('status', $this->status)->count();
$this->articles->setPath($viewPath);
return $this;
}
/**
* Retourne la vue avec les variables à lui envoyer
*
* @param $request
* @param string $viewPath
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
private function returnView($request, $viewPath)
{
return view('admin/article/'.$viewPath, [
'articles' => $this->articles,
'count' => $this->count,
'tableHrefH1' => $this->tableHrefH1,
'tableClassH1' => $this->tableClassH1,
'tableHrefLastEdit' => $this->tableHrefLastEdit,
'tableClassLastEdit' => $this->tableClassLastEdit,
'getQ' => ($request->get('q') !== null) ? $request->get('q') : null,
// --- /pour cumuler les liens ---
]);
}
En gros, j'ai une liste d'article publiés (status 1), une liste d'article en brouillons (status 2), une liste d'article en corbeille (status 3).
Merci
Oui c est vrai. du moins, + comme ceci :
public function index(Request $request)
{
$this->status = 1;
$this->redirect = false;
$this->orderBy($request, $redirect)->runArticles($request, route('admin_article_index'));
if($this->redirect) return redirect()->...;
return $this->returnView($request, 'index');
}
Mais ajouter le header location me fait 2 lignes de code en moins. Donc je pense finalement laisser le header.
Merci à tous.
Non pas les $this->redirect, parce que c'est une variable locale pas pour la classe ;)
Tu peux mettre le header mais attention, parce que tu termineras pas la requête et il y a des choses qui risquent de ne pas se faire