begin process at 2012 05 27 22:13:31
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > CLASSE CONSTRUCTEUR DE TABLEAU HTML EN PHP (REVU ET CORRIGÉ)

CLASSE CONSTRUCTEUR DE TABLEAU HTML EN PHP (REVU ET CORRIGÉ)


 Information sur la source

Note :
4 / 10 - par 1 personne
4,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :Table, Tableau, Php, Classe, Constructeur Niveau :Débutant Date de création :22/02/2011 Date de mise à jour :08/03/2011 09:41:43 Vu :4 459

Auteur : demonstorm

Ecrire un message privé
Commentaire sur cette source (46)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Cette classe développée en php permet de construire simplement un tableau Html...

Cette classe n'est peut être pas optimisée au mieux mais fonctionne...

Je suis étudiant en BTS informatique et ce code est ma première contribution à cette communauté.
Je reste donc ouvert à toute suggestion, remarque, conseil...

En espérant avoir apporté quelque chose d'utile...


Demonstorm

Source

  • <?php
  • class Tableau
  • {
  • private $_Header= '';
  • private $_DebutTab= '<table border=';
  • private $_FinTab= '</table>';
  • private $_MonTableau= '';
  • private $_MesLignes= array();
  • private $_TabValide= false;
  • public function Tableau($MonHeader, $nbcols, $border)
  • {
  • $this->_DebutTab .= $border;
  • $this->_DebutTab .= '>';
  • $this->_Header = '<th colspan='.$nbcols.'>';
  • $this->_Header .= $MonHeader;
  • $this->_Header .='</th></tr>';//on construit notre header
  • }
  • public function AjouterLigne(array $MesValeursRecues)
  • {
  • $UneLigne = new Ligne($MesValeursRecues);//on créé une ligne avec pour argument(s) un tableau de valeur(s)
  • array_push($this->_MesLignes, $UneLigne);//on ajoute cette ligne au tableau de lignes
  • $this->_TabValide = false;
  • }
  • public function Finalize()
  • {
  • $this->_MonTableau=$this->_DebutTab;//on commence à construire notre tableau
  • $this->_MonTableau.=$this->_Header;//on ajoute le header
  • foreach ($this->_MesLignes as $LigneEnCours => $this->_MesLignes[$LigneEnCours]) //pour chaque ligne dans le tableau de ligne(s)
  • {
  • $this->_MonTableau .= $this->_MesLignes[$LigneEnCours]->Finalize();//on ajoute à notre tableau la ligne en cours constituée
  • }
  • $this->_MonTableau.=$this->_FinTab;//on ferme notre tableau
  • $this->_TabValide = true;
  • }
  • public function Center()
  • {
  • if($this->_TabValide == true)
  • {
  • $this->_MonTableau = '<center>'.$this->_MonTableau.'</center>';
  • }
  • else
  • {
  • echo 'Tableau non validé!<br>Veuillez vallider votre tableau avant de le centrer...';
  • }
  • }
  • public function Show()
  • {
  • if($this->_TabValide == true)
  • {
  • echo $this->_MonTableau;//affiche le tableau
  • }
  • else
  • {
  • echo 'Tableau non validé!<br>Veuillez vallider votre tableau avant de l\'afficher...';
  • }
  • }
  • public function ShowCode()
  • {
  • if($this->_TabValide == true)
  • {
  • echo(htmlentities($this->_MonTableau));//Affiche le code Html du Tableau constitué!
  • }
  • else
  • {
  • echo 'Tableau non validé!<br>Veuillez vallider votre tableau avant de d\'afficher son code Html...';
  • }
  • }
  • }
  • class Ligne
  • {
  • private $_MaLigne='';
  • private $_DebLigne='<tr>';
  • private $_FinLigne='</tr>';
  • private $_MesColonnes=array();
  • public function Ligne(array $MesColonnesRecues)//on attend un array de valeur(s)(chaque valeur deviendra une cellule
  • {
  • foreach ($MesColonnesRecues as $UneColonne => $MesColonnesRecues[$UneColonne]) //pour chaque valeurs de l'array de valeur(s)
  • {
  • $NouvelleColonne = new Colonne($MesColonnesRecues[$UneColonne][0], $MesColonnesRecues[$UneColonne][1]);//on instancie une cellule avec pour argument la valeur en cours
  • array_push($this->_MesColonnes, $NouvelleColonne);//on ajoute cette cellule au tableau de cellules
  • }
  • }
  • public function Finalize()
  • {
  • $this->_MaLigne=$this->_DebLigne;//on commence a construire notre ligne
  • foreach($this->_MesColonnes as $ColonneEnCours => $this->_MesColonnes[$ColonneEnCours])//pour chaques cellules existante dans le tableau de cellules
  • {
  • $this->_MaLigne .=$this->_MesColonnes[$ColonneEnCours]->Finalize();//on ajoute a notre ligne la cellule constituée
  • }
  • $this->_MaLigne.=$this->_FinLigne;//on termine notre cellule on obtient alors <tr><td>contenu</td></tr>
  • return $this->_MaLigne;//on renvoi notre ligne constituée
  • }
  • }
  • class Colonne
  • {
  • private $_MaColonne='';
  • private $_DebutCol='<td colspan=';
  • private $_FinCol='</td>';
  • public function Colonne($MaValRecue, $MaColsRecue)//on attend le contenu de la cellule
  • {
  • $this->_DebutCol .= $MaColsRecue;
  • $this->_DebutCol .= '>';
  • $this->_MaColonne = $this->_DebutCol;
  • $this->_MaColonne .= $MaValRecue;
  • $this->_MaColonne .=$this->_FinCol;//on construit notre cellule <td>contenu</td>
  • }
  • public function Finalize()
  • {
  • return $this->_MaColonne;//on renvoi notre cellule constituée
  • }
  • }
  • ?>
<?php
	class Tableau
	{
		private $_Header= '';
		private $_DebutTab= '<table border=';
		private $_FinTab= '</table>';
		private $_MonTableau= '';
		private $_MesLignes= array();
		private $_TabValide= false;
		
		public function Tableau($MonHeader, $nbcols, $border)
		{
			$this->_DebutTab .= $border;
			$this->_DebutTab .= '>';
			
			$this->_Header = '<th colspan='.$nbcols.'>';
			$this->_Header .= $MonHeader;
			$this->_Header .='</th></tr>';//on construit notre header
		}
		
		public function AjouterLigne(array $MesValeursRecues)
		{
			$UneLigne = new Ligne($MesValeursRecues);//on créé une ligne avec pour argument(s) un tableau de valeur(s)
			array_push($this->_MesLignes, $UneLigne);//on ajoute cette ligne au tableau de lignes
			$this->_TabValide = false;
		}
		
		public function Finalize()
		{
			$this->_MonTableau=$this->_DebutTab;//on commence à construire notre tableau
			$this->_MonTableau.=$this->_Header;//on ajoute le header
			foreach ($this->_MesLignes as $LigneEnCours => $this->_MesLignes[$LigneEnCours]) //pour chaque ligne dans le tableau de ligne(s)
			{
				$this->_MonTableau .= $this->_MesLignes[$LigneEnCours]->Finalize();//on ajoute à notre tableau la ligne en cours constituée
			}
			$this->_MonTableau.=$this->_FinTab;//on ferme notre tableau
			$this->_TabValide = true;
		}
		
		public function Center()
		{
			if($this->_TabValide == true)
			{
				$this->_MonTableau = '<center>'.$this->_MonTableau.'</center>';
			}
			else
			{
				echo 'Tableau non validé!<br>Veuillez vallider votre tableau avant de le centrer...';
			}
			
		}
		
		public function Show()
		{
			if($this->_TabValide == true)
			{
				echo $this->_MonTableau;//affiche le tableau
			}
			else
			{
				echo 'Tableau non validé!<br>Veuillez vallider votre tableau avant de l\'afficher...';
			}
		}
		

		public function ShowCode()
		{
			if($this->_TabValide == true)
			{
				echo(htmlentities($this->_MonTableau));//Affiche le code Html du Tableau constitué!
			}
			else
			{
				echo 'Tableau non validé!<br>Veuillez vallider votre tableau avant de d\'afficher son code Html...';
			}
			
		}
	}



	class Ligne
	{
		private $_MaLigne='';
		private $_DebLigne='<tr>';
		private $_FinLigne='</tr>';
		private $_MesColonnes=array();
		
		public function Ligne(array $MesColonnesRecues)//on attend un array de valeur(s)(chaque valeur deviendra une cellule
		{
			foreach ($MesColonnesRecues as $UneColonne => $MesColonnesRecues[$UneColonne]) //pour chaque valeurs de l'array de valeur(s)
			{
				$NouvelleColonne = new Colonne($MesColonnesRecues[$UneColonne][0], $MesColonnesRecues[$UneColonne][1]);//on instancie une cellule avec pour argument la valeur en cours
				array_push($this->_MesColonnes, $NouvelleColonne);//on ajoute cette cellule au tableau de cellules
			}
		}
		
		
		public function Finalize()
		{
			$this->_MaLigne=$this->_DebLigne;//on commence a construire notre ligne
			foreach($this->_MesColonnes as $ColonneEnCours => $this->_MesColonnes[$ColonneEnCours])//pour chaques cellules existante dans le tableau de cellules
			{
				$this->_MaLigne .=$this->_MesColonnes[$ColonneEnCours]->Finalize();//on ajoute a notre ligne la cellule constituée 
			}
			$this->_MaLigne.=$this->_FinLigne;//on termine notre cellule on obtient alors <tr><td>contenu</td></tr>
			
			return $this->_MaLigne;//on renvoi notre ligne constituée
		}
	}
		
	class Colonne
	{
		private $_MaColonne='';
		private $_DebutCol='<td colspan=';
		private $_FinCol='</td>';
		
		public function Colonne($MaValRecue, $MaColsRecue)//on attend le contenu de la cellule
		{
			$this->_DebutCol .= $MaColsRecue;
			$this->_DebutCol .= '>';
			$this->_MaColonne = $this->_DebutCol;
			$this->_MaColonne .= $MaValRecue;
			$this->_MaColonne .=$this->_FinCol;//on construit notre cellule <td>contenu</td>
		}
		
		public function Finalize()
		{
			return $this->_MaColonne;//on renvoi notre cellule constituée
		}
	}


?>

 Conclusion

Pour l'utiliser :

1) rajouter ceci au sommet (a l'intérieur de la balise <?php ) de la page qui devra utiliser des tableaux :

include($path."tabconstruct.php");

2) créer un objet de type tabconstruct comme ceci :

$montabconstructor = new tabconstruct();

3) exemple d'utilisation :

$UnHeader = 'Mon Tableau';
$UnHeaderColSpan = "100%";
$UnHeaderBorder = 2;


$UnTableau = new Tableau($UnHeader, $UnHeaderColSpan, $UnHeaderBorder);

$arrLigne = array(array("Ligne1 Colonne1", "50%"), array("Ligne1 Colonne2", "50%"));//(ici 2 colonnes)
$UnTableau->AjouterLigne($arrLigne);
$ar rLigne=0;


$arrLigne = array(array("Ligne2 Colonne1", "33%"), array("Ligne2 Colonne2", "34%"), array("Ligne2 Colonne3", "33%")); //le pourcentage correspond au cols pan et s'obtient comme suit : 100/nombre de colonne que cela recouvre (ici 3 colonnes)
$UnTableau->AjouterLigne($arrLigne);
$ar rLigne=0;

$arrLigne = array(array("Ligne3 Colonne1", "25%"), array("Ligne3 Colonne2", "25%"), array("Ligne3 Colonne3", "25%"), array("Ligne3 Colonne4", "25%"));// (ici 4 colonnes)
$UnTableau->AjouterLigne($arrLigne);
$ar rLigne=0;

$arrLigne = array(array("Ligne4 Colonne1", "20%"), array("Ligne4 Colonne2", "20%"), array("Ligne4 Colonne3", "20%"), array("Ligne4 Colonne4", "20%"), array("Ligne4 Colonne5", "20%"));// (ici 5 colonnes)
$UnTableau->AjouterLigne($arrLigne);
$ar rLigne=0;

$UnTableau->Finalize();
$UnTableau->Cen ter();
$UnTableau->Show();

*********
* BONUS *
*********

Cette méthode vous permet d'afficher le code html de votre tableau (ca peut servir pour certains)

$UnTableau->ShowCode();


 Historique

28 février 2011 11:06:53 :
Mise a jour du code : > tabconstructeur et maintenant une class > POO (ré-utilisabilité du code)
07 mars 2011 14:20:15 :
Réévaluation du niveau...
08 mars 2011 09:41:43 :
Petites corrections...

 Sources de la même categorie

Source avec Zip GÉNÉRATION AUTOMATIQUE DE FICHIER .CLASS.PHP EN FONCTION D'U... par ig3
CLASSE D'OBJET DE CRYPTAGE ET DÉCRYPTAGE DE CHAINES DE CARAC... par 8Tnerolf8
Source avec Zip MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture PAGINATION JAVASCRIPT PHP MYSQL par cod57
Source avec Zip CLASSE TABLE HTML DYNAMIQUE par LDDL
Source avec Zip EXÉCUTER DES REQUETE STYLE SQL SUR UN ARRAY par prince418
CLASSE SIMPLE EMAIL par Odradek
CLASSE DATABASE POUR CONNECTION ET MODIFICATION D'UNE BDD MY... par franco_se

Commentaires et avis

Commentaire de phpAnonyme le 22/02/2011 15:32:02

lut,

Première contrib, bon ok!
Sinon, ben je pense que le concept d'objet et d'encapsulation t'échappe ! Car là tu n'a mis qu'un ensemble de fonctions dans une classe. Y a mieux à faire.

Commentaire de marm0tte le 22/02/2011 23:22:24

SAlut.
D'accord avec phpAnonyme.
De plus j'ai veux deux choses qui me dérange beaucoup :
- les balises HTML en minuscule, histoire de suivre les standards.
- nomme tes variables soit tout en anglais, soit tout en français mais ne mélange pas. "MaNewString"....

Bonne continuation

Commentaire de Morphinof le 23/02/2011 09:38:22

Je rejoins les deux premiers commentaires, si tu veux ecrire une abstraction HTML il faut penser objet et voir un peu plus large, une de mes sources pourrai t'inspirer sur ce sujet : http://www.phpcs.com/codes/ABSTRACTHTML-GENERATOR_51916.aspx

Bon courage et bonne continuation

Commentaire de demonstorm le 23/02/2011 11:11:41

Merci pour toutes ces remarques, je suis en BTS je le rappelle : ca ne fais que 4 moi que j'ai compris la notion d'objet c'est pas encore ultra clair pour moi...

De plus il ne me reste pas énormément de temps avant la fin de mon stage du coup je suis allé au plus rapide mais une mise a jour est prévu pour corriger un peu cela.

au final un objet tableau aura donc comme attribut un header et sera un manager d'objets de type ligne qui seront eux même des managers de colonnes

un objet colonne (appartenat donc à une ligne) contiendront des strings

pour ce qui est des noms de variables en franglais c'est une idée de mon prof qui nous a appris a faire comme ca pour reconnaitre nos objets...

corrigez moi si je me trompe...

enfin je le répète, je reste ouvert à tous conseils et toutes remarques! :)

Commentaire de demonstorm le 23/02/2011 11:13:30

Ps : j'ai oublié de préciser que le php n'est pas mon langage de prédilection (c'est plutôt le C#)...

Bonne journée/Soirée (c'est selon...)

Commentaire de Morphinof le 23/02/2011 12:19:15

C'est paradoxal de dire que le php est pas ton langage de predilection mais plutot le C# et que la notion d'objet est encore obscure vu que le C# est un langage objet et le php le deviens petit a petit mais bon ^^

Pour le nom des variables je prefere choisir anglais comme ca tout le monde peu comprendre mais bon le principal c'est que ce soit coherent quelque soit la langue.

Sinon pour ta conception elle est a mon avis trop lourde meme si elle est plutot coherente, en effet si tu cree un objet qui contient une une liste d'objet ligne contenant lui meme une liste d'objet colone et que tu t'en sert que pour ca l'interet est limite.
Si sa s'applique a plusieurs type d'objets different la ca pourrai etre bien mais a ta place je me simplifirait la vie et je ferais un objet Tableau qui contient un tableau associatif du genre :

private $tab = array( tableau_de_ligne(tableau_de_colones()) );

Il te suffira de le parcourir correctement pour generer ton tableau html, c'est bien moins lourd et ca aura le meme effet pour moins de travail.

Bonne continuation !

Commentaire de Morphinof le 23/02/2011 12:22:20

Pour preciser ca donnerai un traitement comme ca :

$html = '';

foreach ($this->tab as $row)
{
  $html .= '<tr>';
  foreach ($row as $col => $data)
  {
    $html .= '<td>'.$data.'</td>';
  }
  $html .= '</tr>';
}

Enfin un truc du genre.

Commentaire de fenoril le 23/02/2011 13:13:14

Salut !

C'est toujours sympa d'automatiser un peu les codages, bonne idée de fainéant, donc de codeur...

Je par ailleurs particulièrement d'accord avec morphinof, pour la POO et la forme basée sur un tableau php (on va souvent tirer les infos d'une bdd, et donc on a une mise en correspondance assez facile à faire en amont).

A ajouter aux critiques, les balises html center et font color que tu as choisi sont dépréciées et en cours de disparition.

La critique seule n'étant pas le but, deux idées pour régler le problème :
Soit que ces fonctions (center et fontcolor)envoient des span avec un style : Reste souple d'utilisation, mais pas parfait côté séparation contenu/mise en forme.
Soit que ces fonctions envoient des span avec des classes définies dans un css : Plus limitant (car il faut une classe par couleur), mais plus respectueux de la séparation.

Amicalement,

Commentaire de demonstorm le 23/02/2011 13:53:53

"C'est paradoxal de dire que le php est pas ton langage de prédilection mais plutôt le C# et que la notion d'objet est encore obscure vu que le C# est un langage objet et le php le deviens petit a petit mais bon ^^"

Je ne dis pas que la POO est obscur, juste que je ne maitrise pas encore tout de l'objet et je suis loin de connaitre chacun des DP (Design Pattern)

Enfin je me débrouille mieux en C# qu'en php.... ;)

Commentaire de demonstorm le 23/02/2011 16:15:36

Coucou tout le monde, je viens de me pencher sur une mise à jour mais cela ne fonctionne pas...

<?php

class Tableau
{
private $_Header="";
private $_DebutTab="<table>";
private $_FinTab="</table>";
private $_MonTableau="";
private $_MesLignes= array();

public function Tableau($MonHeader, $nbcols)
{
$_Header = '<th colspan="'.$nbcols.'">'.$MonHeader.'</th>';
}

public function AjouterLigne($MesValeursRecues)
{
$UneLigne = new Ligne($MesValeursRecues);
array_push($_MesLignes, $UneLigne);
}

public function Finalize()
{
$_MonTableau=$_DebutTab;
foreach ($_MesLignes as &$LigneEnCours)
{
$_MonTableau.=$LigneEnCours->Finalize();
}
$_MonTableau.=$_FinTab;
}

public function Show()
{
echo $_MonTableau;
}

public function Resultat()
{
return $_MonTableau;
}
}



class Ligne
{
private $_MaLigne="";
private $_DebLigne="<tr>";
private $_FinLigne="</tr>";
private $_MesColonnes=array();

public function Ligne($MesColonnesRecues)
{
foreach ($MesColonnesRecues as &$UneColonne)
{
$NouvelleColonne = new Colonne($UneColonne);
array_push($_MesColonnes, $NouvelleColonne);
}
}

public function Finalize()
{
$_Maligne=$_DebLigne;
foreach($_MesColonnes as &$ColonneEnCours)
{
$_Maligne.=$ColonneEnCours->Finalize();
}
$_Maligne.=$_FinLigne;

return $_MaLigne;
}
}

class Colonne
{
private $_MaColonne="";
private $_DebutCol="<td>";
private $_FinCol="</td>";

public function Colonne($MaColonneRecue)
{
$_MaColonne=$_DebutCol.$MaColonneRecue.$_FinCol;
}

public function Finalize()
{
return $_MaColonne;
}
}

?>

Ça c'est le fichier à inclure...

et voila un exemple de son utilisation :


<?php

echo'<br>D&eacute;but MonTableau<br>';
$UnHeader = "Mon Tableau";
$UnHeaderColSpan = 3;


$UnTableau = new Tableau($UnHeader, $UnHeaderColSpan);
$arrLigne1 = array("Ligne1 Colonne1", "Ligne1 Colonne2", "Ligne1 Colonne3");
$UnTableau->AjouterLigne($arrLigne1);
$arrLigne2 = array("Ligne2 Colonne1", "Ligne2 Colonne2");
$UnTableau->AjouterLigne($arrLigne2);
$UnTableau->Finalize();
$UnTableau->Show();
echo'<br>Fin MonTableau';

?>


Le tableau ne s'affiche pas, aurais je oublié quelque chose?

Commentaire de Morphinof le 23/02/2011 16:34:58

Heu c'est plutot normal puisque tu retourne des variables locales a tes methode et non ton attribut de classe.
Par exemple :
public function Finalize()
{
  return $_MaColonne;
}

Tu est dans le scope de la methode Finalize mais $_MaColonne n'exite pas. Il faut retourner $this->$_MaColonne; et ce a chaque fois que tu veux utiliser un attribut.

Commentaire de Morphinof le 23/02/2011 16:36:08

Desole j'ai copie coller et c'est $this->_MaColonne; pas $this->$_MaColonne; ^^ Je precise aussi que c'est la premiere erreur que j'ai vu j'ai pas pousse plus loin

Commentaire de demonstorm le 23/02/2011 16:56:08

Merci, je vais essayer avec ca! :)
Je vous tiens au courant...

Commentaire de MagicGilles le 23/02/2011 17:09:31

Hum un petit détail en passant. En php 5 le constructeur s'appelle __construct. C'est juste pour la cohérence de ton code.
Je vois que tu fais du html donc pourquoi ne pas étendre une classe HtmlElement, une classe HtmlAttribut et une classe HtmlNode. Un peu à la façon de DomDocument (en plus light).
Tu peux aussi créer une interface renderable avec render (pour retourner le html sous forme de chaine) et __toString (qui appelle implicitement render). ça aurait le mérite de rendre réutilisable les classes créant du html.
Enfin c'est juste quelques idées comme ça en l'air

