Filtrer des résultats d'une recherche sans rafraîchir toute la page

Filtrer des résultats d'une recherche sans rafraîchir toute la page - HTML/CSS - Programmation

Marsh Posté le 12-09-2006 à 14:27:03    

J'essaye de filtrer les résultats dynamiquement d'une requête PHP/MySQL. Merci pour votre aide.
 
[1] Table :
Column A | Column B  
car | blue  
car | red  
car | blue  
truck | blue  
truck | red  
truck | green  
 
[2] Barre de recherche : recherche dans colonne A et retourne les résultats trouvés :  
si on cherche "car" :  
car | blue  
car | red  
car | blue  
 
Cette étape [2] est une requête PHP/MySQL standard qui ne me pose pas de problème.
 
[3] Si maintenant un checkbox permet de filtrer les résultats en fonction de la couleur : j'ai essayé de donner le même ID (=couleur) à chaque ligne de résultat, puis rien mis dans le <div> correspondant quand la case est décochée, mais cela ne marche que pour le premier résultat de chaque couleur, chaque ID devant être unique.
 
C'est un cas assez classique il me semble de rafraîchissement des résultats d'une requête sans rafraîchir toute la page, en javascript / ajax.
 
Merci beaucoup pour votre aide ou pour les liens vers des bouts de scripts existants.

Reply

Marsh Posté le 12-09-2006 à 14:27:03   

Reply

Marsh Posté le 12-09-2006 à 16:21:18    

bon j'ai eu besoin d'un truc a peu près similaire y'a pas longtemps, donc j'ai viré plein de truc que te servirait à rien et un peu adapté, ça doit marcher en gros comme tu veux ( mais il doit rester des modifs à faire)...

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2.   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
  4. <head>
  5.   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
  6.   <title>Exemple</title>
  7.   <script type="text/javascript">
  8.   function init(){
  9.     var trNodes = document.getElementById('results').getElementsByTagName('tr');
  10.     var resNodes = new Array();
  11.     for(var i=0; i<trNodes.length; i++){
  12.       if (trNodes[i].childNodes[0].tagName == 'TH'){
  13.         var thNodes = trNodes[i].getElementsByTagName('th');
  14.         for(var j=0; j<thNodes.length; j++){
  15.           Filter.prototype.fields.push(thNodes[j].innerHTML);
  16.         }
  17.       } else if ( trNodes[i].childNodes[0].tagName == 'TD'){
  18.         resNodes.push(trNodes[i]);
  19.         var tdNodes = trNodes[i].getElementsByTagName('td');
  20.         for(var j=0;j<tdNodes.length; j++){
  21.           trNodes[i].setAttribute(Filter.prototype.fields[j], tdNodes[j].innerHTML);
  22.         }
  23.       }
  24.     }
  25.     var cf = new Filter('cf', 'color', resNodes);
  26.     var tf = new Filter('tf', 'type', resNodes);
  27.   }
  28.   function Filter(obj, field, nodes){
  29.     this.nodes = nodes;
  30.     this.node = document.getElementById(obj)||obj; //gatsu's style
  31.     this.node.innerHTML='<option value="">ALL</option>';
  32.     var fIndex = Filter.prototype.fields.indexOf(field);
  33.     this.values = new Array();
  34.     for(var i=0; i<nodes.length; i++){
  35.       if ( this.values.indexOf(nodes[i].getElementsByTagName('td')[fIndex].innerHTML) == -1){
  36.           this.values.push(nodes[i].getElementsByTagName('td')[fIndex].innerHTML);
  37.           var optNode = document.createElement('option');
  38.           optNode.value = nodes[i].getElementsByTagName('td')[fIndex].innerHTML;
  39.           optNode.innerHTML = nodes[i].getElementsByTagName('td')[fIndex].innerHTML;
  40.           this.node.appendChild(optNode);
  41.       }
  42.     }
  43.     var self = this; //mIRROR's style
  44.     this.node.onchange = function(e){
  45.       self.display(field, this.options[this.options.selectedIndex].value);
  46.     }
  47.   }
  48.   Filter.prototype.display = function (field, value){
  49.     Filter.prototype.activeFilters[field] = value;
  50.     for(var i=0; i<this.nodes.length; i++){
  51.       toDisplay = true;
  52.       for(filter in Filter.prototype.activeFilters){
  53.         if ( Filter.prototype.activeFilters[filter] != ''){
  54.           if (this.nodes[i].getAttribute(filter) != Filter.prototype.activeFilters[filter]){
  55.             toDisplay = false;
  56.           }
  57.         }
  58.       }
  59.       if( toDisplay){
  60.         this.nodes[i].style.visibility = 'visible';
  61.       } else {
  62.         this.nodes[i].style.visibility = 'hidden';
  63.       }
  64.     }
  65.   }
  66.   Filter.prototype.fields = new Array();
  67.   Filter.prototype.activeFilters = new Array();
  68.   window.onload = init;
  69.   </script>
  70. </head>
  71. <body>
  72.   <form action="pouet" method="post">
  73.   color:
  74.    <select name="color" id="cf">
  75.      <option value="">ALL</option>
  76.      <!-- full color list-->
  77.    </select>
  78.    type:
  79.    <select name="type" id="tf">
  80.      <option value="">ALL</option>
  81.      <!-- full type list-->
  82.    </select>
  83.   </form>
  84. <table id="results" summary="query results">
  85.   <tr><th>type</th><th>color</th></tr>
  86.   <tr id="r1"><td>car</td><td>blue</td>
  87.   <tr id="r2"><td>car</td><td>red</td>
  88.   <tr id="r3"><td>car</td><td>green</td>
  89.   <tr id="r4"><td>truck</td><td>blue</td>
  90.   <tr id="r5"><td>truck</td><td>red</td>
  91.   <tr id="r6"><td>truck</td><td>green</td>
  92. </table>
  93. </body>
  94. </html>


Si tu veux des explications sur un point précis demande!  
Si tu veux des explications sur tout, je passe mon tour ;)
 
edit:
Ah oui, l'idée c'est que les "<!-- full type|color list-->" soient quand même générées par ton serveur, si bien que si le js est desactivé tu aies tout de même des valeurs.  
Pour la même raison, si tu valides le formulaire tu ne dois afficher que les bons résultats ( mais coté serveur).


Message édité par anapajari le 12-09-2006 à 16:23:39
Reply

Marsh Posté le 12-09-2006 à 16:55:05    

ok cool, je vais étudier tout cela en détail. Merci beaucoup.

Reply

Marsh Posté le 13-09-2006 à 09:54:05    

Citation :


this.node = document.getElementById(obj)||obj; //gatsu's style


:D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed