Construire un tableau html à partir d'un tableau php.

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Construire un tableau html à partir d'un tableau php.

par SpintroniK » 12 janv. 2009, 21:03

Déjà essayé, avec ça les roll over sont ok, par
contre, les images sont toujours décalées.

Et en fait ça passe sous ie8, c'est juste ie 7-6
et sûrement 5-4-3-2-1-0 qui posent problème.

EDIT :
Pour l'instant j'abandonne, face à ie je ne peux rien.

Si la classe tente quelqu'un je peux poster
dans les contributions, mais faudra attendre ce
week-end car j'ai une semaine chargée...
Donc c'est comme vous voulez, suffit de demander.

;)

par Hywan » 12 janv. 2009, 20:39

C'est vrai que IE a du mal avec ça … Mets des   dans tes divs vide et observe.

par SpintroniK » 12 janv. 2009, 20:33

J'ai trouvé les liens...
Par contre ça m'aide pas vraiment, ou peut être n'ai-je pas
parcouru les deux sites entiers ?

J'ai essayé ceci :
http://www.freewebmaster.fr/java/ensea/test_div.html
et à part les hover, tout passe sous ie...
C'est triste mais je ne vois pas bien la différence entre mes
deux pages et donc je n'arrive pas à mettre le doigt sur ce
qui fait que ie interprète mal mon css.

Je répète que ça semble venir des div qui ne contiennent rien
puisqu'en fait les zones blanches correspondent à des images
qui se sont déplacées au dessus des images qui sont censées
se trouver sur leur gauche.

par Hywan » 11 janv. 2009, 23:39

Il faudrait déplacer le sujet dans le salon approprié à l'HTML et le CSS dans ce cas.

As-tu regarder Alsacréations ou Pompage ? Il y a une article qui traite de ce genre de scripts. Si tu veux, je recherche le lien (j'avoue que j'ai une grosse flemme là …). Sinon, le lien a déjà été mis à plusieurs reprises sur ce forum.

par SpintroniK » 11 janv. 2009, 20:56

Oui, le $endTab = array(); ne sert à rien...

Ton prjet est vraiment excellent.
Je suis vraiment impatient de voir tout ce qu'on pourra faire avec le css3!

Sinon, bien sûr, avec des tableaux, mon problème n'est pas évident.
C'est pourquoi j'ai opté pour une autre solution qui utilise justement le css!

Exemple avec des images en bg et des hover dessus :
http://www.freewebmaster.fr/java/ensea/
Seul problème, qui n'est pas très étonnant, ça ne passe pas sous ie.
Voilà ce que ça donne sous ie7, ie8 (xp ou vista) :
http://www.freewebmaster.fr/java/ensea/ie_de_merde.jpg
Les zones blanches correspondent à des div qui ont été décalés vers la
gauche et qui chevauchent donc ceux qui sont censés se trouver à gauche.

J'aimerai bien résoudre ce petit soucis mais je ne sais pas pourquoi ça
ne passe pas... donc si quelqu'un a une idée...

Sinon, bien sûr que je suis tenté!

par Hywan » 07 janv. 2009, 12:53

Hey :),

J'ai lu le code très rapidement et à quoi sert $endTab = array(); au début de tpl::closeTab ?
Sinon, c'est un problème de structure qui n'est pas simple à résoudre. Je m'explique.

Un array (tableau PHP) représente des dimensions (ou ensemble de dimensions) finies. Un table (donnée tabulaire) ne représente pas quant à lui des dimensions mais simplement des alignements particuliers. C'est une sorte de mise en colonne très libre. Les deux structures ne peuvent pas cohabiter, i.e. elles ne peuvent pas se représenter l'une l'autre dans tous les cas. Un exemple facile pour comprendre ce fait : les attributs rowspan et colspan fusionnent partiellement des « dimensions » (des espaces tabulaires) alors que pour un array c'est tout bonnement impossible.
On pourrait néanmoins imaginer un système de redirection qui permettrait de sauter d'un espace à l'autre dans un array mais bonne chance …