Commentaire de demonstorm le 23/02/2011 17:11:16

imaginons j'ai une fonction comme ca :
class A
{
     $montexte='bla';
     function mafonction($mavaiable)
     {
     }
}

est ce que je dois faire :

class A
{
     $montexte='bla';
     function mafonction($mavariable)
     {
          $mavariable='blabla';
          echo $this->mavariable.this->montexte;
     }
}

ou :

class A
{
     $montexte='bla';
     function mafonction($mavariable)
     {
          $mavariable='blabla';
          echo $mavariable.this->montexte;
     }
}

Commentaire de demonstorm le 23/02/2011 17:13:01

Oula MAGICGilles, je suis pas sur d'arriver à faire ca... :/

Commentaire de MagicGilles le 23/02/2011 17:46:25

Bah c'est pas aussi compliqué que ça. Je te donne la structure rapidement.
interface renderable
{
public function render();
public function __toString();
}
abstract class HtmlNode{
ici tu gères les noeuds. ajouter, supprimer etc
}
class AttributeElement extends HtmlNode implements renderable
{
//ici tu gères l'attribut sans oublier le render et le __toString
}
class HtmlElement extends HtmlNode implements renderable
{
//ici tu gères le nom de la balise, l'ajout,supprission d'attributs (sous entendu géré par HtmlAttribut) etc etc sans oublier le render et le __toString
}
class Table extends HtmlElement
{
}

Bon il y a sans doute possibilité de faire mieux niveau structuration mais ça donne une petite idée

Commentaire de MagicGilles le 23/02/2011 17:52:46

Pour répondre à ta question.
class A
{
private $montexte = 'bla';
function mafonction($mavariable)
     {
     $this->montexte = $mavariable;//affectation

     echo $this->montexte; //affichage
     }
}

Commentaire de Morphinof le 24/02/2011 09:40:49

J'insiste sur le fait que oui la conception objet c'est bien mais la c'est beaucoup pour juste generer un tableau. Des fois il vaut mieux faire simple en objet toujours sans pour autant faire toute une analyse d'abstraction de l'html surtout si tu as peu de temps devant toi.
Je te reconseille le simple tableau de lignes / colones, mettons que plus tard quelqu'un doive reprendre ton travail il faut qu'il puisse etre accessible et surtout le plus simple possible.

Bon courage pour la suite ;)

Commentaire de demonstorm le 24/02/2011 11:30:59

Hello tout le monde, je ne comprend pas pour quoi mais la page ne m'affiche que le header du tableau...

<?php

class Tableau
{
private $_Header='';
private $_DebutTab='<table border=';
private $_FinTab='</table>';
private $_MonTableau='';
private $_MesLignes= array();

public function Tableau($MonHeader, $nbcols, $border)
{
$this->_DebutTab .= $border;
$this->_DebutTab .= '>';

$this->_Header = '<tr><th colspan='.$nbcols.'>';
$this->_Header .= $MonHeader;
$this->_Header .='</th></tr>';//on construit notre header
}

public function AjouterLigne($MesValeursRecues)
{
$UneLigne = new Ligne($MesValeursRecues);//on créé une ligne avec pour argument(s) un tableau de valeur(s)
array_push($this->_MesLignes, $UneLigne);//on ajoute cette ligne au tableau de lignes
}

public function Finalize()
{
$this->_MonTableau=$this->_DebutTab;//on commence a construire notre tableau
$this->_MonTableau.=$this->_Header;//on ajoute le header
foreach ($this->_MesLignes as $LigneEnCours) //pour chaque ligne dans le tableau de ligne(s)
{
$this->_MonTableau.=$LigneEnCours->Finalize();//on ajoute à notre tableau la ligne en cours constituée
}
$this->_MonTableau.=$this->_FinTab;//on ferme notre tableau
}

public function PrintMesLignes()
{
print_r($this->_MesLignes);
}

public function Show()
{
echo $this->_MonTableau;//affiche le tableau
}

public function Resultat()
{
return $this->_MonTableau;//renvoi le tableau
}

public function ShowCode()
{
printf(htmlentities($_MonTableau));
}
}



class Ligne
{
private $_MaLigne='';
private $_DebLigne='<tr>';
private $_FinLigne='</tr>';
private $_MesColonnes=array();

public function Ligne($MesColonnesRecues)//on attend un array de valeur(s)(chaque valeur deviendra une cellule
{
foreach ($MesColonnesRecues as $UneColonne) //pour chaque valeurs de l'array de valeur(s)
{
$NouvelleColonne = new Colonne($UneColonne[0], $UneColonne[1]);//on instancie une cellule avec pour argument la valeur en cours
array_push($this->_MesColonnes, $NouvelleColonne);//on ajoute cette cellule au tableau de cellules
}
}

public function PrintMesColonnes()
{
print_r($this->_MesColonnes);
}

public function Finalize()
{
$this->_Maligne=$this->_DebLigne;//on commence a construire notre ligne
foreach($this->_MesColonnes as $ColonneEnCours)//pour chaques cellules existante dans le tableau de cellules
{
$this->_Maligne.=$ColonneEnCours->Finalize();//on ajoute a notre ligne la cellule constituée
}
$this->_Maligne.=$this->_FinLigne;//on termine notre cellule on obtient alors <tr><td>contenu</td></tr>

return $this->_MaLigne;//on renvoi notre ligne constituée
}
}

class Colonne
{
private $_MaColonne='';
private $_DebutCol='<td colspan=';
private $_FinCol='</td>';

public function Colonne($MaColonneRecue)//on attend le contenu de la cellule
{
$this->_DebutCol .= (int)$MaColonneRecue[1];
$this->_DebutCol .= '>';
$this->_MaColonne = $this->_DebutCol;
$this->_MaColonne .= (string)$MaColonneRecue[0];
$this->_MaColonne .=$this->_FinCol;//on construit notre cellule <td>contenu</td>
}

public function Finalize()
{
return $this->_MaColonne;//on renvoi notre cellule constituée
}
}



