Page 1 sur 3

tri sur colonnes : à améliorer

Posté : 09 juin 2009, 11:07
par cmoi
Bonjour,

j'ai ce code qui fonctionne très bien mais pour lequel je voudrais 2 améliorations :
<?php

// Le nom de notre table
$tablename = 'table';


// Tri sur colonne
$tri_autorises = array('ville','activite');
$order_by = in_array($_GET['order'],$tri_autorises) ? $_GET['order'] : 'ville';


// Sens du tri
$order_dir = isset($_GET['inverse']) ? 'DESC' : 'ASC';


// Préparation de la requête
$sql = "
	SELECT *
	FROM {$tablename}
	ORDER BY {$order_by} {$order_dir}
";
$result = mysql_query($sql);


// Notre fonction qui affiche les liens
function sort_link($text, $order=false)
{
	global $order_by, $order_dir;

	if(!$order)
		$order = $text;
	
	$link = '<a href="?order=' . $order;
	if($order_by==$order && $order_dir=='ASC')
		$link .= '&inverse=true';
	$link .= '"';
	if($order_by==$order && $order_dir=='ASC')
		$link .= ' class="order_asc"';
	elseif($order_by==$order && $order_dir=='DESC')
		$link .= ' class="order_desc"';
	$link .= '>' . $text . '</a>';
	
	return $link;
}


// Affichage
?>
<style type="text/css">
a.order_asc,
a.order_desc:hover { 
	padding-right:15px;
	background:transparent url(images/s_asc.png) right no-repeat;
}
a.order_desc,
a.order_asc:hover {
	padding-right:15px;
	background:transparent url(images/s_desc.png) right no-repeat;
}
</style>

                  <table>
                    <tr bgcolor="#FF9900"> 
                      <th> 
                        <?php echo sort_link('Ville', 'ville') ?>
                      </th>
		              <th> 
                        <?php echo sort_link('Activité', 'activite') ?>
                      </th>
	</tr>
<?php while( $row=mysql_fetch_assoc($result) ) : ?>
	<tr>
		<td><font face="Verdana, Arial, Helvetica, sans-serif" size="1"><?php echo $row['ville'] ?></font></td>
		<td><font face="Verdana, Arial, Helvetica, sans-serif" size="1"><?php echo $row['activite'] ?></font></td>
	</tr>
<?php endwhile ?>
</table>
D'abord je voudrais mettre une condition sur Ville pour dire que si le champ est vide, on n'affiche rien.

Ensuite, je voudrais que chaque ville et chaque activité soit cliquable. Si l'on clique sur une ville, on obtient un tableau avec toutes les activités de cette ville. Si l'on clique sur une activité, on obtient un tableau avec toutes les villes où l'on trouve cette activité.

Merci pour les pistes d'étude.

Posté : 09 juin 2009, 11:14
par charabia
La condition est simple : si différent de vide alors...
if(!empty($ville))
	 echo $ville;
Ensuite pour ta seconde demande, il te suffit de passer dans l'URL une variable correspondant à l'ID. Cet ID va te permettre de récupérer toutes les données nécessaires de la ville ou de l'activité, et ensuite d'en faire ce que tu veux.

Posté : 09 juin 2009, 11:23
par cmoi
La condition est simple : si différent de vide alors...
if(!empty($ville))
	 echo $ville;
J'ai essayé un bête copier/coller. Effectivement, c'est bête puisqu'il ne se passe rien !
$ville n'existe pas dans le code, j'ai voulu mettre $_GET['order'] : 'ville' à la place, c'est pire.
Autre question, où le placer dans le code ?

Posté : 09 juin 2009, 11:30
par charabia
Heu...j'ai juste mis $ville pour que tu saches que c'est la ville. Mais dans ton code c'est plutôt $row['ville'] non ?

Où le placer ? Là où tu affiches la ville.

