voici la class
PHP
class FormBuilder implements IForm {
private $database;
private $dataOfMyObject = array();
private $view = '';
public function __construct($file = '', $mode='CLASSICAL', $action) {
$this->_mode = $mode;
$this->_action = $action;
if(!empty($file)) $this->parseFile($file);
}
public function setMode($mode) {
$this->_mode = $mode;
}
//methode pour affichage des données si modif
public function setView($view = 'add', $table, $id = NULL, $registry) {
$this->database = $registry['database'];
$this->view = $view;
switch ($this->view) {
case 'update' :
if((int)$id && (string)strtolower($table) ) { $this->getDataFromBdd($id, $table); }
break;
}
}
//recuperation des données en BDD
public function getDataFromBdd($id, $table) {
$sql = "SELECT * FROM $table WHERE id='$id'";
$this->dataOfMyObject = $this->database->getRows($sql);
}
public function build() {
if(!sizeof($this->_form)) return;
// the output
$str='';
if(!strcmp($this->_mode,self::mtable)) {$str.="<table>\n";}
foreach($this->_form as $forminfo) {
if(!is_array($forminfo)) continue;
$label = $forminfo['label'];
$data = $forminfo['data'];
if($data instanceof FormElement) {
if($data->isForm()) $str.=$data->build()."\n";
else {
$str.="\t";
if(!strcmp($this->_mode,self::mtable)) {
$str.="<tr><td>".$label."</td>";
$str.="<td>".$data->build()."</td></tr>\n";
}
else {
$str.=$label.' ';
$str.=$data->build();
// print as column (with a <br> tag)
if(!strcmp($this->_mode,self::mcolumn)) $str.='<br />';
$str.="\n";
}
}
}
}
if(!strcmp($this->_mode,self::mtable)) $str.="</table>\n";
$str.= FormElement::endForm()."\n";
return $str;
}
public function parseFile($file) {
$this->setFile($file);
$this->parseFormTag();
$this->parseElements();
}
public function addElement($type,$name,$param=array(),$opt=array(), $url='', $label='') {
$f = new FormElement($type, $name, $param, $opt, $url);
$this->_form[] = array('label'=>$label, 'data'=>$f);
}
public function startForm($url,$name='noName',$uparam=array(),$param=array()) {
$this->addElement('form', $name, $uparam, $param,$url);
}
private function parseElements() {
if(sizeof($this->_xml->elements->element)) {
foreach($this->_xml->elements->element as $el) {
$param = array();
$opt = array();
$type=isset($el["type"])?(string)$el["type"]:"";
$name=isset($el["name"])?(string)$el["name"]:"";
$label=isset($el["label"])?(string)$el["label"]:"";
if(sizeof($el->eparameter)) {
foreach($el->eparameter as $ep) {
$n=isset($ep["name"])?(string)$ep["name"]:"";
$v=isset($ep["value"])?(string)$ep["value"]:"";
if($n) $param[$n]=$v;
}
}
if(sizeof($el->eoption)) {
foreach($el->eoption as $eo) {
$eov = isset($eo["value"])?(string)$eo["value"]:"";
$eol = isset($eo["label"])?(string)$eo["label"]:"";
if($eov) $opt[$eov] = $eol;
}
}
$this->addElement($type,$name,$param,$opt,'',$label);
}
}
$this->addElement('submit','Valider',array('value'=>'Valider'));
}
private function parseFormTag() {
$fp = array(); //parametres du formulaire (method, name,...)
$fu = array('action'=> $this->_action); // parametres d'url
$furl = HTTP_SERVER_ADMIN . 'index.php'; // url d'envoi
$fname = ''; // nom
// va chercher les parametres du formulaire
if(sizeof($this->_xml->formparameters->fparameter)) {
foreach($this->_xml->formparameters->fparameter as $xfp) {
if(isset($xfp["name"])) {
// va chercher le nom du fomulaire
if(!strcmp('name',strtolower((string)$xfp["name"]))) $fname=(string)$xfp["value"];
else $fp[strtolower((string)$xfp["name"])]=(string)$xfp["value"];
}
}
}
// va chercher les parmetres d'url
if(sizeof($this->_xml->urlparameters->uparameter)) {
foreach($this->_xml->urlparameters->uparameter as $xup) {
if(isset($xup["name"])) {
// va chercher l'url
if(!strcmp('url',strtolower((string)$xup["name"]))) $furl=(string)$xup["value"];
else $fu[strtolower((string)$xup["name"])] = (string)$xup["value"];
}
}
}
// vérifications
if(!array_key_exists('method',$fp)) $fp['method']='post';
if(empty($furl)) $furl = PHPSELF;
if(empty($fname)) $fname='no_name';
// enregistre le formulaire
$this->addElement('form',$fname,$fu,$fp,$furl);
}
/* verifie que le xml existe et le charge */
private function setFile($file) {
if(file_exists(XMLDIR.$file.XMLEXT)) {
$this->_xmlfile=XMLDIR.$file.XMLEXT;
$this->_xml=simplexml_load_file($this->_xmlfile);
return;
}
throw new Exception('File : '.$file.' does not exist.');
}
}
Exemple d'utilisation :
PHP
require('form_xml/class_form.php');
try {
define('XMLDIR','form_xml/xmlforms/');
define('XMLEXT','.xml');
$f = new FormBuilder('actualite', 'TABLE', 'update');
$f->setView('update', 'actualites', (int)$id_actu, $this->registry);
$template->set('form', utf8_decode($f->build()) );
}
catch(Exception $e) { print($e->getMessage());
}
j'ai enlevé quelques lignes, la déclaration des variables etc...
voili voilou...