Laravel 5

Comment conserver les filtres d'un index après aller-retour consultation ou édition

Avatar de bdfi
bdfi

Bonjour,

Comme le titre l'indique, je souhaite retrouver mes filtres (mais aussi tris et n° de page) sur une liste après avoir consulté ou édité un des éléments.

Exemple : après filtre, j'ai un index avec URL de type : .../public/admin/auteurs?nbr=15&f_nom=A&f_prenom=I&sort=date_naiss&order=asc&page=5 Je consulte un enregistrement : .../public/admin/auteurs/6083

Et je veux revenir sur l'index en conservant les filtres initiaux. Quelles sont les solutions ?

  • Repasser la même liste de paramètres à la consultation (mais peut-être un peu bidouille, par exemple formater la chaîne des param dans le controller pour l'ajouter aux boutons/liens consulter et éditer).
  • A moins qu'il y ait moyen de reflasher le "old input" qui contient encore les paramètres, ça se fait (pas trouvé !) ?
  • Ou passer par des variables de session ? mais là, impact code qui semble beaucoup plus important...
Posté il y a 4 ans
Avatar de bdfi
bdfi

J'ai trouvé une piste, en mixant le "reflashage" et la récupération... Dans le controlleur, consultation et édition, je reflash avant d'appeler la vue :

		$request->session()->reflash(); 

Et dans l'index, pour chaque élément du filtre, je teste si l'élément existe dans l'URL (has) et dans l'ancien input (old). Si dans old, je le reinsère (merge). Un peu lourdingue ! :

		if ($request->has('f_nom'))
		{
			$query->where('auteurs.nom', 'like', '%' . $request->input('f_nom') . '%');
			$filtre = true;
		}
		elseif ((!$request->exists('f_nom')) && ($request->old('f_nom') != ""))
		{
			// Et seulement si "f_nom=" n'existe pas dans l'URL pour que le reset de filtres fonctionne
			$query->where('auteurs.nom', 'like', '%' . $request->old('f_nom') . '%');
			$request->merge(['f_nom' => $request->old('f_nom')]);
			$filtre = true;
		}

Ca à l'air de fonctionner ! Là ou c'est pas très propre, c'est que pour un même filtre, les paramètres parfois apparaissent dans l'URL et parfois pas... Si je change de page ou de filtre, hop, ça revient :) Quelqu'un connaît une solution plus jolie, plus rapide ou plus souple ?

Y-a-t-il moyen de passer par des valeurs uniquement en session ? Si oui, comment remplace-t-on les formulaires ?

  {!! Form::text('f_nom', old('f_nom'), ['class' => 'form-control', 'placeholder'=>'Nom...', 'size'=>'10']) !!}
Posté il y a 4 ans
Avatar de bestmomo
bestmomo

Salut,

Et un bête bouton de retour sur la page puisqu'elle est déjà en cache ?

Posté il y a 4 ans
Avatar de bdfi
bdfi

Hello, Oui, mais ça limiterai aux cas de retour (depuis consultation) et annulation (d'édition), or nous voudrions conserver les filtres tant qu'on reste sur des manipulations sur un index donné, donc aussi si on fais une modif en édition, ou si on passe de la consultation à l'édition puis annulation ou modification. Avec le reflash, ça fonctionne, mais c'est un peu lourd... J'ai un peu allégé le code en faisant en deux temps, d'abord avec une simple boucle pour voir s'il y a des old pour chaque filtre et si oui les remettre dans la requête :

foreach (array('f_nom', 'f_prenom', 'f_legal', 'f_pays', 'f_bio', 'page', 'sort', 'order') as $filter) {
    if ((!$request->exists($filter)) && ($request->old($filter) != ""))
    {
        $request->merge([$filter => $request->old($filter)]);
    }
}

Puis filtrer en ne testant que la requête :

if ($request->has('f_nom'))
{
    $query->where('auteurs.nom', 'like', '%' . $request->input('f_nom') . '%');
}
if ($request->has('f_prenom'))
{
    $query->where('prenom', 'like', '%' . $request->input('f_prenom') . '%');
}
...

Par contre il va falloir que je sois sélectif avec le reflash, car sinon, même en annulant j'ai l'affichage des messages temporaires de type "Modification XXX effectuée" ! En fait non, pas de problèmes, j'avais un simple reflash de trop dans l'index...

Posté il y a 4 ans
Avatar de bdfi
bdfi

Vu que je n'ai pas trouvé mieux, et que ça marche, je marque comme résolu :-)

Posté il y a 4 ans

Vous ne pouvez pas répondre à ce sujet.