Posté : 09 juin 2009, 11:40
par cmoi
j'ai plusieurs essais, je l'ai mis là où ça me semble logique :
// Tri sur colonne
$tri_autorises = array('ville','activite');
$order_by = in_array($_GET['order'],$tri_autorises) ? $_GET['order'] : 'ville';
if(!empty($row['ville']))
     echo $row['ville']; 
mais aucune solution ne fonctionne.

Posté : 09 juin 2009, 11:53
par charabia
Dans ton code au-dessus, où affiches-tu "visuellement" la ville ?

Posté : 09 juin 2009, 12:54
par cmoi
Finalement, j'abandonne cette idée de condition qui n'est pas bonne puisque cela enlèverait certaines activités.

2e sujet : tu me dis :
"Ensuite pour ta seconde demande, il te suffit de passer dans l'URL une variable correspondant à l'ID. Cet ID va te permettre de récupérer toutes les données nécessaires de la ville ou de l'activité, et ensuite d'en faire ce que tu veux."

il faudrait être plus clair s'il te plaît.
il faut une variable $id = ??
dans l'url ??

Posté : 09 juin 2009, 14:02
par charabia
Tu parles d'un clic sur ville ou activité. Donc qui dit clic dit lien. Pour moi l'URL c'est le lien en question qui sera sur ville et activité.

exemple :
<a href="ta_page.php?id=xxx" title="">ville</a>
Avec ce code, tu pourras récupérer l'ID de la ville avec $_GET. Et à partir de là tu peux en faire ce que tu veux grâce à la clause WHERE de ta requête.

Posté : 09 juin 2009, 14:13
par cmoi
mais avec id je vais obtenir 1 enregistrement dans ma table. Par exemple Paris peut apparaître 10 fois dans ma table. Je voudrais qu'en cliquant sur Paris, j'obtienne toutes les activités enregistrées sur Paris.

A l'inverse, je peux avoir Assurance. En cliquant dessus, j'ai toutes les villes où l'assurance est enregistrée comme activité.

Avec page.php?id=...., je ne pense avoir ce résultat.

Posté : 09 juin 2009, 14:18
par charabia
Comment est constituée ta table ?
page.php?ville=paris
ne ferait pas l'affaire ? J'imagine que tu as un champ "ville" dans ta table non ?

Posté : 09 juin 2009, 14:31
par cmoi
dans la table, il y a un champ ville et un champ activite.

Comment on inclut une url là-dedans ?
<?php while( $row=mysql_fetch_assoc($result) ) : ?>
	<tr>
		<td><font face="Verdana, Arial, Helvetica, sans-serif" size="1"><?php echo $row['ville'] ?></font></td>
		<td><font face="Verdana, Arial, Helvetica, sans-serif" size="1"><?php echo $row['activite'] ?></font></td>
	</tr>
<?php endwhile ?>

Posté : 09 juin 2009, 14:39
par charabia
Eh bien si tu as un champ ville et activité je ne vois d'où vient le problème. Avec page.php?ville=xxxxx tu peux récupérer tous les enregistrements dont ville correspond à xxxxx et après tu en fais ce que tu veux.

Pour l'URL c'est de l'HTML pur là.
<a href=""><?php echo $row['ville'] ?></a>

Posté : 09 juin 2009, 14:42
par cmoi
je dois mal comprendre quelque chose .... si j'écris sous cette forme page.php?ville=xxxxx, c'est moi qui entre le nom de la ville
Le principe est de cliquer sur le nom de la ville affiché.

Posté : 09 juin 2009, 14:52
par charabia
Si tu récupères dynamiquement le nom de la ville, tu mets juste le résultat récupéré à la place des xxxxx. Ce n'est pas toi qui va mettre un par un.

Par exemple
page.php?ville=<?php echo $row['ville']; ?>

Posté : 09 juin 2009, 14:59
par cmoi
ok,
ville.php?ville=<?php echo $row['ville'] ?>"><?php echo $row['ville'] ?></a>
a l'air de fonctionner, sauf que la page ville.php ne s'ouvre pas.

Mais ça doit être normal, elle est vide pour l'instant ![/php][/quote]