Page 1 sur 2

A propos des tableaux dynamiques

Posté : 20 sept. 2005, 15:45
par Elisa
Bonjour,

Actuellement, lorsque je crée un tableau dynamique, je crée toujours une ligne "en dur" (celle qui comprend les titres) et je génère dynamiquement les autres lignes du tableau.

Admettons maintenant que je veuille générer un tableau dont certaines cellules sont vides. Est-il possible de ne générer que les cellules remplies?

Par exemple, soit une fiche sur un film.

Nom du film : ET
Réalisateur : S.Spielberg
Synopsis : C'est l'histoire d'un nain strate et le reste
Année : ?

Admettons que l'année n'est pas renseignée. Par conséquent, je ne veux pas que la ligne "Année" apparaisse à l'affichage.

Cela est-il possible? Cela relève-t-il du PHP ou du HTML?

Posté : 20 sept. 2005, 15:50
par Cyrano
Tu peux le traiter en PHP en vérifiant avant la création de chaque ligne que les 4 paramètres ne sont pas vides et selon le résultat générer la ligne ou passer au tour suivant de ta boucle.

Mais tu pourrais aussi le faire en amont au niveau de ta requête SQL en ne récupérant QUE les éléments formant des lignes complètes sans valeurs nulles : de cette façon tu n'aurais plus à te préoccuper de cellules vides dans ton tableaux, toutes seraient obligatoirement remplies avec une valeur.

Posté : 20 sept. 2005, 16:01
par Elisa
Tu peux le traiter en PHP en vérifiant avant la création de chaque ligne que les 4 paramètres ne sont pas vides et selon le résultat générer la ligne ou passer au tour suivant de ta boucle.
Donc si je prends cette possibilité, ça donnerait qq chose du type (ne pas faire attention à la ponctuation, je m'attache à la démarche pour le moment):
if (!$Annee)
    print // là je ne sais pas comment exprimer le "ne rien afficher"
else 
    print ('$Année')
Dans ce cas là, comment je génère la ligne titre de mon tableau (Année)?

Mais tu pourrais aussi le faire en amont au niveau de ta requête SQL en ne récupérant QUE les éléments formant des lignes complètes sans valeurs nulles : de cette façon tu n'aurais plus à te préoccuper de cellules vides dans ton tableaux, toutes seraient obligatoirement remplies avec une valeur.
Dans ce cas là, y a-t-il des fonctions spécifiques à connaître? Et même question: comment est-ce que je fais pour ma ligne "en dur"?

Posté : 20 sept. 2005, 16:11
par sadeq
C'est le rôle de PHP.
Il faut tester le contenu de l'élèment avant de l'afficher dans une cellule.
Dans ton cas, l'année vide ne doit pas apparaître : le code PHP suivant illustre ce cas de figure :
<?
//Exemple de contenu à afficher
$films = array(
                       array ("titre"=>"E.T.", "réalisateur"=>"S.Spielberg" , "année"=>""),
                       array ("titre"=>"Garfield", "réalisateur"=>"Peter Hewitt","année"=>"2004")
); //fin du tableau $films

//Fiches des films (film par film)
foreach ($films as $unFilm) {
      echo "<p><table border=1><Legend><Strong>Fiche de film</Strong>";
      //Ne pas afficher les élèments vides       
      if ($unFilm["titre"] != null && trim($unFilm["titre"]) != "")
                 echo "<tr><th>Titre :<td>".$unFilm["titre"];
      if ($unFilm["réalisateur"] != null && trim($unFilm["réalisateur"]) != "")
                 echo "<tr><th>Réalisateur :<td>".$unFilm["réalisateur"];
      if ($unFilm["année"] != null && trim($unFilm["année"]) != "")
                 echo "<tr><th>Année :<td>".$unFilm["année"];
      //Fin d'une fiche
     echo "</table>";
} //Au suivant!
?>
La fonction trim($variable) elimine les espaces inutiles (dans le cas où $variable ne contient que des espaces trim() retourne vide "") elle est utilisée ici pour s'assurer que les chaines contenant des espaces par mégarde sont conciérées vides (car un espace n'est pas du vide)

La structure foreach permet de boucler dans un tableau comme la boucle for.

