<?php
/*!
@copyrights b23|prod:Tiana Bruno RAKOTOARIMANANA - 2004 (all rights reserved to b23|prod)
@author Tiana Bruno RAKOTOARIMANANA
@date Sat Sep 18 15:37:02 CEST 2004 @609 /Internet Time/
@filename php_formulaire.class.inc
*/
/*!
@header php_formulaire.class.inc.php
@abstract Contient les classes Formulaire et Champ (plus bas)
@discussion (description)
*/
/*!
@class Formulaire
@abstract Cette classe gère les formulaires HTML dans les pages WEB. Elle nécessite la classe Tableau. Le mode d'envoi est toujours ENCTYPE=multipart/form-data pour un maximum de flexibilité.
@discussion <br>TODO une intégration des scripts *javascript* pour effectuer les liens enfants-parents entre des champs: un champ dont la valeur est modifiee pourrait afficher un autre pour le compléter (méthode addEnfant()).
*/
if (!isset ($ClasseFormulaire))
{
require_once("php_tbl.class.inc.php");
$ClasseFormulaire = 1;
// mode affichage du formulaire
define("HORIZONTAL", 0);
define("VERTICAL", 1);
define("LIBRE", 2);
// Classe gérant les formulaires
class Formulaire
{
var $nom;
var $modeTbl, $tbl; // $this->tbl utilisé dans la fonction fin() de la classe
var $nbChamps, $champs;
var $classe; // classe de style css
var $HTML;
/*!
@method Formulaire
@abstract Constructeur de la classe.
#nom: le nom du formulaire, tel qu'il apparaît dans la page HTML affichée
#action: la page script de réception.
#modeTbl: VERTICAL|HORIZONTAL|LIBRE les modes VERTICAL et HORIZONTAL affiche le formulaire et les champs dans un tableau HTML à l'appel de la méthode fin(). | LIBRE | Le mode LIBRE permet d'afficher librement les champs à l'appel de leurs méthodes getHTML ou writeHTML (voir classe Champ). Remarque: Il faut appeler la méthode writeHTML de la classe Formulaire AVANT de pouvoir afficher les champs, la balise HTML <FORM..> sera ainsi placée avant les balises <INPUT>.
@discussion (description)
*/
function Formulaire ($nom, $action, $modeTbl = VERTICAL, $classe = "formulaire", $methode="POST") {
$this->nom = $nom;
$this->classe = $classe;
$this->modeTbl = $modeTbl;
$this->nbChamps = 0;
$this->champs = array();
$this->HTML = "<FORM ACTION=\"".$action."\" METHOD='".$methode."' ENCTYPE=\"multipart/form-data\">";
$this->HTML .= "<INPUT TYPE='HIDDEN' NAME='_form' VALUE=\"".$nom."\">";
}
/* ----- partie privée ----- */
// utilisee dans la fonction publique fin() pour inserer les champs dans le tableau HTML du formulaire. Sauf en modeTbl libre ou les champs sont directement ecrits dans le script appelant le formulaire.
function fin_champs($mode) { // $mode retourner (0) ou ecrire (1)
//initialisation affichage dans un tableau si nécessaire
switch($this->modeTbl) {
case VERTICAL:
//debug("form.class:ligne46: nbChamps = ".$this->nbChamps);
$this->tbl = new Tableau($this->nbChamps+1,1,"formulaire_vertical"); // dans ce tableau, il y a {nbChamps} + 1 lignes : (le titre (ligne 0);les champs input (ligne 1 à ligne nbChamps-(champsValetEff=1|2)); les champs Valider et Effacer se trouvent à la derniere ligne.
$this->tbl->setOptionsArray(array("HTML" => array("WIDTH" => "90%",
"ALIGN" => "CENTER")));
break;
case HORIZONTAL:
$this->tbl = new Tableau(3,$this->nbChamps,"formulaire_horizontal"); // 3 lignes: titre, champs, champs Valider et Effacer
$this->tbl->setOptionsArray(array("HTML" => array("WIDTH" => "10%",
"ALIGN" => "CENTER")));
break;
case LIBRE:
// pas de tableau a initialiser
$this->tbl = NULL;
break;
default:
break;
}
/* MODE TABLEAU HORIZONTAL ET VERTICAL */
if(($this->modeTbl == HORIZONTAL) || ($this->modeTbl == VERTICAL)) {
// placer les champs dans le tableau si mode HORIZONTAL ou VERTICAL; ommettre les champs Valider et effacer qui se placent a la derniere ligne du tableau
// debug("ligne 69: formatage des champs formulaire");
$this->tbl->options["class"] = $this->classe;
$this->tbl->setContenu_Cellule(0,0, "<b>".$this->nom."</b>",array("HTML" => array("WIDTH" => "100%",
"COLSPAN" => $this->tbl->nbColonnes,
"ALIGN" => "RIGHT"),
"class" => "formulaire_titre"));
// index dans le tableau HTML pour inserer les champs input, on ne commence pas à 0 pour le mode VERTICAL(=ligne de titre)
for($i=0, $n=0; $i < $this->nbChamps; $i++) {
if(($this->champs[$i]->type != "SUBMIT") && ($this->champs[$i]->type != "RESET")) {
/* HORIZONTAL */
// debug("ligne 75: champ $i.n=".$n);
if($this->modeTbl == HORIZONTAL) // ici, commencer à la colonne 0!
$this->tbl->setContenu_Cellule(1,$n, $this->champs[$i]->getHTML($this->modeTbl));
else // VERTICAL ici, commencer à la ligne 1 (2e ligne)
$this->tbl->setContenu_Cellule($n+1,0, $this->champs[$i]->getHTML($this->modeTbl));
// debug("tbl.class81: cellule ".$n+1.";1".$this->tbl->getContenu_Cellule($n+1,0);
$n++;
}
else {
/* champs valider et effacer a placer, enregistrement de l'index dans le tableau de champs*/
if($this->champs[$i]->type == "SUBMIT"){
//debug("index_v ok = $i");
$index_v = $i;}
else if($this->champs[$i]->type == "RESET"){
//debug("index_e ok = $i");
$index_e = $i; }
}
}
}
// champs valider et effacer
if(!isset($index_e)) $index_e = NULL;
if(!isset($index_v)) $index_v = NULL;
$this->fin_champsValEff($mode,$index_e,$index_v);
}
// utilisee dans la fonction publique fin() pour inserer les champs valider et effacer dans le tableau HTML du formulaire. en modeTbl libre, on insere les champs oubliés dans le script appelant le formulaire.
// $mode: retourner (0) ou ecrire (1)
function fin_champsValEff($mode,$index_e=NULL,$index_v=NULL) {
/* CHAMPS VALIDER ET EFFACER */
switch($this->modeTbl) {
case HORIZONTAL:
$tbl_valider = new Tableau(1,2,"formulaire_horizontal_chValider");
$tbl_valider->setOptionsArray(array("HTML" => array("WIDTH" => "100%",
"ALIGN" => "RIGHT"),
"class" => $this->classe));
if(isset($index_v)) {
$valider = $this->champs[$index_v];
$tbl_valider->setContenu_Cellule(0,0, $valider->getHTML($this->modeTbl));
if(isset($index_e)) {
$effacer = $this->champs[$index_e];
$tbl_valider->setContenu_Cellule(0,1, $valider->getHTML($this->modeTbl).$effacer->getHTML($this->modeTbl));
}
$this->tbl->setContenu_Cellule(2,0, $tbl_valider->fin(1));
break;
}
//debug("form.class: 95: modeHORIZONTAL:champ valider inexistant!!");
break;
case VERTICAL:
// debug("champs valider et effacer...");
if(isset($index_v)) {
//debug("103:modeVERTICAL:champs valider et effacer...");
$valider = $this->champs[$index_v];
$v_str = $valider->getHTML($this->modeTbl);
$this->tbl->setContenu_Cellule($this->nbChamps, 0, $v_str);
if(isset($index_e)) {
$effacer = $this->champs[$index_e];
$this->tbl->setContenu_Cellule($this->nbChamps, 0, $effacer->getHTML($this->modeTbl).$v_str);
}
break;
}
//debug("form.class: 109: modeVERTICAL:champ valider inexistant!!");
break;
case LIBRE:
/* LES CHAMPS EN MODE LIBRE SONT DIRECTEMENT ECRITS A L'APPEL DE LEUR METHODE WRITEHTML() (writeHTML efface la var d'instance HTML de class Champ); contrôle des eventuels "oublis" dans le script avant de fermer le formulaire avec </form>*/
for($i=0; $i < $this->nbChamps; $i++) {
if($mode==1) // retourner (0) ou ecrire (1)
$this->champs[$i]->writeHTML($this->modeTbl);
else
$this->HTML .= "<br>".$this->champs[$i]->getHTML($this->modeTbl);
}
break;
default:
break;
}
}
/* ----- partie publique ----- */
/*!
@method getHTML
@abstract mode LIBRE. pour obtenir le code HTML du formulaire. utilisée en mode LIBRE.
@discussion (description)
*/
function getHTML() {
$html = $this->HTML;
$this->HTML = "";
return $html;
}
/*!
@method ajouterChamp
@abstract Pour ajouter un champ au formulaire. inutile en mode LIBRE.
#champ: variable de type Object.Champ. Passage par référence, si l'objet Champ est modifier par une de ses méthodes apres l'ajout, la modification est reportee dans l'objet Formulaire conteneur.
@discussion TODO ajout multiple.
*/
function ajouterChamp(&$champ) {
$this->champs[] =& $champ;
$this->nbChamps = count($this->champs);
}
/*!
@method fin
@abstract Afficher le formulaire. nécessaire pour obtenir le code complet du formulaire HTML.
#mode: 0|1 mode de retour du code HTML | 0 | retourner sur une variable sous la forme d'une chaine de caracteres | 1 | ecrire directement sur l'output (echo PHP)
@discussion (description)
*/
function fin($mode=0) { // $mode pour retourner le code HTML (0) ou ecrire directement sur l'output (1)
// affichage des champs INPUT du formulaire
$this->fin_champs($mode);
// fermeture du tableau et affichage reel du formulaire en HTML.
if($this->modeTbl != LIBRE)
$this->HTML .= $this->tbl->fin(1);
$this->HTML .= "</FORM>";
if($mode != 0)
echo stripslashes($this->HTML);
else
return $this->HTML;
$this->HTML = "";
}
}
class Champ
{
var $libelle, $desc;
var $actif; // pour la visibilité du champ
var $chParents, $chEnfants;
var $type, $nom, $valeur;
var $js;
var $HTML;
function Champ ($libelle, $type, $nom, $valeur, $desc, $actif=TRUE) {
$this->libelle = $libelle;
$this->type = $type;
$this->nom = $nom;
$this->valeur = $valeur;
$this->desc = $desc;
$this->actif = $actif;
}
/*---- partie Privée ----*/
// ajoute un champ dont dependra le champ courant
function addParent(&$champ) {
$this->chParents[] = $champ;
// si un champ parent est actif, activer le champ courant, sinon le desactiver
for($i=0; $i < count($this->chParents); $i++) {
if($this->chParents[$i]->actif) {
$this->activer();
return;
}
}
$this->desactiver();
}
// setInput redefinie dans les sous-classes spécialisées
function setInput() {
return "";
}
function setHTML($modeTbl,$classeForm="") {
/* ACTIF/INACTIF */
if($this->actif)
$input = $this->setInput();
else
$input = "<I>- champ indisponible -</I>";
// debug($input);
$tbl=1;
switch($modeTbl) {
case VERTICAL:
$tbl = new Tableau(1,2,"champ_input_vertical_$this->type");
$tbl->setOptionsArray(array("class" => $classeForm,
"HTML" => array("WIDTH" => "100%")));
$tblLibelle = new Tableau(2,1,"champ_input_vertical_".$this->type."_libelle");
$tblLibelle->setOptionsArray(array("HTML" => array("BORDER" => 0)));
$tblLibelle->setContenu_Cellule(0,0, $this->libelle,array("class" => "formulaire")); //libelle
$tblLibelle->setContenu_Cellule(1,0, $this->desc,array("class" => "formulaire")); //description du champ
$tbl->setContenu_Cellule(0,0, $tblLibelle->fin(1),array("HTML" => array("WIDTH" => "50%")));
$tbl->setContenu_Cellule(0,1, $input);
break;
case HORIZONTAL:
$tbl = new Tableau(3,1,"champ_input_horizontal_$this->type");
$tbl->setOptionsArray(array("class" => $classeForm,
"HTML" => array("WIDTH" => "100%")));
$tbl->setContenu_Cellule(0,0, $this->libelle,array("class" => "formulaire"));
$tbl->setContenu_Cellule(1,0, $this->desc,array("class" => "formulaire"));
$tbl->setContenu_Cellule(2,0, $input);
break;
case LIBRE:
$tbl = new Tableau(1,2,"champ_input_libre_$this->type");
$tbl->setOptionsArray(array("class" => $classeForm));
$tbl->setContenu_Cellule(0,0, $this->libelle,array("class" => "formulaire"));
$tbl->setContenu_Cellule(0,1, $input);
break;
default:
break;
}
// debug("formulaire 222: tableau ::: ".$tbl->fin(1));
$this->HTML .= $tbl->fin(1);
}
/*---- partie publique ----*/
// ajoute un champ qui dependra du champ courant
function addEnfant(&$champ) {
$this->chEnfants[] = $champ;
for($i=0; $i < count($this->chEnfants); $i++) {
$this->chEnfants[$i]->addParent($this);
}
if($this->actif) $this->activer(); // pour activer les champs dépendant du champ courant
}
// note: variable $this->js a exploiter dans la fonction setInput() pour ajouter un script javascr. au champ input
function setJS($js="") {
$this->js = $js;
}
function activer() {
$this->actif = TRUE;
// par la notion enfants, il faut activer tous les champs qui dépendent du champ courant
for($i=0; $i < count($this->chEnfants); $i++) {
$this->chEnfants[$i]->activer();
}
}
function desactiver() {
$this->actif = FALSE;
for($i=0; $i < count($this->chEnfants); $i++) {
$this->chEnfants[$i]->desactiver();
}
}
function writeHTML($modeTbl,$classeForm=NULL) {
$this->setHTML($modeTbl,$classeForm);
echo $this->HTML;
$this->HTML = "";
}
function getHTML($modeTbl,$classeForm=NULL) {
// debug("getHTML: ".$this->type);
$this->setHTML($modeTbl,$classeForm);
$HTML = $this->HTML;
$this->HTML = "";
return $HTML;
}
}
class ChampTexte extends Champ
{
var $taille;
var $tailleMax;
function ChampTexte ($nom, $libelle, $desc, $taille, $tailleMax=NULL, $valeurParDefaut="", $actif=TRUE) {
$this->Champ($libelle, "TEXT", $nom, $valeurParDefaut, $desc, $actif);
$this->taille = $taille;
$this->tailleMax = $tailleMax;
}
/* privé */
function setInput() {
if(!isset($this->tailleMax)) $tMax = "";
else $tMax = " MAXLENGTH='".$this->tailleMax."'";
$input = "<INPUT TYPE='".$this->type."' NAME='".$this->nom."' SIZE='".$this->taille."' VALUE=\"".$this->valeur."\"".$tMax.">";
return $input;
}
}
class ChampPassword extends ChampTexte
{
function ChampPassword ($nom, $libelle, $desc, $taille, $tailleMax=NULL, $actif=TRUE) {
$this->ChampTexte ($nom, $libelle, $desc, $taille, $tailleMax, "", $actif);
$this->type = "PASSWORD";
}
function setInput() {
$input = parent::setInput();
$input .= "<BR><I>Confirmation du mot de passe:</I><BR>";
$this->nom .= "_confirm";
$input .= parent::setInput();
return $input;
}
}
class ChampCache extends Champ
{
function ChampCache ($nom, $valeur, $actif=TRUE) {
$this->Champ("", "HIDDEN", $nom, $valeur, "", $actif);
}
function setInput() {
return "<INPUT NAME = '".$this->nom."' TYPE='".$this->type."' VALUE=\"".$this->valeur."\">";
}
}
class ChampValider extends Champ
{
var $img;
function ChampValider ($libelle, $desc="", $img=NULL) {
$this->Champ ("", "SUBMIT", $libelle, $libelle, $desc, TRUE);
$this->img = $img;
}
function setInput() {
if($this->img) $img = " SRC=\"".$this->img."\"";
else $img="";
return "<INPUT TYPE='".$this->type."' NAME='boutonValider' VALUE=\"".$this->valeur."\"".$img.">";
}
}
class ChampEffacer extends Champ
{
var $img;
function ChampEffacer ($libelle, $desc="", $img=NULL) {
$this->Champ ("", "RESET", $libelle, $libelle, $desc, TRUE);
$this->img = $img;
}
function setInput() {
if($this->img) $img = " SRC\"".$this->img."\"";
else $img ="";
return "<INPUT TYPE='".$this->type."' NAME='boutonEffacer' VALUE=\"".$this->valeur."\"".$img.">";
}
}
class ChampCoche extends Champ // par défaut, le type de champ est RADIO!
{ //$type est RADIO | CHECKBOX
var $checked;
function ChampCoche ($type = "RADIO", $groupe, $valeur, $libelle, $desc, $checked=FALSE, $actif=TRUE) {
$this->Champ ($libelle, $type, $groupe, $valeur, $desc, $actif);
$this->checked = $checked;
}
function setInput() {
if($this->checked) $chk = "CHECKED";
else $chk = '';
return "<INPUT TYPE='".$this->type."' NAME='".$this->nom."' VALUE=\"".$this->valeur."\" ".$chk.">";
}
}
class ChampGroupe extends Champ
{
var $champs; // tableau de champs radio du meme groupe
var $groupe; // nom du groupe rassemblant les champs radio
function ChampGroupe ($libelle, $desc, $groupe, $champs=array(), $actif=TRUE) {
$this->Champ ($libelle, "CHAMP_GROUPE", "", "", $desc, $actif);
// affecter les champs au groupe, verification de la correspondance du groupe entre les champs et le groupe désiré
$this->groupe = $groupe;
$n=0;
for($i=0; $i < count($champs); $i++) {
if($this->groupe == $champs[$i]->nom) {
$this->champs[$n++] =& $champs[$i];
$this->addEnfant($champs[$i]);
}
}
}
function setInput() {
$tbl = new Tableau(count($this->champs), 1,"champ_input_$this->type");
$modeTbl = LIBRE;
for($i=0; $i < count($this->champs); $i++)
$tbl->setContenu_Cellule($i, 0, $this->champs[$i]->getHTML($modeTbl));
$tbl->setOptionsArray(array("HTML" => array("WIDTH" => "100%",
"ALIGN" => "CENTER")));
return $tbl->fin(1);
}
}
class ChampSelect extends Champ{
var $choix;
var $selected;
var $taille;
function ChampSelect ($nom, $libelle, $desc, $choix=array(), $taille=3, $selected=NULL, $actif=TRUE) { // $selected prend la valeur du choix a selectionner
$this->choix = $choix;
$this->selected = $selected;
$this->taille = $taille;
$this->Champ($libelle, "SELECT", $nom,"", $desc, $actif);
}
function setInput() {
$html = "<".$this->type." NAME='".$this->nom."' SIZE=".$this->taille.">\n";
foreach($this->choix as $nom => $valeur) {
if($this->selected == $valeur)
$s = "SELECTED";
else $s="";
$html .= "<OPTION VALUE='$valeur' $s>$nom\n";
}
$html = $html."</$this->type>\n";
//debug("ChampSelect:setInput");
return $html;
}
}
class ChampAireTexte extends Champ {
var $cols,$rows;
function ChampAireTexte ($nom, $libelle, $desc, $cols, $rows, $vPDefaut="", $actif=TRUE) {
$this->Champ ($libelle, "TEXTAREA", $nom, $vPDefaut, $desc, $actif);
$this->cols = $cols;
$this->rows = $rows;
}
function setInput() {
return "<$this->type NAME='".$this->nom."' COLS=".$this->cols." ROWS=".$this->rows.">$this->valeur</$this->type>\n";
}
}
class ChampFile extends Champ {
var $maxfilesize;
var $tailleChamp;
function ChampFile ($nom, $libelle, $desc, $maxfilesize=NULL,$tailleChamp=20, $actif=TRUE) {
$this->Champ ($libelle, "FILE", $nom, "", $desc, $actif);
$this->maxfilesize = $maxfilesize;
$this->tailleChamp = $tailleChamp;
}
function setInput() {
if(isset($this->maxfilesize)) $html="<INPUT TYPE='HIDDEN' NAME='MAX_FILE_SIZE' VALUE='".$this->maxfilesize."'>";
return @$html."<INPUT TYPE='".$this->type."' SIZE='".$this->tailleChamp."' NAME='".$this->nom."'>";
}
}
}
?>