?>

avec pour utilisation :

<?php

echo'<br>D&eacute;but MonTableau<br>';
$UnHeader = 'Mon Tableau';

$UnHeaderColSpan = 3;

$UnHeaderBorder = 2;


$UnTableau = new Tableau($UnHeader, $UnHeaderColSpan, $UnHeaderBorder);

$arrLigne1 = array(array('Ligne1 Colonne1', 1), array('Ligne1 Colonne2', 1), array('Ligne1 Colonne3', 1));

$UnTableau->AjouterLigne($arrLigne1);

$arrLigne2 = array(array('Ligne2 Colonne1', 2), array('Ligne Colonne2', 2));

$UnTableau->AjouterLigne($arrLigne2);

$UnTableau->Finalize();

$UnTableau->Show();

echo'<br>Fin MonTableau';
echo'<br><br>';

$UnTableau->ShowCode();

?>

Du coup je me suis dit que j'allais afficher le code html créé et donc dans la class Tableau j'ai créé la fonction ShowCode()

mais je ne comprend pas elle ne semble pas fonctionner(rien à l'ecran, même pas le code concernant le header de mon tableau(qui lui apparemment fonctionne))


Help me, pleaase help me, je deviens fououououououuuuu... (sur l'air de "Love me")

Commentaire de demonstorm le 24/02/2011 12:00:52

Pour aperçu voila ce que j'obtiens :
http://img7.imageshack.us/img7/1135/blablablaxn.jpg

Commentaire de Morphinof le 24/02/2011 23:58:07

Hum.
public function ShowCode()
{
printf(htmlentities($_MonTableau));
}

$this->$_MonTableau ? :)

Commentaire de demonstorm le 25/02/2011 09:04:05

Ah oui mdr! Je vais essayer ca...:)

Commentaire de Morphinof le 25/02/2011 09:34:08

Mince encore le copier coller foireux ^^ $this->_MonTableau et pas $this->$_MonTableau :p

Commentaire de demonstorm le 25/02/2011 09:45:52

donc ca marche du coup comm j'avais oublié le => $value dans tous mes forech j'ai fais la correction et j'obtiens cette erreur maintenant :

Fatal error: Call to a member function Finalize() on a non-object in C:\Program Files\EasyPHP-5.3.3.1\www\tabconstruct.php on line 96


voila la fonction Finalize de la classe Tableau :

#90 public function Finalize()
#91 {
#92 $this->_MonTableau=$this->_DebutTab;//on commence a construire notre tableau
#93 $this->_MonTableau.=$this->_Header;//on ajoute le header
#94 foreach ($this->_MesLignes as $LigneEnCours => $value) //pour chaque ligne dans le tableau de ligne(s)
#95 {
#96 $this->_MonTableau.=$LigneEnCours->Finalize();//on ajoute à notre tableau la ligne en cours constituée
#97 }
#98 $this->_MonTableau.=$this->_FinTab;//on ferme notre tableau
#99 }


Quelqu'un aurait la solution?

Commentaire de Morphinof le 25/02/2011 10:52:01

Selon le libelle et sans lire le code ca viens de la :
foreach ($this->_MesLignes as $LigneEnCours => $value)

LigneEnCours n'est pas un objet Ligne et du coup tu peux pas appeller ta fonction surment parce que LigneEnCours est soit une chaine soit un entier qui correspond a l'index as cause de l'utilisation de as ton objet ligne est dans $value.

Je peux pas lire ton code je suis sur un truc mais si ca marche toujours pas apres ca je regarderai

Commentaire de demonstorm le 25/02/2011 11:48:01

avec ca je n'ai plus d'erreur mais je n'ai toujours pas mes ligne(donc les colonnes non plus)...


voila la fonction Finalize de la classe Tableau :

public function Finalize()
{
$this->_MonTableau=$this->_DebutTab;//on commence a construire notre tableau
$this->_MonTableau.=$this->_Header;//on ajoute le header
foreach ($this->_MesLignes as $LigneEnCours => $value) //pour chaque ligne dans le tableau de ligne(s)
{
$this->_MonTableau .= $this->_MesLignes[$LigneEnCours]->Finalize();//on ajoute à notre tableau la ligne en cours constituée
}
$this->_MonTableau.=$this->_FinTab;//on ferme notre tableau
}

Commentaire de Morphinof le 25/02/2011 12:22:17

Tu peux m'envoyer ta source que je puisse tester ?

Commentaire de demonstorm le 25/02/2011 14:05:13

fait...

Commentaire de alain04 le 28/02/2011 05:09:53

Waouhhh ! je dois être en retard d'une génération. Tant qu'à vouloir faire un tableau HTML (si j'ai bien compris)c'est pas plus simple et plus rapide de baliser ... en HTML?

Commentaire de bj33 le 28/02/2011 07:19:31

salut

variable non définie

printf(htmlentities($_MonTableau));

return ($this->_MonTableau);

quand on utilise un éditeur digne de ce nom, çà saute aux yeux;)

pour la forme du code, il y à du boulot...courage

Commentaire de demonstorm le 28/02/2011 10:56:49

Voila terminé, source mise a jour!
Merci à Phpanonyme, Marm0te et Fenoril pour leurs conseils
et merci à Morphinof(ce pseudo serait il un petit clin d'½il évoquant la notion de Polymorphisme?) pour avoir pris le temps de me donner des conseil, de m'orienter vers certaines idées, m'avoir apporter pas mal de réponses...

Alain04 => C'est jamais très joli (mais quand même un peu plus facile pour les neos) de mettre du html dans du php (personnellement si je connais une façon systématique de séparer php de html (autre que par le principe de CSS+TPL+PHP) je le ferais...

L'intérêt de ce code (même si un peu lourd a utiliser (pas forcement compliqué, mais vachement répetitif) et de pouvoir générer un tableau sans html (principe d'objet oblige, la classe tabconstruct est entièrement réutilisable)