Posté : 20 sept. 2005, 16:19
par Cyrano
Illustration de mes explications précédentes : première méthode:
<?php
$sql = "SELECT titre, realisateur, synopsis, annee FROM t_cinema";
$requete = mysql_query($sql);
?>
<table>
  <tr>
    <th>Titre</th>
    <th>Réalisateur</th>
    <th>Synopsis</th>
    <th>Année</th>
  </tr>
<?php
while($ligne = mysql_fetch_assoc($requete))
{
    if(!empty($ligne['titre']) && !empty($ligne['realisateur']) && !empty($ligne['synopsis']) && !empty($ligne['annee']))
    {
?>
  <tr>
    <td><?php echo($ligne['titre']); ?></td>
    <td><?php echo($ligne['realisateur']); ?></td>
    <td><?php echo($ligne['synopsis']); ?></td>
    <td><?php echo($ligne['annee']); ?></td>
  </tr>
<?php       
    }
}
?>
</table>
Selconde méthode:
<?php
$sql = "SELECT titre, realisateur, synopsis, annee FROM t_cinema".
       "WHERE titre <> ''".
       "AND realisateur <> '' ".
       "AND synopsis <> '' ".
       "AND annee <> '0000-00-00' ".
       "AND annee <> ''";
$requete = mysql_query($sql);
?>
<table>
  <tr>
    <th>Titre</th>
    <th>Réalisateur</th>
    <th>Synopsis</th>
    <th>Année</th>
  </tr>
<?php
while($ligne = mysql_fetch_assoc($requete))
{
?>
  <tr>
    <td><?php echo($ligne['titre']); ?></td>
    <td><?php echo($ligne['realisateur']); ?></td>
    <td><?php echo($ligne['synopsis']); ?></td>
    <td><?php echo($ligne['annee']); ?></td>
  </tr>
<?php       
}
?>
</table>
Adapte les noms de table et de champs à ta propre base et tu obtiendras ce que tu cherches à faire.

Posté : 20 sept. 2005, 16:26
par sadeq
Cyrano, je pense que Elisa ne veut afficher que les élèments non vides d'un même film.
Je remarque que tes programmes éliminent tous les champs quand au moins un seul est vide (tu utilise la Jonction ET dans les 2 méthodes)

Tu dis : A ET B ET C (élèments non vides) ? => si au moins C est fausse tout est faux et le film n'est pas traité même si A et B contiennent des données et ça c'est pas bon!

Il faut traiter l'affichage des élèment cas par cas => si A n'est pas vide alors l'afficher.

Elisa, quand un if (si) n'a pas d'action else (sinon) il faut inverser la condition pour ne garder que le cas si vrai:
Exemple:
L'écriture : if (A) { //rien } else {echo "Ô c'est pas A!";} c'est faut.
Il faut écrire : if (!A) { echo "Ô c'est pas A!";} en inversant la condition par ! (not)

Posté : 20 sept. 2005, 16:44
par Cyrano
Alors n'affichons que les données existantes et une cellule vide là où les données sont abentes:
<?php
$sql = "SELECT titre, realisateur, synopsis, annee FROM t_cinema";
$requete = mysql_query($sql);
?>
<table>
  <tr>
    <th>Titre</th>
    <th>Réalisateur</th>
    <th>Synopsis</th>
    <th>Année</th>
  </tr>
<?php
while($ligne = mysql_fetch_assoc($requete))
{
?>
  <tr>
    <td><?php echo(!empty($ligne['titre']) ? $ligne['titre'] : "&nbsp;"); ?></td>
    <td><?php echo(!empty($ligne['realisateur']) ? $ligne['realisateur'] : "&nbsp;"); ?></td>
    <td><?php echo(!empty($ligne['synopsis']) ? $ligne['synopsis'] : "&nbsp;"); ?></td>
    <td><?php echo(!empty($ligne['annee']) ? $ligne['annee'] : "&nbsp;"); ?></td>
  </tr>
<?php       
}
?>
</table>

Posté : 20 sept. 2005, 16:52
par Elisa
<?php echo(!empty($ligne['titre']) ? $ligne['titre'] : "&nbsp;"); ?>
Qu'est-ce que c'est?
"&nbsp;"
Comment définis-tu la variable $ligne?
Avec ce code la partie html disparaît-elle si la condition n'est pas remplie?

