Page 1 sur 1

Creer des tableaux à l'aide de fonctions

Posté : 28 févr. 2008, 00:49
par Sebe
Bonjour,

J'aimerai alléger mon code (enfin le nombre de ligne) de mes pages en faisant une fonction avec ce qui est le plus souvent affiché ... des tableaux (<table><tr><td> ...)

Grâce à une connaissance, nous avons essayé un truc mais l'affichage coince avec les entêtes de colonne et je me suis dit que peut-être l'on pourrait m'aider :lol:
Voici mon code:
// fichier php
$query = "SELECT *"
	. "\n FROM #__classement_participant"
	. "\n WHERE nom LIKE '" . $bout . "%'"
	. "\n ORDER BY nom ASC"
	;
$database->setQuery( $query );
$runnerlist = $database->loadObjectList();
classement_html::runnerlist($mosConfig_lang, $runnerlist, $link);

// fichier html
<?php
function runnerlist($lang, $runnerlist, $link) {
if ($runnerlist != '') {
echo '<br/><br/>';

classement_html::table();
list($title,) = each($runnerlist);
echo nl2br(print_r($title, true) . print_r($runnerlist, true)) ;
classement_html::ligneTitle($title);
classement_html::ligne($runnerlist);
classement_html::Endtable();
}

function table(){
	echo '<table width="100%" border="0" cellspacing="10" cellpadding="0">';
	}
function Endtable(){
	echo '</table>';
	}
function ligne(& $ligne) {
	$firstline = 1;
	while(list(, $objet) = each($ligne)) {
		echo '<tr>';
		classement_html::colonne($objet, $firstline);
		echo '</tr>';
		}
	}
//function colonne(&$objet, &$firstline) {
	//foreach($objet as $name => $value) {
		//if($firstline) {
			//echo '<td>'. constant('_PREFIX' . $name) . '</td>';
			//$firstline = 0;
			//}
		//echo '<td>' . $value . '<td>';
		//}
	//}
function colonne(&$objet) {
	foreach($objet as $name => $value) {
		echo '<td>' . $value . '</td>';
		}
	}
function ligneTitle($title) {
	foreach($title as $name) {
		html_classement::colonne(constant('_PREFIX' . $name));
		}
	}
?>
Voicice que cela donne (1er tableau). Le 2e tableau étant fait de façon traditionnelle !

Donc je cherche à afficher les entêtes de colonnes (je leur ai donnée un nom qui s'affiche correctement avec la fonction mit //) + pouvoir limiter le nombre de colonne à afficher ... je n'ai pas besoin d'afficher l'ID par exemple !

Voilà un programme qui me dépasse mais que j'aimerai arriver à savoir faire ... si une bonne âme pouvait me filer un coup de main :roll:

Merci

Posté : 28 févr. 2008, 09:27
par d0m
Salut,

Ce que je te conseille de faire c'est tout le tableau en une fonction.
Parce que comme ceci, tu n'allèges pas vraiment ton code.

Tu passes carrément en paramètre ton tableau,ta liste ou ton objet organisé sous la forme :
la structure contient n lignes organisées chacune en m colonnes.

Et l'entête en 2ème paramètre :
function tableau($runnerlist,$entete){
  echo '<table width="100%" border="0" cellspacing="10" cellpadding="0">'."\n";
  //l'entete du tableau
  echo '  <tr>';
  foreach($entete as $libelle){
    echo '<td>'.$libelle.'</td>';
  }
  echo '</tr>';
  //les donnees
  //les lignes
  while(list(,...) = each($ligne)){
    echo '  <tr>';
    //les colonnes
    foreach($lignes as $valeur_colonne){
      echo '<td>'.$valeur_colonne.'</td>';
    }
    echo '</tr>';
  } 
}

Posté : 28 févr. 2008, 10:16
par Sebe
Salut,
Tu passes carrément en paramètre ton tableau,ta liste ou ton objet organisé sous la forme :
la structure contient n lignes organisées chacune en m colonnes.
Ok, j'ajoute un 3 arguments mais comment je m'y prend pour construire ce 3e argument pour déterminer ce qui doit être ou non affiché?
Et l'entête en 2ème paramètre :
Donc c'est l'argument $entete qui passe cela? En gros c'est une boucle avec
constant('_PREFIX' . $name); 
que je dois passer en argument?

Merci

Posté : 28 févr. 2008, 10:30
par d0m
Pourquoi ne pas carrément faire ce choix des éléments qui doivent être affichés à l'écriture de la requête?
Au lieu de faire un

Code : Tout sélectionner

SELECT * FROM ...
tu peux séléctionner que les champs qui t'intéresse :

Code : Tout sélectionner

SELECT nom,prenom,date_naissance FROM ....
Sinon effectivement tu peux utiliser les valeurs de l'entête en construisant l'entête de cette façon:
les clés sont les noms des champs SQL, les valeurs sont la chaine à afficher de l'entête (formaté joli avec les accents,etc)
$entête = array(nom=>'nom','prenom'=>'prénom','date_naissance');
function tableau($runnerlist,$entete){
  ....
  foreach($entete as $libelle){
    echo '<td>'.$libelle.'</td>';
  }
  echo '</tr>';
  //les donnees
  //les lignes
  while(list(,...) = each($ligne)){
    echo '  <tr>';
    //les colonnes à partir de l'entête
    foreach($entete as $champSQL => $valeur_colonne){
      echo '<td>'.$ligne[$champSQL].'</td>';
    }
    echo '</tr>';
  } 
}

Posté : 28 févr. 2008, 10:52
par Sebe
Pourquoi ne pas carrément faire ce choix des éléments qui doivent être affichés à l'écriture de la requête?
Parce que j'ai au moins besoin de l'ID pour faire un lien vers la fiche d'identité du coureur!
Sinon effectivement tu peux utiliser les valeurs de l'entête en construisant l'entête de cette façon:
les clés sont les noms des champs SQL, les valeurs sont la chaine à afficher de l'entête (formaté joli avec les accents,etc)
$entête = array(nom=>'nom','prenom'=>'prénom','date_naissance');
Donc ok pour un array mais ce sera sans libellè en dur car j'utilise un fichier langue (en fait j'essaye de faire un composant Joomla) ... là pas de problème pour moi :roll:
A la ligne
while(list(,...) = each($ligne))
C'est quoi ces 3 points ? Que dois-je y mettre ?

Merci pour l'aide

Posté : 28 févr. 2008, 11:02
par d0m
C'est quoi ces 3 points ? Que dois-je y mettre ?
Il va falloir réfléchir un peu tout de même.
Cette ligne de code est la boucle qui permet de parcourir l'objet/tableau $runnerlist pour en extraire chaque ligne que tu vas afficher dans ton tableau html.
J'ai mis
while(list(,...) = each($ligne))
parce que c'est cette méthode que tu sempblais utiliser pour extraire chaque ligne.

Tu peux mettre la forme de boucle que tu veux, l'idée étant de récupérer dans la variable $ligne la ligne suivante de l'objet/tableau $runnerlist.

Posté : 28 févr. 2008, 15:36
par Hywan
while(list = each) est assez lent, il faudrait penser à faire autrement.
Edit : Voir le bench proposé par mere-teresa, j'ai archi tord ^^.Tout est expliqué dans la documentation. Il faudrait plutôt penser à utiliser foreach.

Les tableaux sont rarement accessibles et j'aimerais qu'on y pense un peu. Un excellent exemple est mis en vidéo sur Access-Key.org, voir le Tutoriel vidéo N°1 : l’accessibilité des tableaux.
Merci également de lire l'article sur l'Habillage des tableaux avec des CSS, où on revoit les balises élémentaires et complémentaires des tableaux.

Pour finir, on pourra toujours allé jeter un oeil au W3C : Tables in HTML document.

Les deux premiers liens sont très importants, merci de les lire :). Et j'espère que tu en tiendras compte lors du développement de ton script.

