8792 sujets

Développement web côté serveur, CMS

Bonjour tout le monde.

Je rencontre un petit soucis dans une présentation d'un tableau dynamique

Voilà j aimerai afficher mes catégories avec les articles qui vont avec, mais le problème c'est que mon titre s'affiche à chaques enregistrement d'un nouvel article.

Un exemple pour mieux comprendre

ma catégorie 1
- article 1
- article 2
- article 3
....

ma catégorie 2
- article 1
- article 2
- article 3
....

Mais comme je m y prend cela est affiché ainsi:

ma catégorie 1
- article 1
ma catégorie 1
- article 2
ma catégorie 1
- article 3
....

ma catégorie 2
- article 1
ma catégorie 2
- article 2
ma catégorie 2
- article 3
....

while($val = mysql_fetch_assoc($req)) {
echo "<div>";
echo "<b>".$val['cat_article']."</b>
<br />
".$val['titre']."\r";
echo "</div>";
}


Il me semblait avoir vu que l'on pouvait faire ça avec un tableau (et les balises th) mais j aimerai éviter les tableaux Smiley lol

Merci d'avance
Modifié par Skippy1 (18 Dec 2006 - 11:22)
Bonjour Skippy1, Smiley smile

Il y a ce qui est de l'ordre de la requête et ce qui concerne le balisage html : les deux sont indépendants.

Je ne suis pas très compétente en matière de requête sql, mais, à priori, le résultat semble correspondre à ce que tu nous proposes, puisque dans chaque boucle tu répètes le titre de la catégorie.

Peut-être ainsi :


while($val = mysql_fetch_assoc($req)) {
echo "<div>";
echo "<hn>".$val['cat_article']."</hn>
}
while($val = mysql_fetch_assoc($req)) {
echo "<ul>";
echo "<li>".$val['titre']."</li>\r";
echo "<ul>";
}
echo "</div>";
}


sachant que je ne suis pas sûre de la partie requête.

Concernant la syntaxe html, cela donne, dans le code généré :



<div>
   <hn>ma catégorie </hn>
   <ul>
      <li>article 1</li>
      <li>article 2</li>
      ....
   </ul>
</div>


Ou hn est un niveau de titre correspondant à la logique de ton document : h2 ou h3, cela dépend.

La liste à puce <ul><li> correspond à l'énumération des articles. Ce balisage est souvent utilisé dans les menus.

Tu peux aussi utiliser les listes de définition :


<dl>
     <dt>Ma catégorie</dt>
     <dd>Aticle 1</dd>
     <dd>Article 2</dd>
     .....
</dl>



Le premier exemple présente l'avantage d'insérer des niveaux de titres et donc de structurer le document, mais aussi de faciliter la navigation avec un lecteur vocal.

Smiley cligne
hello Vero,

merci bcp pour ton post détaillé, j aurai au moins appris quelque chose dès le lundi matin Smiley smile

Par contre cela ne fonctionne pas Smiley decu

Si je fais :
while($val = mysql_fetch_assoc($req)) {

echo "<div>";

echo "<hn>".$val['cat_article']."</hn>

}

while($val = mysql_fetch_assoc($req)) {

echo "<ul>";

echo "<li>".$val['titre']."</li>\r";

echo "<ul>";

}

echo "</div>";

}


Je n'ai que mes catégories qui s affichent
Skippy1 a écrit :
Voilà j aimerai afficher mes catégories avec les articles qui vont avec, mais le problème c'est que mon titre s'affiche à chaques enregistrement d'un nouvel article.

Il s'agit du classique algo de gestion de rupture dont je vais t'exposer le principe de fonctionnement:

<?php
$req="select id,cat,nom from la_table order by cat asc,nom asc";
$res=mysql_query($req);

$cat_prec='aaaaaaaa';
while($data=mysql_fetch_assoc($res))
{
if($cat_prec!=$data['cat'])
{ 
echo $data['cat'],'<br />';

$cat_prec=$data['cat'];
}

echo $data['nom'],'<br />';
}
?>


Et voilà, aussi simple que ça ! Smiley cligne
Skippy1 a écrit :
hello Vero,

merci bcp pour ton post détaillé, j aurai au moins appris quelque chose dès le lundi matin Smiley smile

Par contre cela ne fonctionne pas Smiley decu



Je m'en doutais un peu pour la partie requête.
Mais Bison est arrivé à la rescousse !

En revanche, j'espère que, du côté de la syntaxe HTML à employer pour le balisage de ce type de contenu, les exemples sont plus significatifs !
Smiley biggrin

Un conseil :

Pour la syntaxe html, il vaut mieux regarder le source généré et travailler en deux étapes : l'extraction puis le balisage.
Modifié par Vero (18 Dec 2006 - 10:53)
Salut bison

Un grand merci à toi, ça marche impecc.

Par contre je ne comprend pas bien ton script Smiley decu

On affiche le nom de l'article si différent de $data['cat'] ?
(categorie != categorie)
De ce fait pourquoi alors cela m'affiche tout de meme le nom de la catégorie

@Vero
Oui en effet, d'ailleurs je ne connaissait pas la balise <hn>

A+
Modifié par Skippy1 (18 Dec 2006 - 10:54)
Bonjour Skippy1,

Pour répondre à ta question, Bison fait ce test afin que la catégorie s'affiche une et une seule fois ...

Dans la requête SQL, la directive "order by cat asc" permet de trier par ordre croissant les catégories.

Ainsi, dès qu'il y'a une nouvelle catégorie (catégorie de la base != catégorie précédemment affichée) l'affichage de la catégorie se fait ...

Juste un bémol concernant ce morceau de code : si tu as une catégorie nommée "aaaaaaaa" (peu probable quand même Smiley biggol ) et qu'elle se retrouve en première position : cette catégorie ne s'affichera pas ... mais cela est surtout à réglé du côté analyse de la base de données (relations).

Bonne continuation. Romain
Modifié par yodaswii (18 Dec 2006 - 11:02)
Ok merci à vous pour votre aide ainsi que vos explications détailllées

par contre ma requete ne trie pas par ordre et cela a l'air de fonctionner pareil

$sql = "SELECT * FROM articles LEFT JOIN cat_articles ON articles.categorie = cat_articles.id_cat";


Je pense que du fait que je fait une jointure il n'y a pas besoin de faire un tri. Est-ce juste ?
Re-bonjour,

Ben à mon avis si ... le tri est requis !
Imaginons que dans la table "articles" on ait ceci :

1 Produit1 Categorie1
2 Produit2 Categorie2
3 Produit3 Categorie1

A l'affichage cela te donnera :

Categorie1 : Produit1
Categorie2 : Produit2
Categorie1 : Produit3

Pour regrouper les catégories, le tri est indispensable ...

Romain
yodaswii a écrit :
Juste un bémol concernant ce morceau de code : si tu as une catégorie nommée "aaaaaaaa" (peu probable quand même Smiley biggol )

Dans ce cas tu utilises la première lettre de ton bémol !
Mouarf... Smiley langue Smiley cligne Smiley biggrin

Je n'aime pas initialiser une variable vide Smiley cligne
De plus ici, on ne gère qu'une seule rupture. Il m'est arrivé d'en gérer 5 ou 6