BJ33 => pour le htmlentities j'avais corrigé cela courant la semaine dernière mais merci d'y avoir pensé... Pour ce qui est de l'éditeur je n'en utilise pas, je tourne avec NP++ même si j'aimerai utiliser un éditeur qui m'assisterait un peu plus...

Commentaire de demonstorm le 28/02/2011 11:12:40

PS : vous remarquerez que je reste ouvert à tout conseil et/ou toute remarque, cependant n'oubliez pas que je encore étudiant en développement...

Une petite note? :P

Commentaire de bj33 le 28/02/2011 13:25:51

salut

<<même si j'aimerai utiliser un éditeur qui m'assisterait un peu plus...

NP++ comme beaucoup de débutants. mais il y a bien mieux, netbeans, par exemple, ou encore mieux, zend studio mais là, bien sur, il faut payer. Mais netbeans est plus qu'éfficace et gratuit, et il gére aussi le java, c, c++, etc. presque aussi éfficace que zs, alors.

<<private $_DebutTab='<table border=';

ce border, çà fait désordre;) c'est aux css de gérer çà. a la limite un style=""

et perso, j'ai coder des classes pour générer des tableaux à la volée mais avec des méthodes statiques et des classes abstraites...si tu manques d'inspiration, n'hésite pas.

Commentaire de demonstorm le 28/02/2011 13:45:55

Merci JB, j'essaierai NB,

pour <<private $_DebutTab='<table border='; je ne gère pas le header html ma class, difficile donc de mettre en place du CSS...


Pour ce qui est de static et abstraite et static je me heurte a 2 problème pour static n'ayant pas compris l'entière utilité de static je l'utilise pas trop (la seule chose vu en cours concernant static est le fait qu'une classe, methode ou variable static est directement utilisable sans aucune instanciation (c'est la seule chose que le prof nous a dit)

Pour abstraite je ne l'utilise jamais, car je n'ai jamais compris le DP de la fabrique abstraite ni même son utilité (j'aimerai d'ailleurs la comprendre)

Commentaire de bj33 le 28/02/2011 14:08:31

<<Pour abstraite je ne l'utilise jamais, car je n'ai jamais compris le DP de la fabrique abstraite ni même son utilité

classe abstraite, pas design pattern ;)

http://fr2.php.net/manual/fr/language.oop5.php

et tu est plus a l'aise avec csharp!?

Commentaire de demonstorm le 28/02/2011 14:41:20

bah je suis plus à l'aise avec C#, ca c'est sur...

la classe abstraite fait appelle au DP Fabrique abstraite (ou abstract factory) d'après ce que nous en a dit le prof du coup comme je n'ai pas compris ce DP la ben je coince...

Commentaire de bj33 le 28/02/2011 15:52:29

class SqueletteXhtml implements ISqueletteXhtml {
private static $_doctypeTrans = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
   private static $_doctypeStrict = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';

public static function table(array $tab_params, $contenu) {
$tp = '<table ';
foreach ($tab_params as $k => $v) {
if (end($tab_params) == $v)
$tp .= $k.'="'.$v.'"';
else $tp .= $k.'="'.$v.'" ';
}
$tp .= '>'.chr(10);
$tp .= $contenu;
$tp .= self::ferme('table');
     return $tp;
   }
}

là, je fais,

include_once 'SqueletteXhtml.php';

SqueletteXhtml::table(...) ou SqueletteXhtml::$_doctypeTrans

çà permet de se servir des méthodes de classes n'importe où, y compris hors de la classe et ce à plusieurs niveaux d'imbrication. très pratique.
ce n'est pas la seule utilité des méthodes et variables statiques mais s'en est une.

un design pattern fabrique, c'est par exemple,

final class Fabrique {
private static $_instance = null;
private $_namespace;

/**
* constructeur protege pour empecher une instanciation directe
*/
protected function __construct() {}

/**
* retourne une instance de la classe en tenant compte du namespace
*
* @param $namespace
* @return object
*/
public static function getInstance($namespace = null) {
if (is_null(self::$_instance)) {
self::$_instance = new self;
}
self::$_instance->_namespace = $namespace;
return self::$_instance;
}

public function __call($methodes,$arguments) {
$classe = ucfirst(strtolower($this->_namespace.$methodes));
if (class_exists($classe,false)) {
$retourClasse = new ReflectionClass($classe);
if ($retourClasse->isInstantiable() && $retourClasse->hasMethod('__construct')) {
return $retourClasse->newInstanceArgs($arguments);
} else {
throw new Format_Generique('La classe '.$classe.' n\'est pas instanciable');
}
} else {
throw new Format_Generique('La classe '.$classe.' est introuvable');
}
}
}

ne mélange pas tout;) une classe abstraite,

abstract class NettoyageFormulaire {
protected static function nettoie($variable) {
if (get_magic_quotes_gpc()) {
stripslashes($variable);
}
$variable = trim(strip_tags($variable));
return $variable;
}
}

et là, je fais,

include_once 'NettoyageFormulaire.php';

NettoyageFormulaire::nettoie()

une classe abstraite çà peut aussi être çà,

abstract class Chemin {
const CHEMIN_CLASSES = 'classes/';
const CHEMIN_FONCTIONS_UTILITAIRES = 'classes/utilitaires/fonctions/';
const CHEMIN_INC = 'includes/';
}