Posté : 28 févr. 2008, 19:21
par Sebe
Merci à vous 2 pour vos conseilles ... super le lien de mére-thérésa
J'ai changé ma requête
$query = "SELECT id, nom, prenom, naissance"
	. "\n FROM #__classement_participant"
	. "\n WHERE nom LIKE '" . $bout . "%'"
	. "\n ORDER BY nom ASC"
	;
Et quelques modifications pour le reste
$entete = array(nom=>'Nom',prenom=>'Prénom',naissance=>'Date de naissance');//Voir pour le fichier langue
classement_html::tableau($runnerlist, $entete);

...

function tableau($list, $entete){
  echo '<table width="100%" border="0" cellspacing="10" cellpadding="0">'."\n";
  //l'entete du tableau
  echo '<tr>';
  foreach($entete as $libelle){
    echo '<td>' . $libelle . '</td>';
  }
  echo '</tr>';
  //les donnees
  //les lignes
  while(list(, $objet) = each($list)){
    echo '<tr>';
    //les colonnes à partir de l'entête
	foreach($objet as $name => $value) {
		echo '<td>' . $value . '</td>';
		}
    echo '</tr>';
  }
  echo '</table>';
}
Maintenant comment faire pour choisir les colonnes à afficher et comment faire correspondre à coup sur le libellé avec la colonne ?

Voilà et merci pour l'aide