Sinon, j'ai en tête un petit script pour faciliter la construction de tableau. C'était lié à une idée du W3C pour le CSS 3 (voir le brouillon CSS Advanced Layout Module). L'idée est de représenter tes positions à travers des lettres et tu assignes des données à tes lettres. On retrouve la même idée dans la plupart des relations contrôleurs/vues où le contrôleur assigne des valeurs aux variables de la vue.
Un table pourrait donc se représenter sous cette forme :

Code : Tout sélectionner

aabbb ccdde zzzze
et on assignerait des données à a, b, c, d, e et z.
Les algorithmes à mettre en œuvre seraient marrant (enfin, très très intéressant). Par exemple, deux lettres doivent obligatoirement être contiguës en hauteur ou (exclusif, xor) en largeur. Cette propriété est théoriquement suffisamment forte pour que l'on n'ait pas de problème. Il faut y réfléchir, peut-être qu'ils en existent d'autres à vérifier.

C'est un projet qui m'intéressait et qui serait extrêmement pratique pour l'utilisateur.
Alors, tenté ?

Construire un tableau html à partir d'un tableau php.

par SpintroniK » 02 janv. 2009, 20:53

Bonjour tout le monde,

je savais pas trop où poster...

Bon en fait, ça fait envirron 2 jours (voire 3) que je galère sur un problème.
J'ai fait une classe qui construit la structure (balises tr et td) d'un tableau
html à partir d'un tableau php bidimentionnel (lignes, colonnes).

Le tout à l'air de fonctionner à l'exception de certaines configurations, par
exemple lorsque je met un colspan et un rowspan sur une même cellule.

Si je commence à tout expliquer ça va prendre trois pages alors je n'ai
pas d'autre solution que de vous claquer le code... désolé. Par cotnre, si
vous avez la moindre question je suis là !

J'espère, si ce code devient fonctionnel, pouvoir le poster dans les contributions.

Voila, assez parlé, voici les codes.

Page d'index, qui appèle les mathodes de la classe tpl qui va construire le tableau.
En base de données tout ce présente de la manière suivante :

une table avec dedans des entrées contenant les attributs suivants :

id titre ligne colonne nblignes nbcolonne

ligne et colonne correspondant aux coordonnées de la cellule et nblignes et nbcolonnes
à sa hauteur et sa largeur :

page d'index ici :
<style> 
td{
	border:1px solid #000;
	width:50px;
	height:50px;

}

</style>
<?php

require("./sql/connexion.php");
require("./class/tpl.php");


$sql = new SQL(); // Connexion à la bdd.
$tpl = new tpl(); // Création du template.


$id = (empty($_GET['id'])) ? 0 : intval($_GET['id']);

if($id == 0)  // On affiche la liste de bâtiments.
{
	// Récupération des extrema de la "boite".
	$rExtrema = $sql->query("SELECT MAX(b.colonne+b.nbcolonnes), MAX(b.ligne+b.nblignes) FROM batiments AS b");
	$extrema = $rExtrema->fetch(PDO::FETCH_NUM);
	$cMax=$extrema[0]-1; 	// Dernière colonne.
	$lMax=$extrema[1]-1; 	// Dernière ligne.

	// Récupération des bâtiments.
	$bat = $sql->query("SELECT b.* FROM batiments AS b ORDER BY b.ligne ASC");
	$bat->setFetchMode(PDO::FETCH_ASSOC);


	$tb = $tpl->openTab($lMax, $cMax);	// Création d'un tableau de $lMax lignes et $cMax colonnes.


	// Boucle de traitement.
	while($array = $bat->fetch())
	{


		if($array['nbcolonnes'] == 1)
		{
			if($array['nblignes'] > 1)
			{
				$tpl->addRowSpan($array['ligne'], $array['colonne'], $array['nblignes']);
				$tb[$array['ligne']][$array['colonne']] = $tpl->addImage($array['id']);
			}
			else
			{
				$tb[$array['ligne']][$array['colonne']] = $tpl->addImage($array['id']);
			}
		}
		else
		{
			if($array['nblignes'] == 1)
			{
				$tpl->addColSpan($array['ligne'], $array['colonne'], $array['nbcolonnes']);
				$tb[$array['ligne']][$array['colonne']] = $tpl->addImage($array['id']);
			}
			else
			{
				$tpl->addRowSpan($array['ligne'], $array['colonne'], $array['nblignes']);
				$tpl->addColSpan($array['ligne'], $array['colonne'], $array['nbcolonnes']);
				$tb[$array['ligne']][$array['colonne']] = $tpl->addImage($array['id']);
			}		
		}



	}


	$bat->closeCursor();

	$tpl->makeTab($tb);
	$tpl->parse();


}


// Fermeture implicite de la connexion.
$sql = null;

?>
page de la classe template :
<?php

class tpl
{
	// Déclaration des variables.

	private $out = '';
	private $tab = "	";

	private $tabLine =0;
	private $tbLignes=0;
	private $tbCols = 0;

	private $currentTag = array();
	private $rowSpan = array();
	private $colSpan = array();
	private $rowSpanArray=array();

	
	// Méthode permettant d'ajouter une image.

	public function addImage($id)
	{
		return '<img src="'.$id.'.jpg" />';
	}

	// Méthode permettant d'ajouter un lien.

	public function addLink($link, $text='')
	{
		if(strLen($text) == 0) $text = $link;
		return '<a href="'.$link.'">'.$text.'</a>';
	}

	// Méthode d'initialisation d'un tableau.

	public function initTab()
	{
		$array = array();
		$rSA   = array();
		for($i = 1; $i <= $this->tbLignes; $i++)
		{
			for($j = 1; $j <= $this->tbCols; $j++)
			{
				$array[$i][$j] = '&nbsp;';
				$rSA[$i][$j] = 0;
			}
		}

		$this->rowSpanArray = $rSA;

		return $array;
	}

	// Ouverture d'un tableau de $l lignes et $c colonnes.

	public function openTab($l,$c)
	{
		$this->openTag("table");
		$this->tbLignes = $l;
		$this->tbCols = $c;
		$this->tbLine = 0;

		return $this->initTab();
	}

	// Ferme le tableau et efface les colSpan et rowSpan.

	public function closeTab()
	{
		$endTab = array();

		$this->closeTag();
		$this->rmRowSpan();
		$this->rmColSpan();
		$this->tbLine = 1;
	}

	// Ajouter une ligne au tableau courant.

	public function addRow2Tab($cols)
	{

		// Incrément de la ligne et ouverture de la balise tr.
		$this->tabLine++;
		$this->openTag("tr");

		// Le bloc "if" qui suit sert à supprimer les balises "td" en trop s'il y a des colspan sur la ligne.

		$cs = $this->colSpanSum();
		$rs = $this->rowSpanSum();

		if($cs > 0)
		{
			for($i = 1; $i <= $cs; $i++)
			{
				$this->deleteFromArray($cols, '&nbsp;');
			}
		}

		if($rs > 0)
		{
			for($i = 1; $i <= $rs; $i++)
			{
				$this->deleteFromArray($cols, '&nbsp;');
			}
		}

		// On parcours les différentes cellules de la ligne.

		foreach($cols as $key => $val)
		{

			// Le bloc "if" qui suit traite les rowSpan et colSpan.

			if($this->getRowSpan($key) === TRUE || $this->getColSpan($key) === TRUE)
			{
				if($this->getRowSpan($key) === TRUE && $this->getColSpan($key) === TRUE)
				{
					$this->openTag("td", "rowspan=".$this->curRowSpan($key)." colspan=".$this->curColSpan($key));
				}
				elseif($this->getRowSpan($key) === TRUE)
				{
					$this->openTag("td", "rowspan=".$this->curRowSpan($key));
				}
				else
				{
					$this->openTag("td", "colspan=".$this->curColSpan($key));
				}

			}
			else
			{
				$this->openTag("td");
			}

			// Ajout du contenu de la cellule.
			$this->addContent($val);
			// Fermeture de la balise (td).
			$this->closeTag();

		}
		
		// Fermeture de la balise tr.
		$this->closeTag();

	}


