begin process at 2012 05 27 17:59:24
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > [PHP5][POO] EXEMPLES DE SYSTEME DE CLASSE (HERITAGE, AGREGATION, COMPOSITION, ETC...) GENERANT DE L'HTML

[PHP5][POO] EXEMPLES DE SYSTEME DE CLASSE (HERITAGE, AGREGATION, COMPOSITION, ETC...) GENERANT DE L'HTML


 Information sur la source

Note :
7,33 / 10 - par 3 personnes
7,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :poo, php5, agregation, heritage, classe Niveau :Initié Date de création :20/04/2006 Date de mise à jour :22/04/2006 12:02:43 Vu / téléchargé :16 010 / 560

Auteur : Nifhell

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

 Description

Bonjour,

Voilà maintenant 2 ans que mon site (http://nifhell.free.fr) a été codé grace à ce système de classe que j'ai codé moi même.

Le principe est simple: j'ai créé une classe PHP par entité HTML dont j'avais besoins, puis pour à peu prés tous les tags HTML existant.

Une page HTML étant des TAGS s'imbriquant les un dans les autres, j'ai donc crée une "méta classe" CTag dont dérivent toutes les autres et qui peuvent s'imbriquer.

Le but étant de ne plus avoir à se soucier de coder en HTML d'un coté et en PHP de l'autre: ici tout est en PHP. Et l'affichage se fait par un simple "echo" de l'objet "CTag" englobant tous les autres, à la fin du script.
Aussi pour mon site je n'ai pas écrit une seule ligne d'HTML.

Ainsi une fois les principales classes de TAGS HTML créés, j'ai pus en dériver des versions personalisées et customisées (comme la classe CMenu ou CPageperso contenues dans le zip).

Avantage:
Facile à maintenir et plus de problème entre affichage et traitement de données ni de passer par une gestion de templates, vite bordélique (enfin pour moi).
Mise à jour du contenu de votre site rapide et centralisé par classe.
Exemple: vous voulez modifier le "header" de toutes les pages de votre site. Vous ne modifier qu'un seul document: la classe CPageperso.php ou la classe CHeader.php
Défaut: bien moins rapide que des templates et bien plus gourmand en ressource (enfin je suppose, j'ai jamais fait de comparatif) ...

Source

  • //Ceci est la page subscribe.php de mon site perso, qui permet de s inscrire à mon site
  • $p = new CPageperso("Please fill the register form");
  • $f = new CForm("post","./bin/cgi/register.php5","formulaire");
  • $f->onsubmit("valide");
  • $a = new CTable(17,1);
  • if (isset($_GET['title'])) $a->addTitle($_GET['title']);
  • else {
  • if(!is_null($error_mess)) $a->addTitle("Please fill all the following fields: ".$error_mess);
  • }
  • $a->getTitle()->styleClass("small");
  • $a->styleClass("top");
  • $a->getCell(2,1)->addTag(new CInputText("login",20,30,$login))->getTag(1)->id("login")->styleClass("text")
  • ->onblur("valide_char(this,'&,;:./§%\$£+=}])*µ<>°`|[({#~²',3)");
  • $a->getCell(1,1)->addTag(new CLabel("Enter your Login:","login"));
  • $a->getCell(4,1)->addTag(new CPassword("password1",20,30,""))->getTag(1)->id("password1")->styleClass("text")
  • ->onblur("valide_char(this,'',6)");
  • $a->getCell(3,1)->addTag(new CLabel("Enter your Password:","password1"));
  • $a->getCell(6,1)->addTag(new CPassword("password2",20,30,""))->getTag(1)->id("password2")
  • ->styleClass("text")->onchange("compare_password(this.form.password1,this);")
  • ->onblur("valide_char(this,'',6);");
  • $a->getCell(5,1)->addTag(new CLabel("Re-Enter your Password:","password2"));
  • $a->getCell(8,1)->addTag(new CInputText("name",20,30,$name))->getTag(1)->id("name")->styleClass("text")
  • ->onblur("valide_char(this,'0123456789&,;:!?./§%\$£+=}])*@µ<>°_`|[({#~²',3)");
  • $a->getCell(7,1)->addTag(new CLabel("Enter your first name:","name"));
  • $a->getCell(10,1)->addTag(new CInputText("forname",20,30,$forname))->getTag(1)->id("forname")
  • ->styleClass("text")->onblur("valide_char(this,'0123456789&,;:!?./§%\$£+=}])*@µ<>°_`|[({#~²',3)");
  • $a->getCell(9,1)->addTag(new CLabel("Enter your name:","forname"));
  • $a->getCell(12,1)->addTag(new CInputText("email",20,30,$email))->getTag(1)->id("email")
  • ->styleClass("text")->onchange("valide_courriel(this)")
  • ->onblur("valide_char(this,'&,;:!?/§%\$£+=}])*µ¨^<>°`|[({#~²',8)");
  • $a->getCell(11,1)->addTag(new CLabel("Enter your email:","email"));
  • $a->getCell(14,1)->addTag(new CInputText("location",20,30,$location))->getTag(1)->id("location")
  • ->styleClass("text")->onblur("valide_char(this,'0123456789&,;:!?./§%\$£+=}])*@µ<>°_`|[({#~²',3)");
  • $a->getCell(13,1)->addTag(new CLabel("Enter your location:","location"));
  • $a->getCell(16,1)->addTag(new CInputText("bdate",20,30,$bdate))->getTag(1)->id("bdate")->styleClass("text")
  • ->onchange("valide_date(this,1950,2020,'aaaa-mm-jj')")
  • ->onblur("valide_char(this,'&,;:!?.§%\$£+=}])*@µ<>°_`|[({#~²abcdefghijklmnopqrstuvwxyz',10)");
  • $a->getCell(15,1)->addTag(new CLabel("Enter your birth date:aaaa-mm-jj","bdate"));
  • $a->getCell(17,1)->addTag(new CSubmit("Send"))->alignCenter()->getTag(1)->styleClass("buttonwhite");
  • $a->getCell(17,1)->addTag(new CReset("Reset"))->getTag(2)->styleClass("buttonwhite");
  • $f->addTag($a);
  • $p->addTag($f);
  • echo $p;
  • //
  • // Ci dessous les 3 classes mères de toutes les autres -->
  • //
  • // CObject.php -->
  • //
  • abstract class CObject extends stdClass {
  • /**
  • * @type String
  • * @desc code HTML de l'objet en cours.
  • **/
  • protected $m_HTMLcode;
  • /**
  • * @return String
  • * @desc renvoie le code HTML de l'objet en cours.
  • * Est appelé à chaque fois que l'instance doit etre affichée.
  • **/
  • function __tostring() {
  • return $this->m_HTMLcode;
  • }
  • /**
  • * @return void
  • * @desc destructeur.
  • **/
  • function __destruct() {
  • unset($this->m_HTMLcode);
  • }
  • /**
  • * @return void
  • * @desc Remplace le code HTML de l'objet en cours par $html.
  • * $html est de type string.
  • **/
  • function setHTML($html) {
  • $this->m_HTMLcode = $html;
  • return $this;
  • }
  • /**
  • * @return int
  • * @desc Renvoie l'id de l'objet en cours.
  • **/
  • function getObjectID() {
  • $tmp="$this";
  • if(preg_match('/^Object id #(\d+)$/',$tmp,$matches)) {
  • return $matches[1];
  • }
  • else {
  • return $tmp;
  • }
  • }
  • }
  • //
  • // CProperty.php -->
  • //
  • $url = $_SERVER['DOCUMENT_ROOT'];
  • include_once($url."/bin/class/cobject.php5");
  • class CProperty extends CObject {
  • //attributs
  • protected $m_PropertyValue="";
  • protected $m_Property;
  • /**
  • * @desc Constructeur.
  • **/
  • function CProperty($property,$propertyvalue) {
  • $this->m_PropertyValue = strtolower($propertyvalue);
  • $this->m_Property = strtolower($property);
  • }
  • /**
  • * @return CProperty
  • * @desc ecrase la propriété en cousr par celle passée en argument.
  • **/
  • public function setProperty($property,$propertyvalue) {
  • $this->m_PropertyValue = strtolower($propertyvalue);
  • $this->m_Property = strtolower($property);
  • return $this;
  • }
  • /**
  • * @return CProperty
  • * @desc Ecrase la valeur de la propriété en cours.
  • **/
  • public function setValue($propertyvalue) {
  • $this->m_PropertyValue = strtolower($propertyvalue);
  • return $this;
  • }
  • /**
  • * @return CProperty
  • * @desc Remplace le nom de la propriété en cours.
  • **/
  • public function setName($property) {
  • $this->m_Property = strtolower($property);
  • return $this;
  • }
  • /**
  • * @return String
  • * @desc renvoie le nom de la proprieté en cours.
  • **/
  • public function getName() {
  • return $this->m_Property;
  • }
  • /**
  • * @return String
  • * @desc renvoie la valeur de la proprieté en cours.
  • **/
  • public function getValue() {
  • return $this->m_PropertyValue;
  • }
  • public function __tostring() {
  • if($this->m_PropertyValue != "" ) {
  • $this->setHTML($this->m_Property." = \"".$this->m_PropertyValue."\" ");
  • }
  • else {
  • $this->setHTML($this->m_Property." ");
  • }
  • return parent::__tostring();
  • }
  • public function __destruct() {
  • unset($this->m_Property);
  • unset($this->m_PropertyValue);
  • parent::__destruct();
  • }
  • }
  • //
  • // CTag.php -->
  • //
  • $url = $_SERVER['DOCUMENT_ROOT'];
  • include_once($url."/bin/class/cobject.php5");
  • include_once($url."/bin/class/cproperty.php5");
  • class CTag extends CObject {
  • /**
  • *@type CTag
  • *@desc ID du tag.
  • **/
  • protected $m_id = "";
  • /**
  • *@type CTag
  • *@desc tag d'entete du tag en cours (le tag en cours sera encadré par ce tag).
  • **/
  • protected $m_ins = null;
  • /**
  • *@type String
  • *@desc Nombre de fois que le tag doit etre décaler sur la droite.
  • **/
  • protected $m_decalage = "";
  • /**
  • * @type Array
  • * @desc tableau des propriétés CProperty du tag en cours
  • * <tag prop1=val1 prop2=val2 ...> ... </tag>
  • **/
  • protected $m_properties = null;
  • /**
  • * @type Array
  • * @desc tableau des tags CTag imbriquées ou non dans le tag en cours
  • * <tag> <tag1> </tag1> <tag2> <tag3> ... ... </tag3> </tag2> </tag1> </tag>
  • **/
  • protected $m_tags = null;
  • /**
  • * @type String
  • * @desc text insérer dans le tag: <tag>Text</tag>
  • **/
  • protected $m_text = "";
  • /**
  • * @type String
  • * @desc type du tag en cours <type> ... </type>
  • **/
  • protected $m_type = "";
  • /**
  • * @return void
  • * @desc constructeur
  • * $type, $txt, $prop sont de type string.
  • * ex: CTag("body","Je rentre le texte que je veux afficher","bgcolor=#FFFFFF link=black alink=lime")
  • **/
  • function CTag($type,$txt,$prop) {
  • //ajoute les propriétés du tag en cours.
  • $this->m_properties = array();
  • $this->addProperty($prop);
  • //ajoute les tags imbriqués dans le tag en cours.
  • $this->m_tags = array();
  • //ajoute le type du tag.
  • $this->setType($type);
  • //ajoute le text soumis au tag et aux tags imbriqués.
  • $this->setTxt($txt);
  • //met le decalage
  • $this->m_decalage = "";
  • }
  • /**
  • * @return String
  • * @desc renvoie le code HTML du tag en cours avec celui de tous ses tags imbriqués.
  • * Est appelé à chaque fois que l'instance doit etre affichée.
  • **/
  • function __tostring() {
  • $this->decalage();
  • $starttag = $this->getStarttag();
  • $itag = $this->getInsertedtag();
  • $txt = $this->getTxt_r();
  • $endtag = $this->getEndtag();
  • $this->setHTML("\n".$starttag.$txt.$itag."\n".$endtag);
  • return parent::__tostring();
  • }
  • /**
  • * @return CTag
  • * @desc Insére le tag en cours à la date et heure donnée, $date, dans la page donnée, $url.
  • **/
  • public function ins($url,$date) {
  • unset( $this->m_ins );
  • $this->m_ins = new CTag("ins","","cite&=".$url."&&datetime&=".$date);
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Supprime le tag en cours à la date et heure donnée, $date, dans la page donnée, $url.
  • **/
  • public function del($url,$date) {
  • unset( $this->m_ins );
  • $this->m_ins = new CTag("del","","cite&=".$url."&&datetime&=".$date);
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Supprime les proriétés d'insertion et de suppression du tag en cours (les tags <del> ou <ins>).
  • **/
  • public function rmINSOrDEL() {
  • unset( $this->m_ins );
  • $this->m_ins = null;
  • return $this;
  • }
  • /**
  • * @return String
  • * @desc
  • * créer le tag d'entete du tag html en cours,
  • * avec son type et ses propriétés.
  • **/
  • protected function getStarttag() {
  • $properties = $this->getProperties();
  • $ins = "";
  • if(!is_null($this->m_ins)){
  • $ins = $this->m_ins->getStarttag();
  • }
  • return $ins.$this->m_decalage."<".$this->m_type." ".$properties."> ";
  • }
  • /**
  • * @return String
  • * @desc
  • * créer le tag de fin du tag html en cours,
  • * avec son type.
  • **/
  • protected function getEndtag() {
  • $ins = "";
  • if(!is_null($this->m_ins)){
  • $ins = $this->m_ins->getEndtag();
  • }
  • return $this->m_decalage."</".$this->m_type."> ".$ins;
  • }
  • /**
  • * @return String
  • * @desc
  • * renvoie le code HTML des tags imbriqués dans le tag en cours,
  • * avec leur tag de d'entete,leur tag de fin et leur texte:
  • * appelle la fonction __tostring() de chaque tag imbriqué.
  • **/
  • protected function getInsertedtag() {
  • $tags="";
  • for($i=0;$i<$this->getTagNbr();$i++) {
  • $tags = $tags.$this->m_tags[$i]->__tostring();
  • }
  • return $tags;
  • }
  • /**
  • * @return CTag
  • **/
  • protected function decalage() {
  • foreach($this->getTagArray() as $tag) {
  • $tag->addDecalage($this->getDecalage());
  • $tag->decalage();
  • }
  • return $this;
  • }
  • /**
  • * @return CTag
  • **/
  • protected function addDecalage($dec) {
  • $this->m_decalage = $dec."\t";
  • return $this;
  • }
  • /**
  • * @return string
  • **/
  • public function getDecalage() {
  • return $this->m_decalage;
  • }
  • /**
  • * @return Array
  • * @desc renvoie le tableau de tag (CTag) imbriqué de l'instance en cours.
  • **/
  • public function getTagArray() {
  • return $this->m_tags;
  • }
  • /**
  • * @return CTag
  • * @desc remplace le tableau de tag (CTag) par le tableau de tag $tag.
  • **/
  • public function setTagArray($tag) {
  • unset ($this->m_tags);
  • $this->m_tags = $tag;
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc (Incompatible avec Netscape) Associe une classe de style au tag en cours.
  • * Si $class est vide (égale à "") alors la propriété est supprimée.
  • **/
  • public function styleClass($class) {
  • if($class != "" ) {
  • return $this->modifyProperty("class&=".$class);
  • }
  • else {
  • return $this->delProperty("class");
  • }
  • }
  • /**
  • * @return CTag
  • * @desc Associe un style au tag en cours.
  • * Si $style est vide (égale à "") alors la propriété est supprimée.
  • **/
  • public function style($style) {
  • if($style != "" ) {
  • return $this->modifyProperty("style&=".$style);
  • }
  • else {
  • return $this->delProperty("style");
  • }
  • }
  • /**
  • * @return CTag
  • * @desc Associe un ID unique au tag en cours.
  • * Si $id est vide (égale à "" ou à null) alors la propriété est supprimée.
  • **/
  • public function id($id) {
  • if($id != "" && !is_null($id)) {
  • $this->m_id = $id;
  • return $this->modifyProperty("id&=".$id);
  • }
  • else {
  • $this->m_id = null;
  • return $this->delProperty("id");
  • }
  • }
  • /**
  • * @return CTag
  • * @desc Associe un titre au tag en cours, affiche une description dans une bulle.
  • * Si $title est vide (égale à "") alors la propriété est supprimée.
  • **/
  • public function title($title) {
  • if($title != "" ) {
  • return $this->modifyProperty("title&=".$title);
  • }
  • else {
  • return $this->delProperty("title");
  • }
  • }
  • /**
  • * @return CTag
  • * @desc Associe un nom au tag en cours.
  • * Si $name est vide (égale à "") alors la propriété est supprimée.
  • **/
  • public function name($name) {
  • if($name != "" ) {
  • return $this->modifyProperty("name&=".$name);
  • }
  • else {
  • return $this->delProperty("name");
  • }
  • }
  • /**
  • * @return Array
  • * @desc renvoie le tableau de propriété (CProperty) de l'instance en cours.
  • **/
  • public function getPropertiesArray() {
  • return $this->m_properties;
  • }
  • /**
  • * @return String
  • * @desc renvoie le texte du dernier tag imbriqué dans le tag en cours. <tag><tag1>... texte </tag1></tag>
  • **/
  • public function getTxt() {
  • return $this->getLastTag()->getTxt_r();
  • }
  • /**
  • * @return String
  • * @desc renvoie le texte du tag en cours. <tag> texte </tag>
  • **/
  • protected function getTxt_r() {
  • return $this->m_text;
  • }
  • /**
  • * @return CTag
  • * @desc Efface le texte du dernier tag imbriqué dans le tag en cours.
  • **/
  • public function delTxt() {
  • return $this->getLastTag()->delTxt_r();
  • }
  • /**
  • * @return CTag
  • * @desc Efface le texte du tag.
  • **/
  • protected function delTxt_r() {
  • return $this->setTxt_r("");
  • }
  • /**
  • * @return CTag
  • * @desc renvoie le tag à la position $i en cours.
  • * $i doit etre compris entre 1 et la taille du tableau de tag du tag en cours (inclus).
  • **/
  • public function getTag($i) {
  • if($i > $this->getTagNbr()) {
  • return null;
  • }
  • else {
  • return $this->m_tags[$i-1];
  • }
  • }
  • /**
  • * @return integer
  • * @desc renvoie le nombre de tag imbriqué dans le tag en cours.
  • **/
  • public function getTagNbr() {
  • return sizeof($this->m_tags);
  • }
  • /**
  • * @return String
  • * @desc renvoie les propriétés du tag en cours.
  • **/
  • public function getProperties() {
  • $properties = "";
  • for($i=0;$i<sizeof($this->m_properties);$i++) {
  • $properties = $properties.$this->m_properties[$i]->__tostring();
  • }
  • return $properties;
  • }
  • /**
  • * @return String
  • * @desc renvoie le type du tag en cours. <type> ... </type>
  • **/
  • public function getType() {
  • return $this->m_type;
  • }
  • /**
  • * @return String
  • * @desc renvoie l'ID du tag en cours. <tag id="..."> ... </tag>
  • **/
  • public function getID() {
  • return $this->m_id;
  • }
  • /**
  • * @return CTag
  • * @desc renvoie le tag de type $type imbriqué dans le tag en cours. <type> ... </type>
  • **/
  • public function ifTagExists($type) {
  • $b=null;
  • for ($j=0;$j<$this->getTagNbr();$j++) {
  • if(strtolower($this->m_tags[$j]->getType()) == strtolower($type)) {
  • $b = $this->m_tags[$j]->ifTagExists($type);
  • if($b == null) {
  • $b = $this->m_tags[$j];
  • }
  • }
  • else {
  • $b = $this->m_tags[$j]->ifTagExists($type);
  • }
  • }
  • if($b!=null) {
  • return $b;
  • }
  • else {
  • return null;
  • }
  • }
  • /**
  • * @return CTag
  • * @desc remplace le texte du dernier tag imbriqué dans le tag en cours par $txt.
  • **/
  • public function setTxt($txt) {
  • return $this->getLastTag()->setTxt_r($txt);
  • }
  • /**
  • * @return CTag
  • * @desc remplace le texte de l'instance de tag en cours par $txt.
  • **/
  • protected function setTxt_r($txt) {
  • $this->m_text = $txt;
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc modifie le type de l'instance en cours par $type.
  • * $type doit être un tag HTML.
  • **/
  • public function setType($type) {
  • $this->m_type = strtolower($type);
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc
  • * ex: $arg = "align&=center&&size&=+3 ..."
  • * ajoute les propriétés avec leur valeur, séparé par && les valeurs étant associés à la propriétés par le symbole "&=", données par $arg de l'instance de tag en cours.
  • * Ne vérifie pas si les propriétés existent deja.
  • * $arg est de type string.
  • **/
  • public function addProperty($arg) {
  • if($arg != "") {
  • $temp = split("&&", $arg);
  • $min = sizeof($this->m_properties);
  • $max = sizeof($temp) + $min;
  • for ($i=$min;$i<$max;$i++) {
  • list($name,$value) = split("&=",$temp[$i-$min]);
  • $this->m_properties[$i] = new CProperty($name,$value);
  • }
  • return $this;
  • }
  • }
  • /**
  • * @return CTag
  • * @desc
  • * ex: $arg = "align&=right&&size&=+2"; liste de quelques propriétés avec leur valeur, séparé par &&, les valeurs étant associés à la propriétés par le symbole "&=", parmis celles insérées dans le tag en cours
  • * modifie les propriétés données par $arg de l'instance de tag en cours
  • * si une des propriétés n'existe pas, elle est ajoutée.
  • * $arg est de type string.
  • **/
  • public function modifyProperty($arg) {
  • $temp = split("&&", $arg);
  • for ($i=0;$i<sizeof($temp);$i++) {
  • $wit = 1;
  • list($name,$value) = split("&=",$temp[$i]);
  • for ($j=0;$j<sizeof($this->m_properties);$j++) {
  • if($this->m_properties[$j]->getName() == strtolower($name)) {
  • $this->m_properties[$j]->setValue($value);
  • $wit = 0;
  • }
  • }
  • if($wit) {
  • $this->addProperty($temp[$i]);
  • }
  • }
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc
  • * ex: $arg = "align size ..."; liste de nom, séparé par un espace, de quelques propriétés parmis celles insérées dans le tag en cours
  • * efface les propriétés données par $arg de l'instance de tag en cours
  • * $arg est de type string.
  • **/
  • public function delProperty($arg) {
  • $temp = split(" ", $arg);
  • for ($i=0;$i<sizeof($temp);$i++) {
  • for ($j=0;$j<sizeof($this->m_properties);$j++) {
  • if($this->m_properties[$j]->getName() == strtolower($temp[$i])) {
  • //on efface la propriétés
  • unset($this->m_properties[$j]);
  • //on réindexe le tableau
  • $this->m_properties = array_values($this->m_properties);
  • break;
  • }
  • }
  • }
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Insére le tag $tag à la position $i dans le tableau de tag du tag en cours.
  • * $i doit etre compris entre 1 et la taille du tableau (inclus).
  • * $i est du type integer.
  • * Renvoie le tag inséré.
  • **/
  • protected function insertTagAt($tag,$i) {
  • $temp = array($tag);
  • if( $i <= $this->getTagNbr() && $i > 0) {
  • $start = array_slice($this->getTagArray(),0,$i-1);
  • $end = array_slice($this->getTagArray(),$i-1);
  • $this->setTagArray(array_values(array_merge($start,array_merge($temp,$end))));
  • return $tag;
  • }
  • elseif($i==1) {
  • $this->addTag($tag);
  • return $tag;
  • }
  • else {
  • return null;
  • }
  • }
  • public function addTag($tag) {
  • if($tag instanceof CTag ) {
  • return $this->insertTag_r(array($tag));
  • }
  • else return null;
  • }
  • /**
  • * @return CTag
  • * @desc
  • * $tag est de type array,i.e. un tableau d'objet de classe CTag
  • * insére les tags du tableau $tag à la fin tableau de tag de l'instance en cours
  • **/
  • protected function insertTag_r($tag) {
  • $min = $this->getTagNbr();
  • $max = sizeof($tag) + $min;
  • for ($i=$min;$i<$max;$i++) {
  • $this->m_tags[$i] = $tag[$i-$min];
  • }
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc ex: $tag est de type array,i.e. un tableau d'objet de classe CTag
  • * Imbrique le premier tag du tableau $tag dans le dernier element du tableau de tag de l'instance en cours.
  • * Les autres tags de $tag sont imbriqués dans le premier tag du tableau $tag.
  • * Le texte du tag du plus bas niveau est remplacé par celui du tag du plus au niveau,
  • * les texte des autres tags et celui du plus haut niveau sont effacés.
  • **/
  • public function insertTag($tag) {
  • if($this->getTagNbr() == 0) {
  • $this->m_tags[0] = $tag[0];
  • $this->m_tags[0]->setTxt_r($this->getTxt_r());
  • $this->delTxt_r();
  • }
  • else if ($this->getTagNbr() > 0) {
  • $this->m_tags[$this->getTagNbr() - 1]->insertTag_r(array($tag[0]));
  • $tag[0]->setTxt_r($this->m_tags[$this->getTagNbr() - 1]->getTxt_r());
  • $this->m_tags[$this->getTagNbr() - 1]->delTxt_r();
  • }
  • for($i=1;$i<sizeof($tag);$i++) {
  • $tag[$i-1]->insertTag_r(array($tag[$i]));
  • $tag[$i]->setTxt_r($tag[$i-1]->getTxt_r());
  • $tag[$i-1]->delTxt_r();
  • }
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Efface le tag à la position $i dans le tableau de tag du tag en cours.
  • * $i doit etre compris entre 1 et la taille du tableau (inclus).
  • * $i est du type integer.
  • * Renvoie le tag en cours.
  • **/
  • public function delTagAt($i) {
  • if($i > $this->getTagNbr()) {
  • return null;
  • }
  • else {
  • unset($this->m_tags[$i-1]);
  • return $this->setTagArray(array_values($this->getTagArray()));
  • }
  • }
  • /**
  • * @return CTag
  • * @desc ex: $type = "td tr p font center"; liste de quelques tags parmis ceux insérés dans le tag en cours.
  • * Efface uniquement le tag voulu (pas ceux imbriqués).
  • **/
  • public function delTag($type) {
  • $temp = split(" ", $type);
  • for ($i=0;$i<sizeof($temp);$i++) {
  • for ($j=0;$j<$this->getTagNbr();$j++) {
  • if($this->m_tags[$j]->getType() == strtolower($temp[$i])) {
  • $this->m_tags[$j]->delTag(strtolower($temp[$i]));
  • //on récupère le texte du tag qui va être effacé
  • if($j != 0 ) {
  • $this->m_tags[$j-1]->setTxt_r($this->m_tags[$j]->getTxt_r());
  • }
  • else {
  • $this->setTxt_r($this->m_tags[$j]->getTxt_r());
  • }
  • //on récupère les tags imbriqués
  • $this->insertTag_r($this->m_tags[$j]->getTagArray());
  • //on efface le tag
  • unset($this->m_tags[$j]);
  • //on réindexe le tableau des tags
  • $this->m_tags = array_values($this->m_tags);
  • //et on recommence.
  • }
  • else {
  • $this->m_tags[$j]->delTag(strtolower($temp[$i]));
  • }
  • }
  • }
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc
  • * ex: $type = "td tr p font center"; liste de quelques tags parmis ceux insérés dans le tag en cours
  • * Efface le tag plus tous ceux qui lui sont imbriqués.
  • * Attention le text n'est pas récupéré!!
  • **/
  • public function delTag_r($type) {
  • $temp = split(" ", $type);
  • for ($i=0;$i<sizeof($temp);$i++) {
  • for ($j=0;$j<$this->getTagNbr();$j++) {
  • if($this->m_tags[$j]->getTagType() == strtolower($temp[$i])) {
  • //on efface le tag
  • unset($this->m_tags[$j]);
  • //on réindexe le tableau des tags
  • $this->m_tags = array_values($this->m_tags);
  • }
  • else {
  • $this->m_tags[$j]->delTag_r(strtolower($temp[$i]));
  • }
  • }
  • }
  • return $this;
  • }
  • /**
  • * @return void
  • * @desc destructeur
  • */
  • public function __destruct() {
  • unset( $this->m_properties );
  • unset( $this->m_tags );
  • unset( $this->m_text );
  • unset( $this->m_type );
  • unset( $this->m_decalage );
  • unset( $this->m_DispNbr );
  • parent::__destruct();
  • }
  • /**
  • * @return CTag
  • * @desc Met le texte du tag en cours en Gras.
  • **/
  • public function txtBold() {
  • $this->delTag("b");
  • $this->getLastTag()->insertTag(array(new CTag("b",$this->getTxt(),"")));
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Met le texte du tag en cours en Italique.
  • **/
  • public function txtItalic() {
  • $this->delTag("i");
  • $this->delTag("em");
  • $this->delTag("class");
  • $this->delProperty("class style");
  • $this->getLastTag()->insertTag(array(new CTag("i",$this->getTxt(),"")));
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Met le texte du tag en cours en Souligné.
  • **/
  • public function txtUnder() {
  • $this->delTag("u");
  • $this->getLastTag()->insertTag(array(new CTag("u",$this->getTxt(),"")));
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Met le texte du tag en cours en Barré.
  • **/
  • public function txtStrike() {
  • $this->delTag("strike");
  • $this->getLastTag()->insertTag(array(new CTag("strike",$this->getTxt(),"")));
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Initialise la mise en forme du texte du tag en cours.
  • **/
  • public function initStyle() {
  • $this->delTag("b");
  • $this->delTag("i");
  • $this->delTag("u");
  • $this->delTag("strike");
  • $this->delTag("font");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Initialise la mise en forme du texte du tag en cours.
  • **/
  • public function delTxtBold() {
  • $this->delTag("b");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Initialise la mise en forme du texte du tag en cours.
  • **/
  • public function delTxtStrike() {
  • $this->delTag("strike");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Initialise la mise en forme du texte du tag en cours.
  • **/
  • public function delTxtUnder() {
  • $this->delTag("u");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Initialise la mise en forme du texte du tag en cours.
  • **/
  • public function delTxtItalic() {
  • $this->delTag("i");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Initialise la mise en forme du texte du tag en cours.
  • **/
  • public function delTxtColor() {
  • $f = $this->ifTagExists("font");
  • if($f != null) {
  • $f->rmColor();
  • }
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Initialise la mise en forme du texte du tag en cours.
  • **/
  • public function delTxtPolice() {
  • $f = $this->ifTagExists("font");
  • if($f != null) {
  • $f->rmPolice();
  • }
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Initialise la mise en forme du texte du tag en cours.
  • **/
  • public function delTxtSize() {
  • $f = $this->ifTagExists("font");
  • if($f != null) {
  • $f->rmSize();
  • }
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Insére un label asssocié à l'ID du tag en cours.
  • **/
  • public function addLabel($label) {
  • if($label != null && $label != "" && $this->getID()!= null) {
  • return $this->addTag(new CLabel($label,$this->getID()));
  • }
  • else {
  • return null;
  • }
  • }
  • /**
  • * @return CTag
  • * @desc Met le texte du tag à la taille précisée $size.
  • **/
  • public function txtSize($size) {
  • $f = $this->ifTagExists("font");
  • if($f != null) {
  • $f->size($size);
  • }
  • else {
  • $this->getLastTag()->insertTag((array(new CFont($this->getTxt(),"size&=".strtolower($size)))));
  • }
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Met la couleur du texte du tag à la couleur précisée $color.
  • * $color doit être une couleur formatée HTML.
  • **/
  • public function txtColor($color) {
  • $f = $this->ifTagExists("font");
  • if($f != null) {
  • $f->color($color);
  • }
  • else {
  • $this->getLastTag()->insertTag((array(new CFont($this->getTxt(),"color&=".$color))));
  • }
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Met la police du texte du tag à la police précisée $face.
  • **/
  • public function txtPolice($face) {
  • $f = $this->ifTagExists("font");
  • if($f != null) {
  • $f->police($face);
  • }
  • else {
  • $this->getLastTag()->insertTag((array(new CFont($this->getTxt(),"face&=".strtolower($face)))));
  • }
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Renvoie le dernier des tags imbriqués dans le tag en cours.
  • **/
  • protected function getLastTag() {
  • if($this->getTagNbr()!=0) {
  • for($i=0;$i<$this->getTagNbr();$i++) {
  • return $this->m_tags[$i]->getLastTag();
  • }
  • }
  • else {
  • return $this;
  • }
  • }
  • /**
  • * @return CTag
  • * @desc Colore le fond de la zone du tag avec la couleur spécifiée.
  • * Si $color=="" alors une couleur sera mise au hasard.
  • **/
  • public function bgcolor($color)
  • {
  • if($color==""){
  • $c = new CColor();
  • $color=$c->randomCode();
  • }
  • $this->modifyProperty("bgcolor&=".$color);
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Aligne verticalement le texte en haut de la zone du tag
  • *
  • **/
  • public function valignTop()
  • {
  • $this->modifyProperty("valign&=top");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Empeche le texte du tag de revenir à la ligne en bout de zone du tag.
  • *
  • **/
  • public function nowrap()
  • {
  • $this->modifyProperty("nowrap");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Aligne verticalement le texte de la zone du tag au centre.
  • *
  • **/
  • function valignMiddle()
  • {
  • $this->modifyProperty("valign&=middle");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Aligne verticalement le texte de la zone du tag au bas de la ligne courante.
  • *
  • **/
  • function valignBase()
  • {
  • $this->modifyProperty("valign&=baseline");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Aligne verticalement le texte de la zone du tag en bas.
  • *
  • **/
  • public function valignBottom()
  • {
  • $this->modifyProperty("valign&=bottom");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Attribue la largeur de la zone du tag à $i pixel.
  • * $i peut être de type string ou integer.
  • **/
  • public function width_Px($i)
  • {
  • if($i!="" || $i != 0)
  • $this->modifyProperty("width&=".strtolower($i)."px");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Attribue la largeur de la zone du tag à $i pourcent du tag le contenant.
  • * $i peut être de type string ou integer.
  • **/
  • public function width_Pr($i) {
  • if($i!="" || $i != 0)
  • $this->modifyProperty("width&=".strtolower($i)."%");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Attribue la hauteur de la zone du tag à $i pixel.
  • * $i peut être de type string ou integer.
  • **/
  • public function height_Px($i) {
  • if($i!="" || $i != 0)
  • $this->modifyProperty("height&=".strtolower($i)."px");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Attribue la hauteur de la zone du tag à $i pourcent du tag le contenant.
  • * $i peut être de type string ou integer.
  • **/
  • public function height_Pr($i) {
  • if($i!="" || $i != 0)
  • $this->modifyProperty("height&=".strtolower($i)."%");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Aligne horizontalement le texte au centre de la zone du tag
  • *
  • **/
  • public function alignCenter() {
  • $this->modifyProperty("align&=center");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Aligne horizontalement le texte à gauche de la zone du tag
  • *
  • **/
  • public function alignLeft() {
  • $this->modifyProperty("align&=left");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Aligne horizontalement le texte à droite de la zone du tag
  • *
  • **/
  • public function alignRight() {
  • $this->modifyProperty("align&=right");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Justifie le texte à droite de la zone du tag
  • *
  • **/
  • public function alignJustify() {
  • $this->modifyProperty("align&=justify");
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Ajoute une bordure de taille $i a la zone du tag.
  • *
  • **/
  • public function border($i) {
  • if( $i != "" || $i>=0)
  • $this->modifyProperty("border&=".strtolower($i));
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Met la birdure de la zone du tag à la couleur $color.
  • * $color doit etre une couleur de base HTML en nom commun (pas de code Hexa).
  • **/
  • public function bordercolor($color) {
  • if($color!="")
  • $this->modifyProperty("bordercolor&=".strtolower($color));
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Le lien s'ouvrira dans le cadre $tar.
  • * $tar est de type String.
  • **/
  • public function target($tar) {
  • if($tar != "")
  • {
  • $this->m_target = $tar;
  • return $this;
  • }
  • else return null;
  • }
  • /**
  • * @return CTag
  • * @desc Le lien s'ouvrira dans la fenetre parente.
  • **/
  • public function targetParent() {
  • $this->m_target = "_parent";
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Le lien s'ouvrira dans une nouvelle fenetre.
  • **/
  • public function targetBlank() {
  • $this->m_target = "_blank";
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Le lien s'ouvrira dans la frame principale qui contient celle du lien.
  • **/
  • public function targetTop() {
  • $this->m_target = "_top";
  • return $this;
  • }
  • /**
  • * @return CTag
  • * @desc Le lien s'ouvrira dans la meme fenetre ou frame que celle du lien.
  • * (par défaut).
  • **/
  • public function targetSelf() {
  • $this->m_target = "_self";
  • return $this;
  • }
  • }
//Ceci est la page subscribe.php de mon site perso, qui permet de s inscrire à mon site
$p = new CPageperso("Please fill the register form");

$f = new CForm("post","./bin/cgi/register.php5","formulaire");
$f->onsubmit("valide");

$a = new CTable(17,1);
if (isset($_GET['title'])) $a->addTitle($_GET['title']);
else {
	if(!is_null($error_mess)) $a->addTitle("Please fill all the following fields: ".$error_mess);
}
$a->getTitle()->styleClass("small");
$a->styleClass("top");
$a->getCell(2,1)->addTag(new CInputText("login",20,30,$login))->getTag(1)->id("login")->styleClass("text")
->onblur("valide_char(this,'&,;:./§%\$£+=}])*µ<>°`|[({#~²',3)");
$a->getCell(1,1)->addTag(new CLabel("Enter your Login:","login"));

$a->getCell(4,1)->addTag(new CPassword("password1",20,30,""))->getTag(1)->id("password1")->styleClass("text")
->onblur("valide_char(this,'',6)");
$a->getCell(3,1)->addTag(new CLabel("Enter your Password:","password1"));

$a->getCell(6,1)->addTag(new CPassword("password2",20,30,""))->getTag(1)->id("password2")
->styleClass("text")->onchange("compare_password(this.form.password1,this);")
->onblur("valide_char(this,'',6);");
$a->getCell(5,1)->addTag(new CLabel("Re-Enter your Password:","password2"));

$a->getCell(8,1)->addTag(new CInputText("name",20,30,$name))->getTag(1)->id("name")->styleClass("text")
->onblur("valide_char(this,'0123456789&,;:!?./§%\$£+=}])*@µ<>°_`|[({#~²',3)");
$a->getCell(7,1)->addTag(new CLabel("Enter your first name:","name"));

$a->getCell(10,1)->addTag(new CInputText("forname",20,30,$forname))->getTag(1)->id("forname")
->styleClass("text")->onblur("valide_char(this,'0123456789&,;:!?./§%\$£+=}])*@µ<>°_`|[({#~²',3)");
$a->getCell(9,1)->addTag(new CLabel("Enter your name:","forname"));

$a->getCell(12,1)->addTag(new CInputText("email",20,30,$email))->getTag(1)->id("email")
->styleClass("text")->onchange("valide_courriel(this)")
->onblur("valide_char(this,'&,;:!?/§%\$£+=}])*µ¨^<>°`|[({#~²',8)");
$a->getCell(11,1)->addTag(new CLabel("Enter your email:","email"));

$a->getCell(14,1)->addTag(new CInputText("location",20,30,$location))->getTag(1)->id("location")
->styleClass("text")->onblur("valide_char(this,'0123456789&,;:!?./§%\$£+=}])*@µ<>°_`|[({#~²',3)");
$a->getCell(13,1)->addTag(new CLabel("Enter your location:","location"));

$a->getCell(16,1)->addTag(new CInputText("bdate",20,30,$bdate))->getTag(1)->id("bdate")->styleClass("text")
->onchange("valide_date(this,1950,2020,'aaaa-mm-jj')")
->onblur("valide_char(this,'&,;:!?.§%\$£+=}])*@µ<>°_`|[({#~²abcdefghijklmnopqrstuvwxyz',10)");
$a->getCell(15,1)->addTag(new CLabel("Enter your birth date:aaaa-mm-jj","bdate"));

$a->getCell(17,1)->addTag(new CSubmit("Send"))->alignCenter()->getTag(1)->styleClass("buttonwhite");
$a->getCell(17,1)->addTag(new CReset("Reset"))->getTag(2)->styleClass("buttonwhite");

$f->addTag($a);
$p->addTag($f);

echo $p;
//
// Ci dessous les 3 classes mères de toutes les autres -->
//
// CObject.php -->
//
abstract class CObject extends stdClass  {
	/**
	* @type String
	* @desc code HTML de l'objet en cours.
	**/
	protected $m_HTMLcode;
	/**
	* @return String
	* @desc renvoie le code HTML de l'objet en cours.
	* Est appelé à chaque fois que l'instance doit etre affichée.
	**/
	function __tostring() {
		return $this->m_HTMLcode;
	}
	/**
	* @return void
	* @desc destructeur.
	**/
	function __destruct() {
		unset($this->m_HTMLcode);
	}
	/**
	* @return void
	* @desc Remplace le code HTML de l'objet en cours par $html.
	* $html est de type string.
	**/
	function setHTML($html) {
		$this->m_HTMLcode = $html;
		return $this;
	}
	
	/**
	* @return int
	* @desc Renvoie l'id de l'objet en cours.
	**/
	function getObjectID() {
		$tmp="$this";
		if(preg_match('/^Object id #(\d+)$/',$tmp,$matches)) {
			return $matches[1];
		}
		else {
			return $tmp;
		}
	}
}
//
// CProperty.php -->
//
$url = $_SERVER['DOCUMENT_ROOT'];
include_once($url."/bin/class/cobject.php5");
class CProperty extends CObject {
	//attributs
	protected $m_PropertyValue="";
	protected $m_Property;
	/**
	* @desc Constructeur.
	**/
	function CProperty($property,$propertyvalue) {
		$this->m_PropertyValue = strtolower($propertyvalue);
		$this->m_Property = strtolower($property);
	}
	/**
	* @return CProperty
	* @desc ecrase la propriété en cousr par celle passée en argument.
	**/
	public function setProperty($property,$propertyvalue) {
		$this->m_PropertyValue = strtolower($propertyvalue);
		$this->m_Property = strtolower($property);
		return $this;
	}
	/**
	* @return CProperty
	* @desc Ecrase la valeur de la propriété en cours.
	**/
	public function setValue($propertyvalue) {
		$this->m_PropertyValue = strtolower($propertyvalue);
		return $this;
	}
	/**
	* @return CProperty
	* @desc Remplace le nom de la propriété en cours.
	**/
	public function setName($property) {
		$this->m_Property = strtolower($property);
		return $this;
	}
	/**
	* @return String
	* @desc renvoie le nom de la proprieté en cours.
	**/
	public function getName() {
		return $this->m_Property;
	}
	/**
	* @return String
	* @desc renvoie la valeur de la proprieté en cours.
	**/
	public function getValue() {
		return $this->m_PropertyValue;
	}
	public function __tostring() {
		if($this->m_PropertyValue != "" ) {
			$this->setHTML($this->m_Property." = \"".$this->m_PropertyValue."\" ");
		}
		else {
			$this->setHTML($this->m_Property." ");
		}
		return parent::__tostring();
	}
	public function __destruct() {
		unset($this->m_Property);
		unset($this->m_PropertyValue);
		parent::__destruct();
	}
}
//
// CTag.php -->
//
$url = $_SERVER['DOCUMENT_ROOT'];
include_once($url."/bin/class/cobject.php5");
include_once($url."/bin/class/cproperty.php5");
class CTag extends CObject {
	/**
	*@type CTag
	*@desc ID du tag.
	**/
	protected $m_id = "";
	/**
	*@type CTag
	*@desc tag d'entete du tag en cours (le tag en cours sera encadré par ce tag).
	**/
	protected $m_ins = null;
	/**
	*@type String
	*@desc Nombre de fois que le tag doit etre décaler sur la droite.
	**/
	protected $m_decalage = "";
	/**
	* @type Array
	* @desc tableau des propriétés CProperty du tag en cours
	* <tag prop1=val1 prop2=val2 ...> ... </tag>
	**/
	protected $m_properties = null;
	/**
	* @type Array
	* @desc tableau des tags CTag imbriquées ou non dans le tag en cours
	* <tag> <tag1> </tag1> <tag2> <tag3> ... ... </tag3> </tag2> </tag1> </tag>
	**/
	protected $m_tags = null;
	/**
	* @type String
	* @desc text insérer dans le tag: <tag>Text</tag>
	**/
	protected $m_text = "";
	/**
	* @type String
	* @desc type du tag en cours <type> ... </type>
	**/
	protected $m_type = "";
	/**
	* @return void
	* @desc constructeur
	* $type, $txt, $prop sont de type string.
	* ex: CTag("body","Je rentre le texte que je veux afficher","bgcolor=#FFFFFF link=black alink=lime")
	**/
	function CTag($type,$txt,$prop) {
		//ajoute les propriétés du tag en cours.
		$this->m_properties = array();
		$this->addProperty($prop);
		//ajoute les tags imbriqués dans le tag en cours.
		$this->m_tags = array();
		//ajoute le type du tag.
		$this->setType($type);
		//ajoute le text soumis au tag et aux tags imbriqués.
		$this->setTxt($txt);
		//met le decalage
		$this->m_decalage = "";
	}
	/**
	* @return String
	* @desc renvoie le code HTML du tag en cours avec celui de tous ses tags imbriqués.
	* Est appelé à chaque fois que l'instance doit etre affichée.
	**/
	function __tostring() {
		$this->decalage();
		$starttag = $this->getStarttag();
		$itag = $this->getInsertedtag();
		$txt = $this->getTxt_r();
		$endtag = $this->getEndtag();

		$this->setHTML("\n".$starttag.$txt.$itag."\n".$endtag);
		return parent::__tostring();
	}
	/**
	* @return CTag
	* @desc Insére le tag en cours à la date et heure donnée, $date, dans la page donnée, $url.
	**/
	public function ins($url,$date) {
		unset( $this->m_ins );
		$this->m_ins = new CTag("ins","","cite&=".$url."&&datetime&=".$date);
		return $this;
	}
	/**
	* @return CTag
	* @desc Supprime le tag en cours à la date et heure donnée, $date, dans la page donnée, $url.
	**/
	public function del($url,$date) {
		unset( $this->m_ins );
		$this->m_ins = new CTag("del","","cite&=".$url."&&datetime&=".$date);
		return $this;
	}
	/**
	* @return CTag
	* @desc Supprime les proriétés d'insertion et de suppression du tag en cours (les tags <del> ou <ins>).
	**/
	public function rmINSOrDEL() {
		unset( $this->m_ins );
		$this->m_ins = null;
		return $this;
	}
	/**
	* @return String
	* @desc
	* créer le tag d'entete du tag html en cours,
	* avec son type et ses propriétés.
	**/
	protected function getStarttag() {
		$properties = $this->getProperties();
		$ins = "";
		if(!is_null($this->m_ins)){
			$ins = $this->m_ins->getStarttag();
		}
		return $ins.$this->m_decalage."<".$this->m_type." ".$properties."> ";
	}
	/**
	* @return String
	* @desc
	* créer le tag de fin du tag html en cours,
	* avec son type.
	**/
	protected function getEndtag() {
		$ins = "";
		if(!is_null($this->m_ins)){
			$ins = $this->m_ins->getEndtag();
		}
		return $this->m_decalage."</".$this->m_type."> ".$ins;
	}
	/**
	* @return String
	* @desc
	* renvoie le code HTML des tags imbriqués dans le tag en cours,
	* avec leur tag de d'entete,leur tag de fin et leur texte:
	* appelle la fonction __tostring() de chaque tag imbriqué.
	**/
	protected function getInsertedtag() {
		$tags="";
		for($i=0;$i<$this->getTagNbr();$i++) {
			$tags = $tags.$this->m_tags[$i]->__tostring();
		}
		return $tags;
	}
	/**
	* @return CTag
	**/
	protected function decalage() {
		foreach($this->getTagArray() as $tag) {
			$tag->addDecalage($this->getDecalage());
			$tag->decalage();
		}
		return $this;
	}
	/**
	* @return CTag
	**/
	protected function addDecalage($dec) {
		$this->m_decalage = $dec."\t";
		return $this;
	}
	/**
	* @return string
	**/
	public function getDecalage() {
		return $this->m_decalage;
	}
	/**
	* @return Array
	* @desc renvoie le tableau de tag (CTag) imbriqué de l'instance en cours.
	**/
	public function getTagArray() {
		return $this->m_tags;
	}
	/**
	* @return CTag
	* @desc remplace le tableau de tag (CTag) par le tableau de tag $tag.
	**/
	public function setTagArray($tag) {
		unset ($this->m_tags);
		$this->m_tags = $tag;
		return $this;
	}
	/**
	* @return CTag
	* @desc (Incompatible avec Netscape) Associe une classe de style au tag en cours.
	* Si $class est vide (égale à "") alors la propriété est supprimée.
	**/
	public function styleClass($class) {
		if($class != "" ) {
			return $this->modifyProperty("class&=".$class);
		}
		else {
			return $this->delProperty("class");
		}
	}
	/**
	* @return CTag
	* @desc Associe un style au tag en cours.
	* Si $style est vide (égale à "") alors la propriété est supprimée.
	**/
	public function style($style) {
		if($style != "" ) {
			return $this->modifyProperty("style&=".$style);
		}
		else {
			return $this->delProperty("style");
		}
	}
	/**
	* @return CTag
	* @desc Associe un ID unique au tag en cours.
	* Si $id est vide (égale à "" ou à null) alors la propriété est supprimée.
	**/
	public function id($id) {
		if($id != "" && !is_null($id)) {
			$this->m_id = $id;
			return $this->modifyProperty("id&=".$id);
		}
		else {
			$this->m_id = null;
			return $this->delProperty("id");
		}
	}
	/**
	* @return CTag
	* @desc Associe un titre au tag en cours, affiche une description dans une bulle.
	* Si $title est vide (égale à "") alors la propriété est supprimée.
	**/
	public function title($title) {
		if($title != "" ) {
			return $this->modifyProperty("title&=".$title);
		}
		else {
			return $this->delProperty("title");
		}
	}
	/**
	* @return CTag
	* @desc Associe un nom au tag en cours.
	* Si $name est vide (égale à "") alors la propriété est supprimée.
	**/
	public function name($name) {
		if($name != "" ) {
			return $this->modifyProperty("name&=".$name);
		}
		else {
			return $this->delProperty("name");
		}
	}
	/**
	* @return Array
	* @desc renvoie le tableau de propriété (CProperty) de l'instance en cours.
	**/
	public function getPropertiesArray() {
		return $this->m_properties;
	}
	/**
	* @return String
	* @desc renvoie le texte du dernier tag imbriqué dans le tag en cours. <tag><tag1>... texte </tag1></tag>
	**/
	public function getTxt() {
		return $this->getLastTag()->getTxt_r();
	}
	/**
	* @return String
	* @desc renvoie le texte du tag en cours. <tag> texte </tag>
	**/
	protected function getTxt_r() {
		return $this->m_text;
	}
	/**
	* @return CTag
	* @desc Efface le texte du dernier tag imbriqué dans le tag en cours.
	**/
	public function delTxt() {
		return $this->getLastTag()->delTxt_r();
	}
	/**
	* @return CTag
	* @desc Efface le texte du tag.
	**/
	protected function delTxt_r() {
		return $this->setTxt_r("");
	}
	/**
	* @return CTag
	* @desc renvoie le tag à la position $i en cours.
	* $i doit etre compris entre 1 et la taille du tableau de tag du tag en cours (inclus).
	**/
	public function getTag($i) {
		if($i > $this->getTagNbr()) {
			return null;
		}
		else {
			return $this->m_tags[$i-1];
		}
	}
	/**
	* @return integer
	* @desc renvoie le nombre de tag imbriqué dans le tag en cours.
	**/
	public function getTagNbr() {
		return sizeof($this->m_tags);
	}
	/**
	* @return String
	* @desc renvoie les propriétés du tag en cours.
	**/
	public function getProperties() {
		$properties = "";
		for($i=0;$i<sizeof($this->m_properties);$i++) {
			$properties = $properties.$this->m_properties[$i]->__tostring();
		}
		return $properties;
	}
	/**
	* @return String
	* @desc renvoie le type du tag en cours. <type> ... </type>
	**/
	public function getType() {
		return $this->m_type;
	}
	/**
	* @return String
	* @desc renvoie l'ID du tag en cours. <tag id="..."> ... </tag>
	**/
	public function getID() {
		return $this->m_id;
	}
	/**
	* @return CTag
	* @desc renvoie le tag de type $type imbriqué dans le tag en cours. <type> ... </type>
	**/
	public function ifTagExists($type) {
		$b=null;
		for ($j=0;$j<$this->getTagNbr();$j++) {
			if(strtolower($this->m_tags[$j]->getType()) == strtolower($type)) {
				$b = $this->m_tags[$j]->ifTagExists($type);
				if($b == null) {
					$b = $this->m_tags[$j];
				}
			}
			else {
				$b = $this->m_tags[$j]->ifTagExists($type);
			}
		}
		if($b!=null) {
			return $b;
		}
		else {
			return null;
		}
	}
	/**
	* @return CTag
	* @desc remplace le texte du dernier tag imbriqué dans le tag en cours par $txt.
	**/
	public function setTxt($txt) {
		return $this->getLastTag()->setTxt_r($txt);
	}

	/**
	* @return CTag
	* @desc remplace le texte de l'instance de tag en cours par $txt.
	**/
	protected function setTxt_r($txt) {
		$this->m_text = $txt;
		return $this;
	}
	/**
	* @return CTag
	* @desc modifie le type de l'instance en cours par $type.
	* $type doit être un tag HTML.
	**/
	public function setType($type) {
		$this->m_type = strtolower($type);
		return $this;
	}
	/**
	* @return CTag
	* @desc
	* ex: $arg = "align&=center&&size&=+3 ..."
	* ajoute les propriétés avec leur valeur, séparé par && les valeurs étant associés à la propriétés par le symbole "&=", données par $arg de l'instance de tag en cours.
	* Ne vérifie pas si les propriétés existent deja.
	* $arg est de type string.
	**/
	public function addProperty($arg) {
		if($arg != "") {
			$temp = split("&&", $arg);
			$min = sizeof($this->m_properties);
			$max = sizeof($temp) + $min;
			for ($i=$min;$i<$max;$i++) {
				list($name,$value) = split("&=",$temp[$i-$min]);
				$this->m_properties[$i] = new CProperty($name,$value);
			}
			return $this;
		}
	}
	/**
	* @return CTag
	* @desc
	* ex: $arg = "align&=right&&size&=+2"; liste de quelques propriétés avec leur valeur, séparé par &&, les valeurs étant associés à la propriétés par le symbole "&=", parmis celles insérées dans le tag en cours
	* modifie les propriétés données par $arg de l'instance de tag en cours
	* si une des propriétés n'existe pas, elle est ajoutée.
	* $arg est de type string.
	**/
	public function modifyProperty($arg) {
		$temp = split("&&", $arg);
		for ($i=0;$i<sizeof($temp);$i++) {
			$wit = 1;
			list($name,$value) = split("&=",$temp[$i]);
			for ($j=0;$j<sizeof($this->m_properties);$j++) {
				if($this->m_properties[$j]->getName() == strtolower($name)) {
					$this->m_properties[$j]->setValue($value);
					$wit = 0;
				}
			}
			if($wit) {
				$this->addProperty($temp[$i]);
			}
		}
		return $this;
	}
	/**
	* @return CTag
	* @desc
	* ex: $arg = "align size ..."; liste de nom, séparé par un espace, de quelques propriétés parmis celles insérées dans le tag en cours
	* efface les propriétés données par $arg de l'instance de tag en cours
	* $arg est de type string.
	**/
	public function delProperty($arg) {
		$temp = split(" ", $arg);
		for ($i=0;$i<sizeof($temp);$i++) {
			for ($j=0;$j<sizeof($this->m_properties);$j++) {
				if($this->m_properties[$j]->getName() == strtolower($temp[$i])) {
					//on efface la propriétés
					unset($this->m_properties[$j]);
					//on réindexe le tableau
					$this->m_properties = array_values($this->m_properties);
					break;
				}
			}
		}
		return $this;
	}
	/**
	* @return CTag
	* @desc Insére le tag $tag à  la position $i dans le tableau de tag du tag en cours.
	* $i doit etre compris entre 1 et la taille du tableau (inclus).
	* $i est du type integer.
	* Renvoie le tag inséré.
	**/
	protected function insertTagAt($tag,$i) {
		$temp = array($tag);
		if( $i <= $this->getTagNbr() && $i > 0) {
			$start = array_slice($this->getTagArray(),0,$i-1);
			$end = array_slice($this->getTagArray(),$i-1);
			$this->setTagArray(array_values(array_merge($start,array_merge($temp,$end))));
			return $tag;
		}
		elseif($i==1) {
			$this->addTag($tag);
			return $tag;
		}
		else {
			return null;
		}
	}
	public function addTag($tag) {
		if($tag instanceof CTag ) {
			return $this->insertTag_r(array($tag));
		}
		else return null;
	}
	/**
	* @return CTag
	* @desc
	* $tag est de type array,i.e. un tableau d'objet de classe CTag
	* insére les tags du tableau $tag à la fin tableau de tag de l'instance en cours
	**/
	protected function insertTag_r($tag) {
		$min = $this->getTagNbr();
		$max = sizeof($tag) + $min;
		for ($i=$min;$i<$max;$i++) {
			$this->m_tags[$i] = $tag[$i-$min];
		}
		return $this;
	}
	/**
	* @return CTag
	* @desc ex: $tag est de type array,i.e. un tableau d'objet de classe CTag
	* Imbrique le premier tag du tableau $tag dans le dernier element du tableau de tag de l'instance en cours.
	* Les autres tags de $tag sont imbriqués dans le premier tag du tableau $tag.
	* Le texte du tag du plus bas niveau est remplacé par celui du tag du plus au niveau,
	* les texte des autres tags et celui du plus haut niveau sont effacés.
	**/
	public function insertTag($tag) {
		if($this->getTagNbr() == 0) {
			$this->m_tags[0] = $tag[0];
			$this->m_tags[0]->setTxt_r($this->getTxt_r());
			$this->delTxt_r();
		}
		else if ($this->getTagNbr() > 0) {
			$this->m_tags[$this->getTagNbr() - 1]->insertTag_r(array($tag[0]));
			$tag[0]->setTxt_r($this->m_tags[$this->getTagNbr() - 1]->getTxt_r());
			$this->m_tags[$this->getTagNbr() - 1]->delTxt_r();
		}
		for($i=1;$i<sizeof($tag);$i++) {
			$tag[$i-1]->insertTag_r(array($tag[$i]));
			$tag[$i]->setTxt_r($tag[$i-1]->getTxt_r());
			$tag[$i-1]->delTxt_r();
		}
		return $this;
	}
	/**
	* @return CTag
	* @desc Efface le tag à  la position $i dans le tableau de tag du tag en cours.
	* $i doit etre compris entre 1 et la taille du tableau (inclus).
	* $i est du type integer.
	* Renvoie le tag en cours.
	**/
	public function delTagAt($i) {
		if($i > $this->getTagNbr()) {
			return null;
		}
		else {
			unset($this->m_tags[$i-1]);
			return $this->setTagArray(array_values($this->getTagArray()));
		}
	}
	/**
	* @return CTag
	* @desc ex: $type = "td tr p font center"; liste de quelques tags parmis ceux insérés dans le tag en cours.
	* Efface uniquement le tag voulu (pas ceux imbriqués).
	**/
	public function delTag($type) {
		$temp = split(" ", $type);
		for ($i=0;$i<sizeof($temp);$i++) {
			for ($j=0;$j<$this->getTagNbr();$j++) {
				if($this->m_tags[$j]->getType() == strtolower($temp[$i])) {
					$this->m_tags[$j]->delTag(strtolower($temp[$i]));
					//on récupère le texte du tag qui va être effacé
					if($j != 0 ) {
						$this->m_tags[$j-1]->setTxt_r($this->m_tags[$j]->getTxt_r());
					}
					else {
						$this->setTxt_r($this->m_tags[$j]->getTxt_r());
					}
					//on récupère les tags imbriqués
					$this->insertTag_r($this->m_tags[$j]->getTagArray());
					//on efface le tag
					unset($this->m_tags[$j]);
					//on réindexe le tableau des tags
					$this->m_tags = array_values($this->m_tags);
					//et on recommence.
				}
				else {
					$this->m_tags[$j]->delTag(strtolower($temp[$i]));
				}
			}
		}
		return $this;
	}
	/**
	* @return CTag
	* @desc
	* ex: $type = "td tr p font center"; liste de quelques tags parmis ceux insérés dans le tag en cours
	* Efface le tag plus tous ceux qui lui sont imbriqués.
	* Attention le text n'est pas récupéré!!
	**/
	public function delTag_r($type) {
		$temp = split(" ", $type);
		for ($i=0;$i<sizeof($temp);$i++) {
			for ($j=0;$j<$this->getTagNbr();$j++) {
				if($this->m_tags[$j]->getTagType() == strtolower($temp[$i])) {
					//on efface le tag
					unset($this->m_tags[$j]);
					//on réindexe le tableau des tags
					$this->m_tags = array_values($this->m_tags);
				}
				else {
					$this->m_tags[$j]->delTag_r(strtolower($temp[$i]));
				}
			}
		}
		return $this;
	}
	/**
	* @return void
	* @desc destructeur
	*/
	public function __destruct() {
		unset( $this->m_properties );
		unset( $this->m_tags );
		unset( $this->m_text );
		unset( $this->m_type );
		unset( $this->m_decalage );
		unset( $this->m_DispNbr );
		parent::__destruct();
	}
	/**
	* @return CTag
	* @desc Met le texte du tag en cours en Gras.
	**/
	public function txtBold() {
		$this->delTag("b");
		$this->getLastTag()->insertTag(array(new CTag("b",$this->getTxt(),"")));
		return $this;
	}
	/**
	* @return CTag
	* @desc Met le texte du tag en cours en Italique.
	**/
	public function txtItalic() {
		$this->delTag("i");
		$this->delTag("em");
		$this->delTag("class");
		$this->delProperty("class style");
		$this->getLastTag()->insertTag(array(new CTag("i",$this->getTxt(),"")));
		return $this;
	}
	/**
	* @return CTag
	* @desc Met le texte du tag en cours en Souligné.
	**/
	public function txtUnder() {
		$this->delTag("u");
		$this->getLastTag()->insertTag(array(new CTag("u",$this->getTxt(),"")));
		return $this;
	}
	/**
	* @return CTag
	* @desc Met le texte du tag en cours en Barré.
	**/
	public function txtStrike() {
		$this->delTag("strike");
		$this->getLastTag()->insertTag(array(new CTag("strike",$this->getTxt(),"")));
		return $this;
	}
	/**
	* @return CTag
	* @desc Initialise la mise en forme du texte du tag en cours.
	**/
	public function initStyle() {
		$this->delTag("b");
		$this->delTag("i");
		$this->delTag("u");
		$this->delTag("strike");
		$this->delTag("font");
		return $this;
	}
	/**
	* @return CTag
	* @desc Initialise la mise en forme du texte du tag en cours.
	**/
	public function delTxtBold() {
		$this->delTag("b");
		return $this;
	}
	/**
	* @return CTag
	* @desc Initialise la mise en forme du texte du tag en cours.
	**/
	public function delTxtStrike() {
		$this->delTag("strike");
		return $this;
	}
	/**
	* @return CTag
	* @desc Initialise la mise en forme du texte du tag en cours.
	**/
	public function delTxtUnder() {
		$this->delTag("u");
		return $this;
	}
	/**
	* @return CTag
	* @desc Initialise la mise en forme du texte du tag en cours.
	**/
	public function delTxtItalic() {
		$this->delTag("i");
		return $this;
	}
	/**
	* @return CTag
	* @desc Initialise la mise en forme du texte du tag en cours.
	**/
	public function delTxtColor() {
		$f = $this->ifTagExists("font");
		if($f != null) {
			$f->rmColor();
		}
		return $this;
	}
	/**
	* @return CTag
	* @desc Initialise la mise en forme du texte du tag en cours.
	**/
	public function delTxtPolice() {
		$f = $this->ifTagExists("font");
		if($f != null) {
			$f->rmPolice();
		}
		return $this;
	}
	/**
	* @return CTag
	* @desc Initialise la mise en forme du texte du tag en cours.
	**/
	public function delTxtSize() {
		$f = $this->ifTagExists("font");
		if($f != null) {
			$f->rmSize();
		}
		return $this;
	}
	/**
	* @return CTag
	* @desc Insére un label asssocié à l'ID du tag en cours.
	**/
	public function addLabel($label) {
		if($label != null && $label != "" && $this->getID()!= null) {
			return $this->addTag(new CLabel($label,$this->getID()));
		}
		else {
			return null;
		}
	}
	/**
	* @return CTag
	* @desc Met le texte du tag à la taille précisée $size.
	**/
	public function txtSize($size) {
		$f = $this->ifTagExists("font");
		if($f != null) {
			$f->size($size);
		}
		else {
			$this->getLastTag()->insertTag((array(new CFont($this->getTxt(),"size&=".strtolower($size)))));
		}
		return $this;
	}
	/**
	* @return CTag
	* @desc Met la couleur du texte du tag à la couleur précisée $color.
	* $color doit être une couleur formatée HTML.
	**/
	public function txtColor($color) {
		$f = $this->ifTagExists("font");
		if($f != null) {
			$f->color($color);
		}
		else {
			$this->getLastTag()->insertTag((array(new CFont($this->getTxt(),"color&=".$color))));
		}
		return $this;
	}
	/**
	* @return CTag
	* @desc Met la police du texte du tag à la police précisée $face.
	**/
	public function txtPolice($face) {
		$f = $this->ifTagExists("font");
		if($f != null) {
			$f->police($face);
		}
		else {
			$this->getLastTag()->insertTag((array(new CFont($this->getTxt(),"face&=".strtolower($face)))));
		}
		return $this;
	}
	/**
	* @return CTag
	* @desc Renvoie le dernier des tags imbriqués dans le tag en cours.
	**/
	protected function getLastTag() {
		if($this->getTagNbr()!=0) {
			for($i=0;$i<$this->getTagNbr();$i++) {
				return $this->m_tags[$i]->getLastTag();
			}
		}
		else {
			return $this;
		}
	}
	/**
	* @return CTag
	* @desc Colore le fond de la zone du tag avec la couleur spécifiée.
	* Si $color=="" alors une couleur sera mise au hasard.
	**/
	public function bgcolor($color)
	{
		if($color==""){
			$c = new CColor();
			$color=$c->randomCode();
		}
		$this->modifyProperty("bgcolor&=".$color);
		return $this;
	}
	/**
	* @return CTag
	* @desc Aligne verticalement le texte en haut de la zone du tag
	*
	**/
	public function valignTop()
	{
		$this->modifyProperty("valign&=top");
		return $this;
	}
	/**
	* @return CTag
	* @desc Empeche le texte du tag de revenir à la ligne en bout de zone du tag.
	*
	**/
	public function nowrap()
	{
		$this->modifyProperty("nowrap");
		return $this;
	}
	/**
	* @return CTag
	* @desc	Aligne verticalement le texte de la zone du tag au centre.
	*
	**/
	function valignMiddle()
	{
		$this->modifyProperty("valign&=middle");
		return $this;
	}
	/**
	* @return CTag
	* @desc	Aligne verticalement le texte de la zone du tag au bas de la ligne courante.
	*
	**/
	function valignBase()
	{
		$this->modifyProperty("valign&=baseline");
		return $this;
	}
	/**
	* @return CTag
	* @desc Aligne verticalement le texte de la zone du tag en bas.
	*
	**/
	public function valignBottom()
	{
		$this->modifyProperty("valign&=bottom");
		return $this;
	}
	/**
	* @return CTag
	* @desc Attribue la largeur de la zone du tag à $i pixel.
	* $i peut être de type string ou integer.
	**/
	public function width_Px($i)
	{
		if($i!="" || $i != 0)
		$this->modifyProperty("width&=".strtolower($i)."px");
		return $this;
	}
	/**
	* @return CTag
	* @desc Attribue la largeur de la zone du tag à $i pourcent du tag le contenant.
	* $i peut être de type string ou integer.
	**/
	public function width_Pr($i) {
		if($i!="" || $i != 0)
		$this->modifyProperty("width&=".strtolower($i)."%");
		return $this;
	}
	/**
	* @return CTag
	* @desc Attribue la hauteur de la zone du tag à $i pixel.
	* $i peut être de type string ou integer.
	**/
	public function height_Px($i) {
		if($i!="" || $i != 0)
		$this->modifyProperty("height&=".strtolower($i)."px");
		return $this;
	}
	/**
	* @return CTag
	* @desc Attribue la hauteur de la zone du tag à $i pourcent du tag le contenant.
	* $i peut être de type string ou integer.
	**/
	public function height_Pr($i) {
		if($i!="" || $i != 0)
		$this->modifyProperty("height&=".strtolower($i)."%");
		return $this;
	}
	/**
	* @return CTag
	* @desc Aligne horizontalement le texte au centre de la zone du tag
	*
	**/
	public function alignCenter() {
		$this->modifyProperty("align&=center");
		return $this;
	}
	/**
	* @return CTag
	* @desc Aligne horizontalement le texte à gauche de la zone du tag
	*
	**/
	public function alignLeft() {
		$this->modifyProperty("align&=left");
		return $this;
	}
	/**
	* @return CTag
	* @desc Aligne horizontalement le texte à droite de la zone du tag
	*
	**/
	public function alignRight() {
		$this->modifyProperty("align&=right");
		return $this;
	}
	/**
	* @return CTag
	* @desc Justifie le texte à droite de la zone du tag
	*
	**/
	public function alignJustify() {
		$this->modifyProperty("align&=justify");
		return $this;
	}
	/**
	* @return CTag
	* @desc Ajoute une bordure de taille $i a la zone du tag.
	*
	**/
	public function border($i) {
		if( $i != "" || $i>=0)
		$this->modifyProperty("border&=".strtolower($i));
		return $this;
	}
	/**
	* @return CTag
	* @desc Met la birdure de la zone du tag à la couleur $color.
	* $color doit etre une couleur de base HTML en nom commun (pas de code Hexa).
	**/
	public function bordercolor($color) {
		if($color!="")
		$this->modifyProperty("bordercolor&=".strtolower($color));
		return $this;
	}
	/**
	* @return CTag
	* @desc Le lien s'ouvrira dans le cadre $tar.
	* $tar est de type String.
	**/
	public function target($tar) {
		if($tar != "")
		{
			$this->m_target = $tar;
			return $this;
		}
		else return null;
	}
	/**
	* @return CTag
	* @desc Le lien s'ouvrira dans la fenetre parente.
	**/
	public function targetParent() {
		$this->m_target = "_parent";
		return $this;
	}
	/**
	* @return CTag
	* @desc Le lien s'ouvrira dans une nouvelle fenetre.
	**/
	public function targetBlank() {
		$this->m_target = "_blank";
		return $this;
	}
	/**
	* @return CTag
	* @desc Le lien s'ouvrira dans la frame principale qui contient celle du lien.
	**/
	public function targetTop() {
		$this->m_target = "_top";
		return $this;
	}
	/**
	* @return CTag
	* @desc Le lien s'ouvrira dans la meme fenetre ou frame que celle du lien.
	* (par défaut).
	**/
	public function targetSelf() {
		$this->m_target = "_self";
		return $this;
	}
}

 Conclusion

Dans le zip toutes les classes evidemment et affiché ici, un exemple d'utilisation, ainsi que les 3 classes mères de toutes les autres: CObject et CProperty et CTag.

Tous est assez bien documenté, sauf quelques exceptions, par flem je l'avoue. Mais n'hésitez pas à me demander de mieux documenter, si vraiment vous ne comprenez rien...
Pas de bogues connu, mais y en a surement car je n'utilise pas toutes les classes pour mon site. Merci de me les remonter (je sais c'est abuser de vous prendre pour des gammma testeur, mais qui ne le fait pas ici? ;) )

Ah oui petit problème, tous les documents ont pour extension "*.php5": c'est normal c'est à cause de FREE, c'était pour être sur bien qu'ils utilisaient leur moteur PHP5, de l'époque (je sais plus si aujourd'hui c'est encore d'actualité).

Bon et quand je serais vraiment très courageux je ferais un diagramme UML d'héritage et de classe, mais ça va être dur...

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

20 avril 2006 20:48:37 :
Mise à jour du ZIP
20 avril 2006 20:52:08 :
remise à jour ZIP :p
20 avril 2006 20:56:25 :
Mise à jour pour colration syntaxique
22 avril 2006 12:02:44 :
Modification du niveau, du titre et des mots clés

 Sources du même auteur

Source avec une capture [PHP5][POO][IMAP] UNE CLASSE POUR LIRE DES MAILS EN IMAP DE...
Source avec Zip Source avec une capture [PHP5][POO][JEUX] SUDOKU
UPLOAD CHEZ FREE QUI MARCHE!!
Source avec Zip CRÉATION D'UN ESPACE MEMBRE AVEC MYSQL

 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 [PHP5.2] CLASSE PDO par hornetbzz
Source avec Zip [POO][PHP5]UN SITE MULTILANGUE VIA XML par destinyfr
Source avec Zip PHP5 MY EXPLORER : AFFICHE L'ARBORESCENCE DE DOSSIERS par ranouf
PHP5 - CLASSE DE NEWS ET DE COMMENTAIRES par FhX
Source avec Zip Source avec une capture [PHP5][POO][JEUX] SUDOKU par Nifhell

Commentaires et avis

Commentaire de Anthomicro le 21/04/2006 00:55:05

Salut,

ça par contre, c'est du boulot, mais c'est lourd et crade (enfin ce n'est que mon avis) d'utiliser ce genre de trucs pour concevoir un site :-)

Commentaire de malalam le 21/04/2006 10:14:30 administrateur CS

faut aussi que je mate.
Mais à priori, je suis de l'avis d'Antho sur ce coup.
Même si bon, le code a l'air joli.
Faut aussi voir ton site du coup ;-)

Commentaire de stailer le 21/04/2006 20:04:24

Ah, au fait, pour ceux que ça intéresse, il y a un autre outil très puissant avec notamment des tutoriaux sur developpez.com : XMLRAD.
C'est un framework multi base de données et multi langage, extrêmement performant et basé sur XML.

Pour ceux qui débutent en php et qui croient qu'un framework ne sert à rien et est hyper lourd (j'en connais), je leur conseille de l'essayer en local, le logiciel est assez intuitif et les tutoriaux sur developpez.com plutôt bien expliqués.

Commentaire de jfs59 le 21/04/2006 20:24:28

Ben j'ai pas grand chose a dire sur le source ! sauf que franchement vous donnez pas envie de le lire ... mais surtout, et c'est a mon avis plus grave, a lire vos commentaires et vos chamaillerie de gosses de 4 ans, on a pas non plus envie de poster quelque  chose sur le site, quelque soit le niveau.
a ne pas vous connaitre donc .. ni l'un ni l'autre !

Commentaire de Nifhell le 21/04/2006 20:29:34

Bonjour,

Ecoutez la polémique était plutot interessante sur l'utilité des Frameworks et de savoir si ce que j'avais fait en était un (visiblement j'ai fait un abus de langage) jusqu'à ce que ça dérappe aux insultes.

Mon code n'est certainement pas utile à tout le monde. Mais il peut peut-être aider quelqu'un.

Alors continuer la conversation de manière cordiale, car j'ai appris des trucs grace à vous deux, mais si c'est pour vous insulter donnez vous votre adresse IM et faites le par ce biais là.

En espérant, ne facher personne: on doit cocher une case, non, pour poster quelque chose ici, il me semble??

Commentaire de Nifhell le 22/04/2006 11:56:47

OK merci pour les infos.

Il est vrai qu'il ne s'agit clairement pas d'un framework.

Mais mon but était de présenter ce que j'avais fait pour mon site persos.
Pour ce dernier, je n'avais pas envie de mettre en place un système de template que je connais mal et ni de me préoccuper des performances du site (c'est pas avec la fréquentation de mon site que je vis écrouler les serveurs de free...) ni encore de me lancer dans l'apprentissage de l'utilisation d'un framework existant ou ni encore de me conformer à des normes W3C.
Je voulais mettre en application la POO que je venais d'étudier à mon école (c'était il y a 2 ans).

Et ce code n'a jamais eu la prétention d'avoir une application professionnel.
Si quelqu'un veut l'utiliser, il le prend, et il verra un peu ce qu'est un héritage, une sudéfinition, etc... en POO

Aussi je vais changer le titre et le niveau de cette source, car finalement, vous me l'avais fait comprendre, elle ne prétend pas à un framework, mais à une démonstration de POO.

Commentaire de FhX le 22/04/2006 18:53:57

Moi ce que j'aime pas... c'est la dizaine de méthode pour faire du get...
Alors qu'il existe __get() et suffit de faire un léger parsing pour que ca soit plus propre.

Pareil pour les méthodes txt_*, del_*, align_*... autant faire ca en une méthode et taper un parsing.

Ex:
# public function alignCenter() {
#         $this->modifyProperty("align&=center");
#         return $this;
#     }
// etc...

public function Align($var) {
  $array = array('center','left', 'right', 'justify');
  $var = strtolower($var);
   if ( in_array($var, $array ) ) {
        $this->modifiyProperty('align&='.$var);
        return $this;
   } else {
        throw new Exception('Aucun alignement possible ne correspond à '.$var);
   }
}

Ca c'est de la méthode générique.
Si tu veux pas charger le tableau à chaque appel de méthode ==> tu fous ca en propriété. Genre un gros tableau style :
private $array = array( 'align' => array ('center', 'left', 'right', 'justify') );
Et tu accèdes à ce que tu veux via :
$this->array['align'][$var]; Par exemple.

Moi je trouve ca plus beau que de faire 70 méthodes pour plus ou moins la même chose au final... Ou alors y'a aussi le coup du __call() qui peut bien marcher aussi... y'a plein de possibilité à exploiter :)

Commentaire de Nifhell le 23/04/2006 09:46:14

FhX,

Ton optimisation présentée est certainement plus économique. Mais comme tu as pu le lire ce code n'a rien d'économique!!!

C'est vrai que j'aurais pu faire une grosse fonction...

Par contre,  je n'aime pas trop les méthodes magiques "__get" et "__set", parce que je trouve que dans le principie (dans la pratique, elle le respecte ;) ) elles ne respectes pas vraiment le concept d'encapsulation des données. Mais c'est vrai qu'encore une fois elle font gagner du temps.

Commentaire de FhX le 23/04/2006 13:46:35

Voui, c'est un avis personnel de coding ca :)

L'avantage de ma méthode c'est que je fais une fonction alors que tu dois en faire 4 ou 5... C'est juste question vitesse =)

Maintenant, moi j'ai fais ce ptit commentaire au cas où tu voulais améliorer le truc... ou alors pour un autre projet, que sait-je :)

En tout cas, la finalité du code est bien faite. Je comptais faire quelque chose de similaire mais n'ayant pas le temps je ne peux pas :/

En tout cas félicitation !

Commentaire de FhX le 23/04/2006 21:26:56

Bah tu peux faire un truc debase :

Abstract class Module { // }
class login extends Module { // }
class forum extends Module { // }
class liens extends Module { // }

class Modulator {

public $modules = array();

public function GetInstance($nom_de_lobjet) {
   // Recherche si l'objet peut être instancié où non
   // Si oui :
   $this->modules[$nom_de_lobjet] = new $nom_de_lobjet;
}

public function __get($var) {
  return $this>modules[$var];
}
}

Et la, dans ton script, faire quelque chose comme :
$module = new Modulator();
$module->GetInstance('login'); // On regarde si le module de login peut être instancier.

$module->login->methode_interne();

Un ptit truc comme ca, j'ai fais ca en 2 minutes et c'est extrèmement modulable !

Commentaire de FhX le 23/04/2006 21:33:26

Tu peux même rajouter des méthodes à la classe Modulator :
<?php
class Modulator {

private $InitModule = array();
private $modules = array();

public function AddActiveModule($modulename) {
   $this->InitModule[$modulename] = TRUE;
}

public function DelActiveModule($modulename) {
   $this->InitModule[$modulename] = FALSE;
}

public function GetInstance() {
  foreach ( $this->InitModule as $key=>$val ) {
    if ( $val ) $this->modules[$key] = new $key;
  }
}

public function __get($var) {
   if ( isset($this->modules[$var]) ) {
        return $this->modules[$var];
   } else {
        throw new ModuleException(' ... '); // Implique de coder une classe d'exception
   }
}

?>

Et tu peux faire ca ensuite :
$module = new modulator;
$module->AddActiveModule('login');
$module->AddActiveModule('liens'); // etc...

$module->GetInstance();

// Et après :
try {
$module->login->method();
$module->liens->method();
} catch ( ModuleException $e ) {
  echo $e->getMessage; // Module non actif
}

Et voilou :)
5 minutes sur le coup :)

Commentaire de malalam le 24/04/2006 09:10:24 administrateur CS

Merci pour les commentaires à supprimer!
Franchement, je ne suis pas content!

- la discussion sur les framework EST intéressante, mais merci de la poursuivre sur le forum, étant donné que tout le monde s'est entendu pour dire qu'au final, ce code n'est pas réellement un framework.
- une discussion entre "gourous" ne devrait pas se passer comme ça! Très franchement, c'était ridicule, et il n'y en a pas un pour rattraper l'autre (je parle là des 2 protagonistes principaux de cette discussion). Entre insultes et ironie blessante...pfff.

Merci de ne pas recommencer!

Commentaire de J_G le 24/04/2006 10:27:28

Bonjour les gens...

On dirait que j'arrive après la bataille ;) (et tant mieux).

L'initiative de cette source est bonne, et le code ma foi fort joli...

Mais j'aurai une ch'tite question :
Les documents HTML étant du XML... (principalement un XHTML dont on respecte la norme). Pourquoi ne pas avoir créée tes classes en les dérivant de la librairie DOM ?
C'est à dire en créant une interface de cette API très complète. Interface alors dédiée au HTML. Tu n'aurais plus besoin du "abstract CObject" et "CTag", DOM se chargeant de la construction de l'arbre XML et du formatage de la sortie.
Une économie substantielle de code... Non ?  

Autre avantage de la construction d'HTML à partir de DOM : on peut faire un traitement XSLT avant d'envoyer au navigateur... Ce qui peut par exemple supprimer l'utilisation des classes CPagePerso et CHeader ou/et limiter la taille de l'arbre (ex : <input type="text" name="salut" label="Votre nom" /> traiter en <label for="12345">Votre nom :</label><input type="text" name="Salut" id="12345" /> ... Encore une sacrèe économie de caractère et on change moi souvent de clavier ;)

Enfin... encore bravo pour ton jeu complexe de classes.

A+, J_G

Commentaire de Anthomicro le 24/04/2006 12:38:05

Dommage d'avoir tout censuré... enfin bon c'est pas grave, ça ne change pas mes positions quant à ce que j'ai dit sur cette source...

Commentaire de coucou747 le 24/04/2006 13:05:43 administrateur CS

je ne vois pas non plus pour quelles raison je me suis fait censuré...

Commentaire de malalam le 24/04/2006 13:18:53 administrateur CS

Antho => ça n'avait aucun rapport avec le code, d'une part. D'autre part, votre discussion aurait été bien plus intéressante si elle n'avait pas pris une telle tournure : on allait de gamineries en gamineries. Je veux bien qu'on ne soit pas d'accord sur tel ou tel point, ou qu'on aime pas un code...mais il y a la manière de dire les choses! Franchement, je suis déçu.

Coucou => même remarque. "l'autre imbécile", ça ne m'a pas paru une tournure adéquate pour définir quelqu'un. Et je ne pense pas avoir tort sur ce coup.

Franchement, les gars, si on se met à se parler de manière condescendante, voire à s'insulter...on va ou ???
Tout le monde n'est pas adulte ici, je le sais très bien, mais tout le monde DOIT se comporter en "adulte"! Je mets des guillemets pour indiquer qu'il s'agit d'une façon de parler, évidemment...parce que peu d'adultes se comportent en adultes. Bref, restons civilisés!

Maintenant, mon avis personnel sur le CODE : ce n'est pas un framework, en effet, après étude plus approfondi. Ce n'est pas à utiliser pour n'importe quel type d'application web, parce qu'en effet, c'est lourd. Il y a des imperfections... surtout si on se dit qu'il s'agit là d'une philosophie de programmation; je rejoins sur ce coup JG : autant faire les choses à fond :-) DOM aurait donc été bienvenue. Et FhX pour ses améliorations.
Du coup, j'ai noté 9/10 : c'est bien codé, et ce genre de package est indispensable pour certaines appli : cela pousse à avoir un code propre, et clair, plutôt qu'un foutoir de fonctions diverses at variés, et de code séquentiel. Mais pour faire un sitre relativement simple, c'est inutile, je suis aussi d'accord avec Antho et Coucou de ce côté-ci.
Il n'empêche : l'idée est bonne, le code aussi dans l'ensemble. Pour moi en tous cas :-)

Commentaire de malalam le 24/04/2006 13:23:18 administrateur CS

J'ai dit STOP!
C'est pas possible ça lol!!

http://www.phpcs.com/forum.v2.aspx?ID=722431

Commentaire de coucou747 le 24/04/2006 13:42:14 administrateur CS

imbécil restait un terme parfaitement neutre... (pour ceux qui n'ont pas eu le temps de lire mon topic, il ne s'agissait pas de qqn d'ici...)

Bon, je faisais aussi un parallèle interressant entre ce code et la manière de créer une interface en gtk.

Commentaire de malalam le 24/04/2006 13:49:29 administrateur CS

Que ce soit un mec d'ici ou pas, ça ne change pas grand chose. Je crois qu'on peut tous être d'accord pour dire que ce n'est pas un langage approprié quand on écrit sur un forum. Après, en privé, sur msn ou autre, tu dis ce que tu veux de qui tu veux :-)
Mais pas sur un forum, c'est tout.
Et comme je ne peux que supprimer tout un message...j'ai tout supprimé.
Donc je te propose de réécrire ton message, en n'en gardant que la substantifique moelle... :-)

Commentaire de Nifhell le 24/04/2006 15:15:46

L'idée de dérivé DOM est pas mal, même plutot efficace, et c'est vrai que je me suis bien pris le chou pour pas grand chose, sur ce code... mais son interet pour moi n'en est pas moins diminué: ça m'a permi de mettre en application pas mal de choses.

J'avoue que j'ai dérivé quelques peu au PFPMDJR (Pas Fait Par Moi, Donc Je Recommence), j'ai même pas cherché l'existance de classes à hériter, ce qui est plutot nul d'un mec qui se dit adepte de la POO :$

Commentaire de J_G le 24/04/2006 15:24:58

Nifhell : Tu t'es fait plaisir dans la mise en pratique "grande echelle" de la POO... Et c'est bien là l'essentiel ;) Mais le pire de tout est que ton jeu de classe marche ! Ton travail n'est donc pas vain, loin sans faut.

Commentaire de Anthomicro le 24/04/2006 19:03:44

"Antho => ça n'avait aucun rapport avec le code, d'une part"

C'est ton point de vue que je ne partage pas... j'ai de toute façon tout sauvegardé, mais bon c'est aussi une question de principe...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

heritage en php [ par fredericmaill ] Bonjour, lors de la cration d'un heritage en php&nbsp; 4, &nbsp;classe mere et classe fille, les 2 classes doivent etres l'un en dessous de l'autre ou Fonctionnement SDO [ par guill76 ] Bonjour,Je viens de découvrir un petit peu l'extension SDO de PHP5 que j'ai récupérée en installant PHP5.2.5 il ya environ un semaine et dans cette ex [PHP5] Etendre une classe prédéfinie [ par ZuGbEn ] Bonjour !Je débute plus ou moins dans la programmation orientée objet, et je souhaite faire une classe qui, à partir d'un DomNode existant, ajoute des Probleme POO [ par cedriclomb ] Bonjour,Aujourd'hui au programme casse tete chinois ! :DVoila j'ai une classe B qui est une extends de Aun objet $b=new B;et ensuite $b-&gt;loadModule diagramme de classe vers un langage POO ???? [ par marwen109 ] bonjour,[^^happy17] comment passer d'un diagramme de classe vers un langage de poo comme php5 ou c++.... par exemple diagramme de classe: un employ [POO] Une classe dans une classe [ par Mrreivax ] Bonsoir.Et bien voila. J'ai créé une classe de gestion des images.J'ai par la suité créé une autre classe de gestion de banières.Mais, cette dernière Surcharge d'une fonction abstraite [ par codefalse ] Bonjour à tous :)J'ai un petit soucis syntaxique, j'aimerai votre avis avant de continuer.J'ai une classeabstract class genericReader {} qui contient PHP5 -> SPL , tri sur DirectoryIterator [ par stailer ] Bonjour, J'utilise la classe DirectoryIterator pour lister tous les répertoires et fichiers d'un chemin. Grâce à isFile je peux lister uniquement les constante de classe à récupérer dans la classe parente [ par rekam ] Bonjour!oui, je sais, le titre fait 3km de long, mais j'ai de la peine à le raccourcir...Ainsi donc, voici mon problème: 1) J'ai 2 classe A et B2) La Throw new HOW ? [ par codefalse ] Hello tout le monde ! :)Alors voila, pour mes besoins perso je me suis fait une classe AlternativException extends Exception et une classe InvalidArgu


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

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 : 1,061 sec (3)

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