Posté : 29 févr. 2008, 01:07
par sebe de kain
Voilà avec vos aides et conseilles combinés, j'obtiens un résultat acceptable:
// Fichier php
function part() {
global $database, $mosConfig_lang;

$bout = mosGetParam( $_REQUEST, 'coureur', '' );

if ($bout == '') {
	$bout = mosGetParam( $_REQUEST, 'bout', '' );
	}

/////////// Item et lien(s) ///////////
$link = lien ($task = 'fiche_participant');
$link .= '&id=';
			
if ($bout != '') {
	$query = "SELECT id, nom, prenom, naissance"
		. "\n FROM #__classement_participant"
		. "\n WHERE nom LIKE '" . $bout . "%'"
		. "\n ORDER BY nom ASC"
		;
	$database->setQuery( $query );
	$runnerlist = $database->loadObjectList();
	
	foreach($runnerlist as $key => $runner){
		$runnerlist[$key]->nom = '<a href="' . $link . $runner->id . '">' . $runner->nom . '</a>';
		$runnerlist[$key]->prenom = '<a href="' . $link . $runner->id . '">' . $runner->prenom . '</a>';
		if ($mosConfig_lang == 'french') {
			setlocale(LC_TIME, "fr");
			$runnerlist[$key]->naissance = strftime("%d %B %Y",strtotime($runner->naissance));
			}
		}
	}//fin du if

classement_html::runnerlist($mosConfig_lang, $runnerlist, $link);
}

// Fichier HTML
function runnerlist($lang, $runnerlist, $link) {
if ($runnerlist != '') {
	echo '<br/><br/>';
	$restriction = array('id');
	
	$entete = array(
		nom=>constant('_PREFIXnom'),
		prenom=>constant('_PREFIXprenom'),
		naissance=>constant('_PREFIXnaissance'));

	classement_html::tableau($runnerlist, $entete, $restriction);
	}// fin du if 
}// fin fonction coureur

// Fonction création d'un tableau
function tableau($list, $entete, $restriction){
	echo '<table width="100%" border="0" cellspacing="10" cellpadding="0">'."\n";

	//l'entete du tableau
	echo '<tr>';
	foreach($entete as $libelle){
		echo '<td>' . $libelle . '</td>';
		}
	echo '</tr>';

	//les donnees
	//les lignes
	while(list(, $objet) = each($list)){
		echo '<tr>';
		
		//les colonnes à partir de l'entête
		foreach($objet as $name => $value) {
			if(!in_array($name, $restriction)) {
				echo '<td>' . $value . '</td>';
				}
			}
	
		echo '</tr>';
		}
	echo '</table>';
	}
Puis-je encore améliorer mon résultat ?

Merci

Posté : 29 févr. 2008, 09:27
par d0m
oui peut être en utilisant l'entête en temps que restriction.
Après tout tu veux afficher les mêmes éléments de $list que ceux de l'entete.
donc au lieu de :
while(list(, $objet) = each($list)){
  echo '<tr>';
      
  //les colonnes à partir de l'entête
  foreach($objet as $name => $value) {
      if(!in_array($name, $restriction)) {
          echo '<td>' . $value . '</td>';
      }
  }
    
  echo '</tr>';
} 
utiliser l'entête comme filtre :
while(list(, $objet) = each($list)){
  echo '<tr>';
      
  //les colonnes à partir de l'entête
  foreach($entete as $nom_champ => $libelle_entete) {
          echo '<td>' . $objet[$nom_champ] . '</td>';
  }
    
  echo '</tr>';
} 
Ça a plusieurs avantages :
- économiser la variable $restrictions
- évite de devoir synchroniser le nombre de colonnes de l'entête et des restrictions.
- au lieu de parcourir l'objet $objet, tu parcours l'entête qui est toujours en taille inférieur ou égal à la taille d'un objet.

Posté : 29 févr. 2008, 18:40
par Sebe
Salut,
while(list(, $objet) = each($list)){
  echo '<tr>';
      
  //les colonnes à partir de l'entête
  foreach($entete as $nom_champ => $libelle_entete) {
          echo '<td>' . $objet[$nom_champ] . '</td>';
  }
    
  echo '</tr>';
} 
Ça a plusieurs avantages :
- économiser la variable $restrictions
- évite de devoir synchroniser le nombre de colonnes de l'entête et des restrictions.
- au lieu de parcourir l'objet $objet, tu parcours l'entête qui est toujours en taille inférieur ou égal à la taille d'un objet.
En l'état cela ne fonctionne pas mais je vais persévérer car les avantages sont très intéressants :D

En attendant, je continus à travailler et j'essaye de faire passer des class vers ma fonction mais rien n'y fait !

Code : Tout sélectionner

<style type="text/css"> mon-tableau{ width: 100%; border: 1px solid #ffffff; padding: 2px; spacing : 0; } </style> <?php $csstableau = "mon-tableau"; classement_html::tableau($courseList, $entete, $restriction, $csstableau); ... function tableau($list, $entete, $restriction, $csstableau){ echo '$csstableau ' . $csstableau; // affiche $csstableau mon-tableau echo '<table class="' . $csstableau . '">'."\n"; ...
Quelqu'un a-t-il une idée ?

Merci