pour accéder au facilement aux paramètres de config sans contraintes ou les fixer. çà vient en bossant, t'inquiete pas. ce ne sont que des exemples, cherche les tutos de malaman, admin du réseau cs, ce sont les meilleurs.

Commentaire de bj33 le 28/02/2011 16:08:06

http://www.phpcs.com/tutoriaux/DESIGN-PATTERNS_729.aspx

un bon point de départ pour la POO php et les patterns signé malalam, un cador du genre. 4 pages pour tout comprendre.

Commentaire de demonstorm le 28/02/2011 16:11:56

Je vais voir ca, merci! :)

Commentaire de bj33 le 28/02/2011 16:17:42

désolé pour ce troisième post mais impossible d'éditer.

<<SqueletteXhtml::table(...) ou SqueletteXhtml::$_doctypeTrans

correction, la variable étant privé, on fera,

SqueletteXhtml::table(...) ou self::$_doctypeTrans

autre correction

config sans contraintes ou/et les fixer

Commentaire de demonstorm le 02/03/2011 10:11:58

Serait il possible que vous notiez ma source afin d'avoir une petite idée de ce qu'elle peut valoir?

Ps: Je compte la présenter comme Application Professionnelle pour mes oraux du BTS (on doit en présenter 5 au minimum (7 au maximum) et on est interrogé sur 1 seule)

Commentaire de bj33 le 02/03/2011 22:16:13 4/10

salut

ok mais en l'état, elle ne mérite pas le niveau initié. manque de return, pour le chainage. Mauvaise utilisation du html généré, essai de relire le code source html généré. La méthode finalise n'à aucun intérét. et çà,
<pre>
public function Show()
{
echo $this->_MonTableau;//affiche le tableau
}

public function Resultat()
{
return $this->_MonTableau;//renvoi le tableau
}
</pre>
doublon inutile même si je vois la finalité j'ai du mal avec la logique. pense aux fonctions magiques, call, get, set etc. utilise pourquoi pas les patterns, içi, ils feraient merveille.
des méthodes statiques pour ton html. Je pourrais mais je vais faire simple, tu te prends la tête avec les tableaux, 80% sont inutiles, génération de html mal pensée, pour générer...un tableau. Une note? 8/20. Mais ce n'est que mon avis, je génére aussi beaucoup de tableaux dynamique hors bdd;) Intéressant mais manque maturité et en l'état pas très utile. Et vire les echo dans les classes, pense aux erreurs possibles, de paramètres par exemple.

Commentaire de demonstorm le 07/03/2011 14:17:34

enfin faut se dire aussi qu'à moins d'être un petit génie ca n'aurai pas pu être parfait dès le premier code posté! :/

Après je ne connais pas énormément de DP (2 en fait : Singleton et Polymorphisme)...

Commentaire de bj33 le 07/03/2011 18:02:28

salut

<<Après je ne connais pas énormément de DP (2 en fait : Singleton et Polymorphisme)...

pour le singleton, ok mais le polymorphisme n'est pas un design pattern.

http://www.nexen.net/actualites/tutorial/16737-le_polymorphisme_en_php_:_1ere_partie.php

<<ca n'aurai pas pu être parfait dès le premier code posté!

ce n'est pas le but non plus:) et puis les codes géniaux on sait ou aller les chercher voire comment les coder(sic).

Commentaire de demonstorm le 08/03/2011 09:34:36

<<pour le singleton, ok mais le polymorphisme n'est pas un design pattern.>>
En plus! Donc voila au final je n'en connais qu'un! :/

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

concaténation [ par yanipig ] Bonjour &#224; tous, j ai un petit probl&#232;me de&nbsp;concatenation&nbsp;&nbsp;&nbsp;De un j ai un tableau d 'entiers&nbsp;repr&#233;sentant&nbsp;m PHP classe constructeur [ par missceline33 ] Bonjour &#224; tous, j'ai un probl&#232;me avec mes classes PHP. Je voudrais d&#233;finir plusieurs constructeurs &#224; ma classe mais quand je rajou Variables [ par simpso95 ] Bonsoir à tous.Je me lance dans la grande famille du....php. Déjà je bute sur quelques problème.Afin d'apprendre le php 5, je construis un "jeu" éduca TABLEAU PHP [ par daris ] Bonjour,J'ai un tableau qui se présente comme ci dessous.array{    [HUMIDITE] =&gt; Array        {            [Humidité] =&gt; Array                {  Récupérer les valeurs de la première colonne d'une table dans un tableau [ par etincelle01 ] Bonsoir, Dans PHP, il y a la fonction mysql_fetch_array() qui place les enregistrements résultats d'une requête dans un tableau. Mais il n'y a pas de Masquer une colonne dans un tableau en php [ par nostalgieing ] Bonjour j'ai un tableau dont deux colonnes contiennt deux operateurs et je veux les masquer (seulement masquer ces deux colonnes) mais je ne trouve include dans une variable PHP [ par mdc888 ] Salut à tous, Je cherche à inclure un tableau html dans un système d'envoi de mail. Ce tableau est utilisé par d'autres parties de mon code. Exemple Affichage miniature avec javacript et boucle while php [ par stvoim2 ] Bonjour, je m'adresse ici car j'ai tout essayé pour répondre à mon problème en vain et je ne suis pas un specaliste du language javascript. J'ai créer checkbox en php [ par nejla25kachroudi ] Bonjour,j'ai un problème au niveau de checkbox,j'ai un formulaire sous forme d'un tableau de coordonnées des étudiants (les coordonnées sont enregistr initialisation d'un tableau en php [ par boubeuch1 ] Bonjour, Je souhaiterais afficher mes différents albums dans un tableau à 2 colonnes. <?php $dossierphoto=opendir("../photo_galerie");//ouvre le


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,733 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales