Bonjour,
Après avoir suivi les vidéos de la Mise en pratique de la POO en PHP, j'essaye d'appliquer à ma problématique. Au lieu d'avoir une seule table Articles avec un filtre possible par catégorie, j'ai une table Jeux reliée à une table Plateformes et je voudrais filtrer par une ou plusieurs plateformes.
J'ai crée dans mon formulaire Twig index un Form avec une série de case à cocher correspondant aux plateformes.
<form action="{{ path('blog.filter', {search: lien})}}" method="post" >
{{ csrf_input() }}
{% set i = 0 %}
{% for row in platforms | batch(2) %}
<div class="row card-deck">
{% for p in row %}
{% set i = i+1 %}
<div class="card form-group border-0">
<label class="custom-control custom-checkbox" >
<input type="checkbox" id="{{ p.slug }}" name="platform[{{ i }}]" value="{{ p.slug }}" {% if p.slug in lien %}checked{% endif %} class="custom-control-input">
<span class="custom-control-indicator"></span>
<span class="btn btn-outline-primary" style="font-size: 0.7rem;">{{ p.name }}</span>
</label>
</div>
{% endfor %}
</div>
{% endfor %}
<button class="btn btn-primary" type="submit" >Filtrer</button>
</form>
Dans BlogModule.php, j'ai:
$blogPrefix= $container->get("blog.prefix");
$container->get(RendererInterface::class)->addPath("blog", __DIR__ . "/views");
$router= $container->get(Router::class);
$router->get($container->get("blog.prefix"), GameIndexAction::class, "blog.index");
$router->get("$blogPrefix/filter/{search:[a-z\,\:\-0-9]+}", FilterShowAction::class , "blog.filter");
$router->post("$blogPrefix/filter/{search:[a-z\,\:\-0-9]+}", FilterAction::class);
Dans cette configuration, j'arrive à filtrer en mettant en URL: /blog/filter/ios,web par exemple. Ensuite, mes cases à cocher associées au bouton Filtre me filtrent bien mes jeux. Ma pagination marche.
Mais si j'enlève toutes les coches (je fais alors une redirection sur /blog) ou si je mets en URL: /blog , j'ai une erreur:
Twig_Error_Runtime
An exception has been thrown during the rendering of a template ("Route `blog.filter` expects at least parameter values for [search], but received [search]").
puisque lien est vide, et que la route attend des paramètres après filter.
Si j'enlève dans form: action="{{ path('blog.filter', {search: lien})}}", c'est le contraire, j'ai l'Url /blog qui marche en GET, mais quand je veux filtrer, j'ai bien la methode Post, mais pas d'envoi de la variable platform[], ce qui me paraît logique. Si je tape mon Url /blog/filter/ios,web, ça filtre bien.
Je m'y prends sûrement mal pour obtenir ce que je veux: récupérer les informations de mes cases à cocher dans mon Url. J'y arrivais avec des variables de session, mais ça obère le fait d'utiliser des onglets de navigateur multiples, donc ça ne me va pas.
Merci.