	// Ajout d'un rowSpan.
	public function addRowSpan($l, $c, $nb)
	{
		$this->rowSpan[$l][$c] = (int)$nb;
	}

	// Renvoie TRUE s'il y a un rowSpan dans la colonne $c de la ligne courante, FALSE sinon.
	private function getRowSpan($c)
	{
		return ($this->curRowSpan($c)>0)? TRUE:FALSE;
	}

	// Renvoie le nombre de rowSpan de la cellule voulue.
	private function curRowSpan($c)
	{
		return $this->rowSpan[$this->tabLine][$c];
	}

	// Remplissage du tableau de rowSpan.
	private function fillRowSpanArray()
	{
		foreach($this->rowSpan as $ligne => $val)
		{
			foreach($this->rowSpan[$ligne] as $col => $nb)
			{
				for($i = 2; $i <= $nb; $i++)
				{
					$this->rowSpanArray[$ligne+$i-1][$col]++; 
				}
			}
		}
	}

	private function rowSpanSum()
	{
		if($this->rowSpanArray[$this->tabLine])
			return array_sum($this->rowSpanArray[$this->tabLine]);
		else
			return 0;
	}

	// Suppression de tous les rowSpan.
	private function rmRowSpan()
	{
		$this->rowSpan = array();
	}

	// Ajout d'un colSpan à la ligne $l et colonne $c.
	public function addColSpan($l,$c,$nb)
	{
		$this->colSpan[$l][$c] = (int)$nb;
	}

	// Y'a t-il ou non un colSpan dans la cellule selectionnée.
	private function getColSpan($c)
	{
		return ($this->curColSpan($c)>0)? TRUE:FALSE;
	}

	// Renvoie la valeur du colSpan de la cellule courante.
	private function curColSpan($c)
	{
		return $this->colSpan[$this->tabLine][$c];
	}

	// Renvoie la somme de tous les colSpan de la ligne courante.
	private function colSpanSum()
	{
		if($this->colSpan[$this->tabLine])
			return (array_sum($this->colSpan[$this->tabLine]) - count($this->colSpan[$this->tabLine]));
		else
			return 0;
	}


	// Suppression de tous les colSpan.
	private function rmColSpan()
	{
		$this->colSpan = array();
	}


	// Ouverture d'une balise.
	private function openTag($tag, $args = '')
	{
		if(strLen($args)>0) $args=' '.$args;

		array_push($this->currentTag, $tag);
		$this->out.=str_repeat($this->tab, count($this->currentTag)-1).'<'.$tag.$args.'>'.chr(13);
	}

	// Ajout d'un contenu entre deux balises.
	private function addContent($content)
	{
		$this->out.=str_repeat($this->tab, count($this->currentTag)).$content.chr(13);
	}

	private function deleteFromArray(&$array, $deleteIt)
	{
    		$tmpArray = array();
    		$found = FALSE;

    		foreach($array as $key => $value)
    		{
     	 		if($value !== $deleteIt || $found === TRUE)
        		{
                		$tmpArray[$key] = $value;

        		}
        		else
       			{
            			$found = TRUE;
        		}
    		}
  
    		$array = $tmpArray;
  
    		return $found;
	}


	// Fermeture automatique du dernier tag ouvert.
	private function closeTag()
	{
		$openTags = count($this->currentTag);

		if($openTags>0)
			$this->out.=str_repeat($this->tab, count($this->currentTag)-1).'</'.trim($this->currentTag[$openTags-1]).'>'.chr(13);

		array_pop($this->currentTag);
	}


	// Création du tableau ligne par ligne.
	public function makeTab($tb)
	{

		$this->fillRowSpanArray();

		foreach($tb as $k => $v)
		{
			$this->addRow2Tab($v);
		}
		
		// Fermeture du tableau (balise...).
		$this->closeTab();
	}

	// Ecriture de la sortie du moteur de templates.
	public function parse()
	{
		echo $this->out;
	}

}


?>
Merci d'avance et désolé pour la longueur du code.

Jérémy.