Filtre avec menu dropdown

Fermé
MrBushido - 23 juin 2022 à 09:37
 MrBushido - 29 juin 2022 à 11:03
Bonjour à tous !

Je travaille actuellement sur un projet en développement web et je dois afficher des produits issus d'une base de donnée avec un système de filtre.

C'est le système de filtre qui me pose un problème, c'est plusieurs menus dropdown avec des inputs radio à cocher et chaque menu à un bouton pour appliquer les filtre sélectionné. Ce qui fait que je peux sélectionner plusieurs filtres différents et afficher les produits concernés, mais je ne trouve aucune doc ou exemple avec ce système de filtre.
Tous les exemples que je trouve, c'est un bouton unique avec le filtre en question et au clique ça affiche directement les articles, moi je veux vraiment pouvoir faire plusieurs sélections avant d'appliquer le filtre et par la suite garder la sélection active tout en appliquant un autre type de filtre.

Est-ce que quelqu'un pourrait m'aiguiller svp ?
A voir également:

11 réponses

jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
23 juin 2022 à 11:14
Bonjour,

Site web codé à la main ou en utilisant un CMS ?

Données stockées en BDD ?

Rafraichissement des données en PHP ( via un formulaire), ou en AJAX ?

Et puis.. quelles connaissances as tu ?
- Sais tu coder ?
- Sais tu faire des formulaires en html/php ?
- Sais tu faire des IF/ELSE en PHP ?
- Sais tu faire du JS ?
- Sais tu faire de l'ajax ?
- Sais tu faire des requêtes SQL ? avec des conditions ( WHERE.. AND.. OR... ) ?





0
Bonjour,

Site codé à la main et je veux utiliser de l'AJAX

Oui, les données sont stockées en BDD importé avec un csv.

Oui, je sais faire des formulaires html/php
Je sais faire des boucles en php/js
L'AJAX j'en ai déjà fait, mais je veux me perfectionner, d'où ma volonté de faire de l'AJAX sur ce projet
Et oui je sais faire des requêtes SQL, j'ai fait plusieurs scripts pour remplir chaque table etc, en ce moment je boss sur les requêtes pour afficher les éléments dont j'ai besoin sur le site.

Désolé pour le manque de précision sur tout ça sur mon premier post.
0
Salut,
le plus simple est d'abord de faire une liste des filtres possible et regarder si cela correspond avec les données de la base.
Utiliser un formulaire pour les filtres avec genre des cases à cocher puis trier selon les critères.
AJAX semble le mieux (pour éviter de multiplier les requêtes/temps de chargement) mais sinon en SQL c'est déjà possible de faire tout les filtres que l'on veut tant que votre modèle de données est cohérent avec l'utilisation voulue.

Exemple simpliste pour l'idée:

Venant d'une table "Article"
id article, nom article, type article, couleur article

Un formulaire présenterait la possibilité de trier par couleur et/ou par type article, donc soit une case à cocher pour chaque couleur possible(faite dynamiquement ou pas) soit une liste des catégories correspondant au type d'article.

tri par couleur:
[_] rouge , [_] vert , [_] bleu

tri par catégorie(type d'article)
sélectionnez la catégorie dans la liste déroulante:
_outil jardin
_cuisine
_animalerie
_...

En faisant directement une requête cela revient à rajouter des clauses (pour la /les couleurs et le type article):
SELECT * FROM 'article' WHERE couleur='rouge';

Avec autant de clauses ET ou OU que nécessaire(ou des sous-requête pour plus d'élégance).

En AJAX cela revient au même mais dépends de la façon dont vous structurez les données de la base. Que ce soit XML ou JSON(plus pratique) une notation objet est souhaitable ensuite il faut boucler dessus pour faire un tri en fonction des critères.
Votre question n'est pas du tout claire et je ne vois pas ce qui vous bloque.

Pour mon exemple simpliste et peut-être très différent de vos données une structure JSON ressemblant à cela sera facile à utiliser:

{
 article1:{
 id:1,
 nom:'bidule',
 type:'cuisine',
 couleurs:['rouge','jaune']
 },
article2:{
 id:2,
 nom:'truc',
 type:'jardin',
 couleurs:['noir']
 }
/** etc...*/
}


Donc parcourir la liste d'objet pour faire une liste (Array) de ceux correspondant aux critères.
Puis utiliser cette liste dans l'affichage en région répétées.

Rien que de très basique et effectivement il n'y aura pas d'exemples possible puisque tout cela dépends des données de chaque table et critères utilisées.
Bien sûr si la conception des tables est mal faite cela sera plus complexe inutilement voire simplement impossible(ex: trier la couleur si il n'y a pas de champs qui indiquent la couleur possible d'un article)
-1
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
23 juin 2022 à 14:17
Donc,
Commence par mettre les champs necessaires à tes filtres dans ton html ainsi qu'un bouton "rechercher"

Ensuite,
Associe l'évènement click sur ton bouton pour qu'il déclenche une fonction
Dans cette fonction, récupère la valeur de chacun des champs de ton formulaire et envois les dans ton appel ajax.
Côté PHP, récupères les données envoyées par l'ajax, et pour chaque donnée "non vide", créé une condition supplémentaire pour ta requête SQL.
Retourne le résultat de cette requête au format json
Et enfin, dans le "success" de ton ajax, boucle sur le résultat obtenu pour générer l'affichage..


Si tu veux plus d'aide, reviens nous voir avec le code déjà écrit et en expliquant sur quelle partie tu bloques exactement.

NB: Pour poster ton code sur le forum, tu devras utiliser les balises de code.
https://forums.commentcamarche.net/forum/affich-37598670-mise-en-forme-du-forum-et-des-fiches-pratiques-ccm#les-codes-sources

0
Merci pour vos réponses ! Je vais essayer de m'avancer un peu sur mon code et mes requêtes et je reviendrais vers vous si je bloque un peu trop longtemps sur le même point !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Rebonjour !

Du coup, avant d'arriver au filtre, j'ai rencontré d'autres soucis en chemin. Je vais essayer d'exposer mon problème le plus explicitement possible.

J'ai un menu dropdown sur mon site pour filtrer des voitures, et dans ce menu dropdown j'affiche toutes les marques de voiture qu'il y a dans ma table "Brands" dans ma BDD.
Je les affiche avec une requête SQL et un Foreach

Et donc jusqu'ici tout fonctionne, sauf que dans ma BDD j'ai une autre table, la table "Voiture", cette table voiture est liée à ma table "Brands", ce qui me permet de catégoriser les différents modèles avec l'id de la marque qui correspond.

Moi, dans mon menu dropdown, à côté de Peugeot, j'aimerais avoir le nombre total de Peugeot différentes présentes dans ma BDD.

Donc imaginons que dans ma table "Voiture" j'ai une 205 blanches, une deuxième 205 mais noir, une 206 et une 208, toutes avec l'id de la marque Peugeot, donc l'id "1" lorsque j'exécute la requête :

"SELECT COUNT (model_name) FROM Cars WHERE brans_id_brands = 1;"

Je récupère bien le chiffre 4.

Mais moi j'ai plusieurs modèles dans ma table avec plusieurs id de marque différente, et j'aimerais que pour chaque modèle ça me retourne automatiquement le bon total pour chaque marque, mais je n'arrive pas à faire une requête ou une boucle qui compte le nombre total des différentes voitures présente dans la BDD selon la marque.

J'ai essayé d'être le plus claire possible, mais ce n'est pas évident à l'écrit.

Merci d'avance d'avoir pris le temps de me lire et de me comprendre !
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
27 juin 2022 à 14:59
Bonjour,

Le mieux serait de le faire en ajax également.
Lors du changement de value dans ta liste déroulante "marque", tu fais un appel ajax qui va chercher le nombre de véhicules concernés.
Tu pourrais même retourner la liste des véhicules en question pour n'afficher que ceux la dans ta deuxième liste...
0
Merci pour ta réponse Jodrane!

Comme je l'ai expliqué, j'arrive à afficher le nombre de véhicules concerné pour une marque, mais je n'arrive pas à afficher le nombre de véhicules concerné pour chaque marque automatiquement.
Et je n'arrive pas à bien formuler ma demande sur Google pour faire des recherches...
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
27 juin 2022 à 15:06
Tu y arrives ... en ajax ??
Car c'est bien ça le mot clé de ta recherche ....
0
Oui ?
Par exemple, les marques, je les affiche comme ça :

<?php $query = ("SELECT brand_name FROM brands");
$stmt = $conn->prepare($query);
$stmt->execute();
$posts = $stmt->fetchAll(PDO::FETCH_OBJ);
foreach ($posts as $post) :
echo "
<div class='px-4 my-2 flex justify-between'>
<div class=''>
<input type='checkbox' id='brand_check'>
<label for='brand_check'>". $post->brand_name."
</label>
</div>
<div class='flex justify-center items-center w-[50px] bg-#b3c3e4 rounded-sm'>
<p class='text-xs text-#8593b0'>101</p>
</div>
</div>"; endforeach ?>


Mais bon ça, c'est au chargement de la page, je pensais afficher le nombre de véhicules concerné au chargement aussi, si c'est mieux en Ajax je le ferai en Ajax mais avant ça il faudrait déjà que je trouve la bonne requête..
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
27 juin 2022 à 15:27
tu peux toujours faire une seconde requête qui fait le COUNT avec un GROUP BY et utiliser ces résultats directement au chargement de la page
0
Ouais mais, moi j'arrive à afficher les marques uniquement en utilisant " WHERE brands_id_brands =1;" il faudrait que je trouve comment boucler ça et faire en sorte qu'il compte le bon nombre de Peugeot, de Renault, de Mercedes, sans lui préciser l'id de la marque le tout en une seul requête
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
27 juin 2022 à 15:40
Tu vire le WHERE .. et tu mets un GROUP BY tel que je te l'ai déjà dit ....

Mais bon.. là .. on est parti sur une autre question...
Il serait donc bien de créer une nouvelle discussion ( à placer dans le forum PROGRAMMATION / PHP )
Pense à donner la structure de tes tables ...
0
Ah au temps pour moi j'avais mal compris !

Ma question sur les filtres est toujours d'actualité, mais en route j'ai bloqué sur ce problème, mais je crois bien que tu viens de le résoudre, merci !

Je n'ai pas voulu créer une nouvelle discussion puisque ça concerne le même sujet mais la prochaine fois, je le ferai.

Concernant le système de filtre, tu m'avais conseillé de mettre les champs nécessaires aux filtres ainsi qu'un bouton qui serait lié à un événement click qui déclenche une fonction qui récupère la valeur de chacun des champs et les envois en Ajax.

Je suis actuellement sur la fonction en question, je n'arrive pas à récupérer les data de mes checkbox
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
27 juin 2022 à 16:24
qu'as tu essayé ?
Sais tu codé en Javascript ? ( par ce que là, il suffit de regarder leur propriété checked )
0
Je ne m'exprime pas assez bien, désolé pour ça.

J'ai 3 menus dropdown avec chacun des checkbox et un bouton appliqué.

Pour l'instant j'ai fait ça pour récupérer mes boutons :

filter_button = document.querySelectorAll("#apply_filter");

// loop all buttons
filter_button.forEach(filter => {

  filter.addEventListener("click", ()=> {
  console.log(filter);
  // get all data from filter

  const form = new FormData();
  form.append("brand", "data");

  fetch('index.php', {
    method: 'POST',
    body: form,
    })

    .then(res => {
      return res.json();
  })
  .then(response => {
    console.log(response);
    })
  });

});


Je récupère mes boutons au click mais le console.log(response) m'affiche une erreur :

"Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 8"

Je cherche actuellement pourquoi j'ai cette erreur.

Pour les boutons checked j'utilise ça pour vérifier ce qui est checked:

    let checkboxes = document.querySelectorAll('input[name="brand"]:checked');
    let values = [];
    checkboxes.forEach((checkbox) => {
      values.push(checkbox.value);
    });


Et j'essaye de le lier au même événement click que pour appliquer les filtres.


EDIT: Ajout des balises de code ( encore ...)
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
27 juin 2022 à 17:35
Pour debuguer de l'ajax, il faut utiliser le navigateur FIREFOX
Ouvrir la console
Cocher le debug XHR
et regarder, dans la console, la ligne qui concerne ton appel ajax...





NB: Il se peut que le souci vienne du script php appellé par ton ajax .... qui ne doit pas être le même fichier que la page que tu affiches actuellement.. mais un script php à part qui ne sert qu'à récupérer les informations voulues.

PS: Pour poster du code sur le forum, tu dois utiliser les balises de code ET y préciser le LANGAGE

Explications à lire ici : https://forums.commentcamarche.net/forum/affich-37598670-mise-en-forme-du-forum-et-des-fiches-pratiques-ccm#les-codes-sources
0
Désolé pour les balises du code.

Pour débugger l'AJAX on peut utiliser Chrome aussi, dans l'inspecteur, réseau, fetch/XHR et on sélectionne le fichier en question, mais c'est plus intuitif sur Firefox, c'est vrai.

J'ai avancé un peu sur l'Ajax, je récupère les checkbox coché, j'arrive à mettre une condition qui dit " si cette case est checked crée un élément p" etc, mais je n'arrive pas à faire marcher tout ça avec des requêtes SQL..

Et je n'arrive pas non plus à sélectionner le bon nœud dans mon body, quand je clique sur le bouton j'ai bien une balise "p" qui se crée, mais pas au bon endroit.

Et j'ai plein de zone d'ombre dans ma réflexion pour la suite du projet, étant donné que je veux faire un système de filtre avec des images qui changent selon le filtre sélectionné, est ce que je crée les div avant et je change uniquement le contenu en Ajax ou est ce que je crée tout en ajax directement, et est ce que je crée une deuxième page ou au click c'est la page complète qui change de design le tout en Ajax ou est ce qu'au click je fais appel à une autre page et je change le contenu en Ajax, je ne sais pas trop comment aborder tout ça...
0