Filtrer un tableau d'objet en JS et PHP

Résolu/Fermé
kebabita - 22 août 2022 à 15:52
 kebabita - 22 août 2022 à 19:17

Bonjour,

J'essaye de filtrer les données de ma page web grâce à des menus déroulants. Pour cela j'utilise PHP qui va me permettre de récupérer les données dans un tableau initial et ensuite j'utilise la fonction filter() en JS qui va créer un nouveau tableau sans modifier l'initial avec les critère sélectionnés . J'obtiens comme résultat :

-- tableau initial  : j'ai toute les données 

-- nouveau tableau : vide 

en fonction des critères qu'on sélectionne au fur et à mesure je veux que les données s'affichent aussi au fur et à mesure mais je n'arrive pas à faire en sorte que le nouveau tableau ne soit pas vide.

Voici ce que j'ai fait :

fonction JS

function filtre(){
    var filtreRef = document.getElementById('reference').value;
    var id_etat = $("#tetatSelect").val();
    var id_emp = $("#templacementSelect").val();
    var id_prod = $("#tproduitSelect").val();
    var id_vehicule = $("#tvehiculeSelect").val();


    var donnees = [];
    $.ajax({
        cache: false,
        url: '../data/getAll',
        type: 'POST',
        async: true,
        data: ({
            table : "balancelles",
          
        }),
        success: function (response, status){
            donnees = JSON.parse(response);
            console.log(donnees);
            var newArray = donnees.filter(function(bal){
                return  bal.etat == id_etat && 
                bal.emplacement == id_emp && 
                bal.produit == id_prod && 
                bal.vehicule == id_vehicule &&
                bal.reference == filtreRef;
            });
            console.log(newArray);
            var liste = '';
            if(newArray.length != 0){
                newArray.forEach(ref => liste +='<tr id="'+ ref.id +'"><td>' + ref.reference + '</td><td>'+ ref.numero +'</td><td>' + ref.etat+ '</td><td>' + ref.emplacement + '</td><td>' + ref.produit + '</td><td>' + ref.vehicule + '</td><td> -  </td><td><img id="'+ ref.id +'" class="btnmodifRef" style="margin-left: 25px" data-toggle="tooltip" src="" onclick="modifier(this)" id="modifier"></img><img id="'+ ref.id +'" class="btnmodifRef" style="margin-left: 25px" data-toggle="tooltip" src="" onclick="supprimer(this)" id="supprimer"></img></td></tr>' );

                document.getElementById("ligneReference").innerHTML = liste;
            } else {
                var toAdd = "";
                toAdd = '<tr id="0"><td colspan="9" class="nomReference">Aucune référence disponible !</td></tr>';
                $("#ligneReference").html(toAdd);   
            }
        },
        
        error: function (response, status) {
            console.log(response);
            console.log(status);
        }
    });    
}

Ma requête sql selectionne seulement toutes les données se trouvant dans la table concernée

merci d'avance

A voir également:

1 réponse

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
22 août 2022 à 17:05

Vu que tu vas chercher les  données de ton tableau en Ajax .. pourquoi vouloir faire du filter sur ton js ? Pourquoi ne pas directement ne retourner que les données (déjà filtrées par ton php/sql )

Sinon, quel est l'intérêt d'alimenter ce tableau en ajax ??


0

Les données issues de php/sql ne sont pas filtrées. C'est à partir de l'interface web quand l'utilisateur sélectionne des critères pour affiner sa recherche et donc afficher un tableau filtré à partir de l'interface et non à partir de la base de données étant qu'un utilisateur n'a pas accès à la base de données :) 

Mais dans tout les cas j'ai réussi à résoudre mon problème merci quand même.

0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > kebabita
22 août 2022 à 17:59

Mais.. mais....mais...   tu comprends à quoi sert l'ajax ?

par ce que.. c'est justement pour éviter de faire transiter l'intégralité des données de ta table dans ta page que tu peux l'utiliser afin de n'afficher que les données souhaitées en fonction des filtres ...

Mais vu ta réponse, je pense que le principe de fonctionnement t'échappe...

J'espère pour toi que tu ne vas pas avoir, sur le long terme.., beaucoup de données stockées dans ta bdd.. sinon tu verras vite de grosses lenteurs dans ta page

0
kebabita > jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024
22 août 2022 à 18:25

Désolé mais pour moi Ajax permet de modifier partiellement les données (côté utilisateur) sans à avoir à actualiser la page intégralement et rendre la page dynamique.

De plus les données de ma table ne s'affiche pas au chargement de la page, elles s'affichent seulement quand l'utilisateur sélectionne des critères (coté interface). Ainsi, il obtient une page avec des données filtrés selon SES critères. Je ne peux filtrer des données au préalable sachant que je ne peux pas forcément savoir ce que veut voir l'utilisateur afficher. Cette page sert d'inventaire au passage. 

En plus d'être impoli, vous n'êtes pas très aimable pour une personne se trouvant sur un forum d'aide. 

Passer quand même une bonne soirée. 

0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > kebabita
22 août 2022 à 18:55

Je ne vois pas en quoi j'aurais pu être impoli...

J'essaie juste de t'expliquer qu'il ne faut pas charger toutes les données en Ajax puis les filtrer en javascript mais directement, grâce à l'Ajax, filtrer les données que tu récupères côté base de données avant de les renvoyer dans ta page...

Pour ça, tu transmets dans ton appel ajax, les différents filtres dans la variable data... Tu effectues le traitement côté PHP afin de ne requêter que ce que tu souhaites obtenir puis, dans le success de ton Ajax, tu affiches les données ainsi récupérées.. cela évite de travailler côté client, sur des centaines milliers ou plus de ligne le traitement étant beaucoup plus rapide et performant via des requêtes SQL.

0
kebabita > jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024
22 août 2022 à 19:17

Vous n’avez pas écrit « bonjour » ou « bonsoir »lors de votre première réponse. C’est la moindre des politesses lorsqu’on s’adresse à quelqu’un. 
 

Je comprends mieux où vous voulez en venir expliqué de cette manière. 
J’ai justement utilisé quelque chose de similaire au début mais rencontrant beaucoup de problèmes et après avoir chercher sur internet je suis tombée sur la fonction filter() qui me paraissait simple à réaliser et à exécuter. J’essayerai de faire tel que vous me l’avez expliqué pour éviter d’éventuelles chargement lent de la page sur le long terme. 

0