Posté : 20 sept. 2005, 18:02
par Cyrano
La première formule:
<?php echo(!empty($ligne['titre']) ? $ligne['titre'] : "&nbsp;"); ?>
Est strictement la même chose que:
<?php if(!empty($ligne['titre']){echo($ligne['titre']) } else { echo("&nbsp;") } ?>
"&nbsp;" = Non Breakable SPace = Espace insécable .

Ensuite, $ligne est définie dans le while et c'est un tableau associatif puisque j'utilise mysql_fetch_assoc, il aurait été indexé si j'avais utilisé mysql_fetch_row et l'un ou l'autre au choix si j'avais utilisé mysql_fetch_array.

Posté : 23 sept. 2005, 11:37
par Elisa
Alors n'affichons que les données existantes et une cellule vide là où les données sont abentes:
<?php
$sql = "SELECT titre, realisateur, synopsis, annee FROM t_cinema";
$requete = mysql_query($sql);
?>
<table>
  <tr>
    <th>Titre</th>
    <th>Réalisateur</th>
    <th>Synopsis</th>
    <th>Année</th>
  </tr>
<?php
while($ligne = mysql_fetch_assoc($requete))
{
?>
  <tr>
    <td><?php echo(!empty($ligne['titre']) ? $ligne['titre'] : "&nbsp;"); ?></td>
    <td><?php echo(!empty($ligne['realisateur']) ? $ligne['realisateur'] : "&nbsp;"); ?></td>
    <td><?php echo(!empty($ligne['synopsis']) ? $ligne['synopsis'] : "&nbsp;"); ?></td>
    <td><?php echo(!empty($ligne['annee']) ? $ligne['annee'] : "&nbsp;"); ?></td>
  </tr>
<?php       
}
?>
</table>
Si je comprends bien ton exemple, je garde la partie html en dur (les titres). Comment faire si je ne veux pas de la ligne si elle se présente ainsi :
<tr>
<th>Titre<th>
<td>ET l'extraterrestre</td>
<tr>

Posté : 23 sept. 2005, 16:26
par Elisa
Oups désolée, mais en relisant le post j'ai vu que Sadeq a répondu à ma question. :oops: [La fatigue...]

En revanche lorsqu'il définit "array", est-ce que je peux remplacer
array ("titre"=>"E.T.", "réalisateur"=>"S.Spielberg" , "année"=>""), 
par
array ("titre"=>"$titre", "réalisateur"=>"$realisateur" , "année"=>"$annee")

Posté : 23 sept. 2005, 16:43
par Tho
Oui et comme ce sont des variables, tu peux te passer des guillemets :
... "titre"=>$titre, ...

Posté : 23 sept. 2005, 16:45
par Elisa
Merci je vais tester tout ça... :)

Posté : 28 sept. 2005, 14:36
par Elisa
Bonjour,

Je me suis finalement orientée vers la proposition de Sadeq, qui correspondait le mieux au résultat que je recherchais. En revanche, j'ai un souci: mon code HTML s'articule mal avec le PHP.
Par exemple, lorsque je fais ceci:
<?php 
if ($Presentation !=null && trim($Presentation)!="")
{
echo "<tr>
	<td style=text-align: justify; vertical-align: top; font-size: 11pt; font-weight: bold; font-family: Arial,sans-serif; color: ff9900;>
	Présentation :
	</td>
	<td style=text-align: justify;>
		<span style=font-size: 10pt; font-family: Arial,sans-serif;>
			".nl2br ($Presentation)."
		</span>
	</td>
</tr>";
}
?>
Dans ce cas, il n'y a pas de " " après le HTML (ex. td style="...") mais il n'interprète pas les indications html. Si, en revanche je les remets, il m'affiche ceci:
Parse error: parse error, expecting `','' or `';'' in c:\program files\easyphp1-8\www\sinbad\user\aff_groupes.php on line 72
Est-ce que vous auriez déjà rencontré un problème similaire ou bien auriez-vous une explication à la cause de ce phénomène? :-k

Posté : 28 sept. 2005, 14:46
par Tho
Je te propose une présentation de ce type :
<?php
if (trim($Presentation) != "")
{ 
?>
<tr>
  <td style="text-align: justify; vertical-align: top; font-size: 11pt; font-weight: bold; font-family: Arial,sans-serif; color: ff9900;">
    Présentation :
  </td>
  <td style="text-align: justify;">
    <span style="font-size: 10pt; font-family: Arial,sans-serif;">
      <?php echo nl2br($Presentation); ?>
    </span>
  </td>
</tr>
<?php
}
?>