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.

Ce que je fais

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);

Ce que j'obtiens

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.

Aucune réponse