11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour tout le monde,
Voilà, j'ai un petit et je n'arrive pas à le résoudre.
Je vais prendre un exemple pour vous exposer le problème.

J'aimerai, à l'aide de PHP/MySQL + de l'ajax, afficher quelque chose de ce genre :

upload/19911-pbaajx.jpg


Donc, comme vous pouvez le voir sur l'image, on saisi une date de début et une date de fin et ça nous affiche un tableau automatique (grâce à ajax). Chaque ligne du tableau c'est une commande passé par un client et au clique sur le + sur le coté, on affiche le détail (le nom du client, le nom du produit et le montant)

En m'inspirant de 2 sites, j'ai essayé de le faire, mais je n'y suis pas parvenu. Je crois que c'est un problème de DOM.

Site 1 (pour hmtl, PHP, mysql et ajax) : http://www.w3schools.com/PHP/php_ajax_database.asp
Site 2 (pour l'accordeon) : http://mediaformations.com/examples/AccordionTableExample.html

Pour cela, j'ai fais le code suivant :

- Page html

<html>
<head>

<script type="text/javascript">
function lesRep() 
{
	vdatedeb = document.getElementById("datedeb").value;
	vdatefin = document.getElementById("datefin").value;
	
	if(vdatedeb!="" && vdatefin!="")
	{
		//date deb
		var tabDatedeb = vdatedeb.split('/');		
		la_date_deb = tabDatedeb[2]+'-'+tabDatedeb[1]+'-'+tabDatedeb[0];
		
		//date fin
		var tabDatefin = vdatefin.split('/');		
		la_date_fin = tabDatefin[2]+'-'+tabDatefin[1]+'-'+tabDatefin[0];
	
	
		req = "WHERE date BETWEEN '"+la_date_deb+"' AND '"+la_date_fin+"'";
			
		showRep(req);
	}
}
</script>
    
<script type="text/javascript" src="select.js"></script>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
	
	$('table.CityTable th') .click(
		function() {
			$(this) .parents('table.CityTable') .children('tbody') .toggle();
		}
	)
	
	$('table.StateTable tr.statetablerow th') .click(
		function() {
			$(this) .parents('table.StateTable') .children('tbody') .toggle();
		}
	)
	

	
});
</script>
<style type="text/css">
	table.CityTable, table.StateTable{width:400px; border-color:#1C79C6; text-align:center;}
	table.StateTable{margin:20px; border:3px solid #1C79C6;}
	
	table td{padding:5px;}
	table.StateTable thead th{background: #1C79C6; padding: 10px; cursor:pointer; color:white;}
	table.CityTable thead th{padding: 10px; background: #C7DBF1;cursor:pointer; color:black;}
	
	table.StateTable td.nopad{padding:0;}
</style>


</head>
<body>



<table>
<tr>
<td align="center" class="liste"><input type="text" id="datedeb" name="datedeb" size="11" maxlength="10" 
class="text" onBlur="lesRep();"/></td>

<td align="center" class="liste"><input type="text" id="datefin" name="datefin" size="11" maxlength="10" 
class="text" onBlur="lesRep();"/></td>
</tr>
</table>
                    
<div id="txtHint">

</div>

</body>
</html>



- Page javascript (ou ajax)

var xmlhttp;

function showRep(str)
{
	xmlhttp=GetXmlHttpObject();
	if (xmlhttp==null)
	{
		alert ("Browser does not support HTTP Request");
		return;
	}

	var url="getrep.php";
	url=url+"?q="+str;
	xmlhttp.onreadystatechange=stateChanged;
	xmlhttp.open("GET",url,true);
	xmlhttp.send(null);
}

function stateChanged()
{
	if (xmlhttp.readyState==4)
	{
		document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
	}
}

function GetXmlHttpObject()
{
if (window.XMLHttpRequest)
  {
  // code for IE7+, Firefox, Chrome, Opera, Safari
  return new XMLHttpRequest();
  }
if (window.ActiveXObject)
  {
  // code for IE6, IE5
  return new ActiveXObject("Microsoft.XMLHTTP");
  }
return null;
}


- page PHP

<?php
$q=$_GET["q"];

$con = mysql_connect('localhost', 'root', '');
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("test", $con);

$sql= "SELECT * FROM commande ".$q;

$result = mysql_query($sql);

echo 
'<table class="StateTable" rules="all" cellpadding="0" cellspacing="0">
	<tr>
	 	<td>&nbsp;</td>
	 	<td>Date de la comande</td>
	 	<td>Nombre de produit</td>
		<td>Total</td>
		
  	</tr>
	<tr><td colspan="6">
';

while($row = mysql_fetch_array($result))
{

	echo '
	<table class="CityTable" rules="all" cellpadding="0" cellspacing="0"> 
	<thead>
	  <tr>
		 <th style="width:5%">+</th>
		 <th style="width:20%">'.$row['date'].'</th>
		 <th style="width:55%">'.$row['nb_produit'].'</th>
		 <th style="width:20%">'.$row['total'].'</th>
	  </tr>
	</thead>
	<tbody>';
	


	$req2 = mysql_query("SELECT * FROM detail WHERE id_commande=".$row['id']);
	while($row2 = mysql_fetch_array($req2))
	{
		$req3 = mysql_query("SELECT * FROM user WHERE id=".$row2['id_user']);
		$row3 = mysql_fetch_array($req3);
		$nom= $row3['nom'];	
		
		$req4 = mysql_query("SELECT * FROM produit WHERE id=".$row2['id_produit']);
		$row4 = mysql_fetch_array($req4);
		$nom_produit= $row4['nom'];
		$prix= $row4['prix'];		
	  

		echo "<tr>";
		echo "<td>&nbsp;</td>";
		echo "<td>" . $nom. "</td>";
		echo "<td>" . $nom_produit . "</td>";
		echo "<td>" . $prix. "</td>";
		echo "<tr>";
		
	}

	echo "</tbody>";
	echo "</table>";
		
}
  
  
echo "</td></tr></table>";

mysql_close($con);
?>



Merci pour votre aide !!!

ps : n'hésitez pas à tester le code
Modifié par spider (27 Dec 2009 - 11:28)
salut

accordeon!? hà ben non! et quitte à utiliser jquery autant le faire jusqu'au boût. et plutôt que la charger sur google autant le faire directement en local. http://jquery.com/


var xmlhttp;  function showRep(str) {
xmlhttp=GetXmlHttpObject();
if (xmlhttp==null) {....


jquery fait aussi la même chose sans avoir besoin de l'écrire idem pour tout le reste de tes js non jquery. et tu gagnes en maintenance et en portions de code à écrire. pour ce que tu cherches à faire il existe moults plugins sur le site.

quant au php, ta variable get est ouverte à tous vents...plutôt comme çà, en tout cas pour sécuriser un minimum.


<?php
$con = mysql_connect('localhost', 'root', '');
if (!$con) {   
    die('Could not connect: ' . mysql_error());
} else {
    mysql_select_db('test', $con);
}
if (!empty($_GET['q'])) {
    $q = trim(mysql_real_escape_string($_GET['q']));
} else {
    $q = trim(mysql_real_escape_string('valeur par defaut'));
}
?>


il n'y à forcement une erreur...c'est du css et pas du js Smiley cligne

<script type="text/javascript">table.CityTable, table.StateTable{width:400px; border-color:#1C79C6; text-align:center...</script>

Modifié par keran (28 Dec 2009 - 11:15)
Bonjour,
Tout d'abord merci pour ta réponse.

Je suis entièrement d'accord avec toi, mais mon problème se pose uniquement sur une histoire d'accès (de niveau) avec le DOM.

En fait le tableau récupéré en AJAX arrive dans un <div> </div>.

Or, le code
[code=javascript]   
    $('table.CityTable th') .click( 
        function() { 
            $(this) .parents('table.CityTable') .children('tbody') .toggle(); 
        } 
    ) 


travail sur les classes qu'utilise le tableau.


Je pense qu'il y a un truc du genre $('txtHint.table.CityTable th') .click( .....

Mais je n'arrive pas à trouver la bonne syntaxe !!!
re

je n'ai plus le temps de tester pour l'instant mais voilà une base qui fontionne en appliquant un display: none aux trois cellules à cacher.

<html>
<head>
<style type="text/css">     
table.CityTable, table.StateTable{width:400px; border-color:#1C79C6; text-align:center;}     
table.StateTable{margin:20px; border:3px solid #1C79C6;}          
table td{padding:5px;}     
table.StateTable thead th{background: #1C79C6; padding: 10px; cursor:pointer; color:white;}     
table.CityTable thead th{padding: 10px; background: #C7DBF1;cursor:pointer; color:black;}          
table.StateTable td.nopad{padding:0;}
.cache {
display: none;
}
</style>
<script type="text/javascript" src="jquery.min.js"></script> 
<script type="text/javascript">
function montre(num) { 
	$(document).ready(function(){
		//var deplie = '+';
		//var replie = '-';
		//var visible = false;
	
		//$(this).html( (!visible) ? deplie : replie);
	
		$('.rang'+num).toggleClass('cache');
	}); 
}
</script> 
</head>
<body>
<table class="StateTable" rules="all" cellpadding="0" cellspacing="0">     
<tr>          
<td id="ouvre-tout">-/+</td>         
 <td>Date de la comande</td>          
 <td>Nombre de produit</td>         
 <td>Total</td>                
 </tr>     
<tr>
<td colspan="6">
<table class="CityTable" rules="all" cellpadding="0" cellspacing="0">      
<thead>       
<tr>          
<!--<th style="width:5%">+</th>-->          
<th style="width:25%">28/12/2009</th>          
<th style="width:55%">2 produits</th>          
<th style="width:20%" colspan="2">2 €</th>       
</tr>    
</thead>     
<tbody>
<tr>
<td class="ferme"><a href="#" onclick="montre(1)">+</a></td>
<td class="rang1">titi toto</td>
<td class="rang1">produits 1</td>
<td class="rang1">1 €</td>
</tr>
<tr>
<td class="ferme"><a href="#" onclick="montre(2)">+</a></td>
<td class="rang2">tata titi</td>
<td class="rang2">produits 2</td>
<td class="rang2">1 €</td>
</tr>
</tbody>
</table>
</td>
</tr>
</table>
</body>
</html>
Merci beaucoup pour ta réponse.

Je viens d'essayer et.... ça ne fonctionne pas !

En fait, ton code fonctionne, mais dès que je le sépare en mettant le tableau en tant que résultat renvoyé par ajax dans le <div> </div>, ça ne fonctionne plus.

D'après moi, c'est une histoire d'accessibilité avec le DOM.

Il doit y avoir quelque chose du genre
$('txtHint.rang'+num).toggleClass('cache');
ou
$('#txtHint.rang'+num).toggleClass('cache');
rere

Manipuler des tableaux avec jquery...Houà! c'est du sport! c'est une première pour moi, je ne les utilises pratiquement plus depuis bien longtemps, hormis au boulôt. Et d'ailleurs tu parles d'un renvoi d'un div par alors pourquoi ne pas mettre en forme en div directement? Ce serait surement plus simple d'accés.

je me suis quand même bien amuser avec ce code et finalement çà ne passe qu'avec un seul tableau entre autre avec ie 6/7/8, principalement à cause des table-row, table-cell, forcement. Pas de tableaux imbriqués, en tout cas, et après bien des tests j'ai une solution, pour la présentation du moins, celle voulu au début. ce code inclus le div et ... la table Smiley bawling du formulaire et il fonctionne et c'est la présentation que tu souhaites.

<html> 
<head> <style type="text/css">      
table.CityTable, table.StateTable{width:600px; border-color:#1C79C6; text-align:center;}      
table.StateTable{margin:20px; border:3px solid #1C79C6;}           
table td{padding:5px;}      
table.StateTable thead th{background: #1C79C6; padding: 10px; cursor:pointer; color:white;}      
table.CityTable thead th{padding: 10px; background: #C7DBF1;cursor:pointer; color:black;}           
table.StateTable td.nopad{padding:0;} 
.cache { display: none; } 
</style> 
<script type="text/javascript" src="jquery.min.js"></script>  
<script type="text/javascript"> 
//function montre(num) {      
	$(document).ready(function(){         
		//var deplie = '+';         
		//var replie = '-';         
		//var visible = false;              
		//$(this).html( (!visible) ? deplie : replie);

		$('tr.parent')
		.css("cursor","pointer")
		.attr("title","Cliquez pour ouvrir")
		.click(function(){
			$(this).siblings('.rang-'+this.id).toggleClass('cache');
		});
		//$('tr.rang-'+this.id).hide();
		//$('.rang'+num).toggleClass('cache');     
	});  
//}
</script>  
</head> 
<body> 
<table> 
<tr> 
<td align="center" class="liste">
<input type="text" id="datedeb" name="datedeb" size="11" maxlength="10"  class="text" onBlur="lesRep();"/>
</td>  
<td align="center" class="liste"><input type="text" id="datefin" name="datefin" size="11" maxlength="10"  class="text" onBlur="lesRep();"/></td> 
</tr> 
</table>                      
<div id="txtHint">
<table class="StateTable" cellpadding="5" cellspacing="1">
<thead>      
<tr>           
<th style="width:5%">&nbsp;</th>           
<th style="width:25%">Date de la commande</th>            
<th style="width:55%">Nombre de produit</th>           
<th style="width:20%">Total</th>                  
</tr>       
</thead>
<tbody>       
           
<tr class="parent" id="1">
<td><a href="#">+</a></td>           
<td>28/12/2009</td>           
<td>2</td>           
<td>2 €</td>        
</tr>

<tr class="rang-1 cache"> 
<td class="rang-1-b">&nbsp;</td> 
<td class="rang-1-b">titi toto</td> 
<td class="rang-1-b">produits 1</td> 
<td class="rang-1-b">1 €</td> 
</tr>

</tbody> 
</table>
</div>
</body> 
</html>

le hic, c'est tableau par tableau ou alors avec des bugs avec ie et il reste à ne cibler que le href du lien, toute la rangée déclenche l'événement.
Modifié par keran (29 Dec 2009 - 01:21)