Besoin d'avais sur ma classe formulaire - Siko - 14-12-2009
Voila j'ai crée ma propre classe de formulaire, elle n'est pas tout a fait fini mais l'essentiel est déjà présent, et j'aurais besoin d'un avis pour savoir ce qui ne va pas dedans :]
Code PHP : <?php
/**
* Description of form
*
* @author Siko
*/
class fcl_form {
/**
*
* Liste les élements autoriser
*/
private $allowElementsList = array(
'hidden' => '',
'reset' => '',
'checkbox' => '',
'file' => '',
'password' => '',
'radio' => '',
'button' => '',
'submit' => '',
'select' => '',
'text' => '',
'textarea' => '',
'advcheckbox' => '',
'date' => ''
);
/**
*
* Liste des elements appartenant au formulaire
*/
public $elementsList = array();
/**
*
* Liste des parametres autoriser pour un element de formulaire
*/
private $allowElementParams = array (
'text' => array ('value' => '',
'name' => '',
'alt' => '',
'tabindex' => '',
'accesskey' => '',
'readonly' => '',
'disabled' => '',
'width' => '',
'maxlength' => '',
'id' => ''),
'button' => array ('name' => '',
'value' => '',
'alt' => '',
'tabindex' => '',
'accesskey' => '',
'disabled' => ''),
'hidden' => array ('name' => '',
'value' => '',
'alt' => '',
'disabled' => ''),
'password' => array ('name' => '',
'value' => '',
'alt' => '',
'tabindex' => '',
'accesskey' => '',
'readonly' => '',
'disabled' => '',
'width' => '',
'maxlength' => ''),
'submit' => array ('name' => '',
'value' => '',
'alt' => '',
'tabindex' => '',
'accesskey' => '',
'disabled' => ''),
'checkbox' => array ('checked' => '',
'option' => '',
'disabled' => ''),
'radio' => array ('name' => '',
'value' => '',
'alt' => '',
'tabindex' => '',
'accesskey' => '',
'disabled' => '',
'checked' => '',
'title' => ''),
'reset' => array ('name' => '',
'class' => '',
'value' => '',
'alt' => '',
'tabindex' => '',
'accesskey' => '',
'disabled' => '',
'title' => ''),
'file' => array ('name' => '',
'value' => '',
'alt' => '',
'tabindex' => '',
'accesskey' => '',
'disabled' => '',
'accept' => ''),
);
/**
*
* Liste des validator autoriser pour un element de formulaire
*/
private $allowValidatorList = array (
'lenght' => array(),
'email' => null,
'required' => null
);
/**
*
* Parametre accepter et valeur par default
* pour un formulaire.
*/
private $formParams = array (
'name' => '',
'method' => 'post',
'action' => '',
'id' => 'mainForm',
'enctype' => 'application/x-www-form-urlencoded',
'accept' => '',
'onsubmit' => '',
'onreset' => '',
'accept-charset' => 'utf-8',
'style' => ''
);
/**
*
* Attribut du formulaire
*/
private $formAttributes = array();
/*
*
* Erreur rencontrer lors de la validation
*/
private $validationError = null;
/**
*
* Constructeur, définit un nouveau formulaire
*
* @param array $params [name,method,action,id',enctype,accept,onsubmit,onreset,accept-charset,style]
*
*/
public function __construct ($params)
{
foreach ($this->formParams as $key => $value)
{
if (array_key_exists ($key, $params))
$this->formAttributes[$key] = $params[$key];
else if (!empty ($value))
$this -> formAttributes[$key] = $value;
}
}
/**
* Ajoute un element au formulaire
*
* @param string $type Type de l'element
* @param string $name Nom de l'element
* @param string $label Label de l'element
* @param array $params Voir $allowElementParams pour les paramètres autoriser selon le type
*/
public function addElement($type,$name,$label,$params = array())
{
// Si le type est autoriser on crée l'element
if(!array_key_exists($type,$this->allowElementsList))
die('Le type choisi n\'est pas valable pour l\'element '.$name);
$this->elementsList[$name] = array(
'type' => $type,
'name' => $name,
'label' => $label,
);
foreach($params as $key => $value)
{
if(array_key_exists($key,$this->allowElementParams[$type]))
$this->elementsList[$name]['params'][$key] = $value;
else
die('Le parametre '.$key.' n\'est pas valable pour l\'element '.$name);
}
}
/**
* Ajoute un validateur a un element formulaire
*
* @param string $type Type du validateur
* @param string $element Nom de l'element qui sera validé
* @param string $message Message afficher si la condition de validation n'est pas remplis
* @param array $params Paramètre du validateur pour certain type uniquement
*/
public function addValidator($type,$element,$message,$params = null)
{
if(!array_key_exists($element,$this->elementsList))
die('L\element '.$element.' n_existe pas !');
if(array_key_exists($type,$this->allowValidatorList))
{
if(is_array($this->allowValidatorList[$type]) && is_null($params))
die('On attend un tableau en tant que parametre');
elseif(!is_null($this->allowValidatorList[$type]) && !is_array($this->allowValidatorList[$type]))
die('On attend un parametre');
$this->elementsList[$element]['validator'][$type] = array('params' => $params, 'message' => $message);
}
else
die($type.' n\'est pas un validator correct');
}
/**
* Teste si le formulaire est valide
*
* @return array/null Erreurs
*/
public function isValid()
{
if(empty($_POST) && empty($_GET))
die('Impossible de valider un formulaire qui n\'as pas été envoyer');
foreach($this->elementsList as $elementKey => $elementValue)
{
if(isset($elementValue['validator']))
{
foreach($elementValue['validator'] as $key => $value)
{
$validator = 'valid'.ucwords($key);
if(!$this->$validator($_POST[$elementKey],$value['params']))
$this->validationError[] = $value['message'];
}
}
}
return $this->validationError;
}
/**
* Remplace la valeur par defaut de l'element
*
* @param string $element Nom de l'element a modifier
* @param mixed $value Valeur par defaut
*/
public function setValue($element,$value)
{
$this->elementsList[$element]['params']['value'] = $value;
}
/**
* Remet automatiquement les values envoyez a tavers les variables Post dans les éléments
*/
public function setPostValue()
{
if(isset($_POST))
{
foreach($this->elementsList as $key => $value)
{
if(!empty($_POST[$key]) && $value['type'] != 'password')
$this->setValue($key, $_POST[$key]);
}
}
}
/**
*
* Génère le code html du formulaire
*
* @return Code html
*/
public function render()
{
$form = '<form ';
foreach($this->formAttributes as $key => $value)
$form .= $key.'="'.$value.'" ';
$form .= '>';
foreach($this->elementsList as $key => $value)
{
$render = 'render'.ucwords($value['type']);
$form .= '<p>';
$form .= $this->$render($value);
$form .= '</p>'."\n";
}
$form .= '</form>';
return $form;
}
/*
* Ensemble de fonctions génerant les élements du formulaire
*/
private function renderText($attribute)
{
$return = '<label for="'.$attribute['name'].'">'.$attribute['label'].'</label> : ';
$return .= '<input type="text" ';
$return .= 'id="'.$attribute['name'].'" name="'.$attribute['name'].'" ';
if(isset($attribute['params']))
{
foreach($attribute['params'] as $key => $value)
$return .= $key.'="'.$value.'" ';
}
$return .= '/>';
return $return;
}
private function renderButton($attribute)
{
$return = '<label for="'.$attribute['name'].'">'.$attribute['label'].'</label> : ';
$return .= '<input type="button" ';
$return .= 'id="'.$attribute['name'].'" name="'.$attribute['name'].'" ';
if(isset($attribute['params']))
{
foreach($attribute['params'] as $key => $value)
$return .= $key.'="'.$value.'" ';
}
$return .= '/>';
return $return;
}
private function renderHidden($attribute)
{
$return = '<input type="hidden" ';
$return .= 'id="'.$attribute['name'].'" name="'.$attribute['name'].'" ';
if(isset($attribute['params']))
{
foreach($attribute['params'] as $key => $value)
$return .= $key.'="'.$value.'" ';
}
$return .= '/>';
return $return;
}
private function renderPassword($attribute)
{
$return = '<label for="'.$attribute['name'].'">'.$attribute['label'].'</label> : ';
$return .= '<input type="password" ';
$return .= 'id="'.$attribute['name'].'" name="'.$attribute['name'].'" ';
if(isset($attribute['params']))
{
foreach($attribute['params'] as $key => $value)
$return .= $key.'="'.$value.'" ';
}
$return .= '/>';
return $return;
}
private function renderSubmit($attribute)
{
$return = '<input type="submit" ';
$return .= 'id="'.$attribute['name'].'" ' ;
if(isset($attribute['params']))
{
foreach($attribute['params'] as $key => $value)
$return .= $key.'="'.$value.'" ';
}
$return .= '/>';
return $return;
}
private function renderCheckbox($attribute)
{
$return = $attribute['label'].' : ';
foreach($attribute['params']['option'] as $key => $value)
{
$return .= '<input type="checkbox" name="'.$key.'" value="'.$value.'" ';
if(isset($attribute['params']['checked']))
if(in_array($key,$attribute['params']['checked']))
$return .= 'checked="true" ';
if(isset($attribute['params']['disabled']))
if(in_array($key,$attribute['params']['disabled']))
$return .= 'disabled="true" ';
$return .= '/> ';
}
return $return;
}
private function renderRadio($attribute)
{
$return = '';
foreach($attribute['params']['option'] as $key => $value)
{
$return .= $key.' : ';
$return .= '<input type="radio" ';
$return .= 'id="'.$key.'" name="'.$attribute['name'].'" value="'.$value.'" ';
if(isset($attribute['params']['checked']))
if(in_array($key,$attribute['params']['checked']))
$return .= 'checked="true" ';
if(isset($attribute['params']['disabled']))
if(in_array($key,$attribute['params']['disabled']))
$return .= 'disabled="true" ';
$return .= '/> ';
}
return $return;
}
/*Todo : Changer ce merdier*/
private function renderSelect($attribute)
{
$return = '';
foreach($attribute['params']['option'] as $key => $value)
{
$return .= $key.' : ';
$return .= '<input type="radio" ';
$return .= 'id="'.$key.'" name="'.$attribute['name'].'" value="'.$value.'" ';
if(isset($attribute['params']['checked']))
if(in_array($key,$attribute['params']['checked']))
$return .= 'checked="true" ';
if(isset($attribute['params']['disabled']))
if(in_array($key,$attribute['params']['disabled']))
$return .= 'disabled="true" ';
$return .= '/> ';
}
return $return;
}
private function renderReset($attribute)
{
$return = '<input type="reset" ';
$return .= 'id="'.$attribute['name'].'" value="'.$attribute['label'].'" ' ;
if(isset($attribute['params']))
{
foreach($attribute['params'] as $key => $value)
$return .= $key.'="'.$value.'" ';
}
$return .= '/>';
return $return;
}
private function validEmail($email)
{
if (preg_match('`^[[:alnum:]]([-_.]?[[:alnum:]])+_?@[[:alnum:]]([-.]?[[:alnum:]])+\.[a-z]{2,6}$`',$email))
return true;
else
return false;
}
private function validLenght($string,$params)
{
$lenght = strlen($string);
if($lenght >= $params[0] && $lenght <= $params[1])
return true;
else
return false;
}
private function validRequired($string)
{
if(empty($string))
return false;
else
return true;
}
}
?>
Voila n'hésitez pas a me tailler, lyncher insulter si ca vous chante tant que c'est constructif et que ca peut m'aider :]
RE: Besoin d'avais sur ma classe formulaire - Roworll - 14-12-2009
Pas compris la question...
Tu veux un audit de tes sources actuelles ou tu as un soucis particulier (auquel cas, il serait bienvenu de donner plus d'infos sur le problème)
RE: Besoin d'avais sur ma classe formulaire - christouphe - 14-12-2009
j'adoooore lire une classe de 200 lignes...Surtout avec 2 lignes d'explications autour...
RE: Besoin d'avais sur ma classe formulaire - Siko - 14-12-2009
Oui oui excusez moi je veut un audit de ma classe, c'est un des premières classe que je crée et donc je pense que y'a pas mal de défauts dedans :]
RE: Besoin d'avais sur ma classe formulaire - NicoMSEvent - 14-12-2009
pourquoi coder une classe avec tout ça, et pas une table(avec des contraintes) dans une base de donnée?
Par exemple :
Code : private $allowElementParams = array (
'text' => array ('value' => '',
'name' => '',
'alt' => '',
'tabindex' => '',
'accesskey' => '',
'readonly' => '',
'disabled' => '',
'width' => '',
'maxlength' => '',
'id' => ''),
'button' => array ('name' => '',
'value' => '',
'alt' => '',
'tabindex' => '',
'accesskey' => '',
'disabled' => ''),
value,name et alt vont se retrouver (presque) partout. Dans une BDD, avec un enum du ne défini qu'une fois cela, et avec quelques contraintes, tu pourrais limiter les valeurs selon le type d'input que tu as choisi.
(déja, je verrais une classe générique "input" avec comme classe dérivées les différents type d'"input" c-à-d : texte, password, fichier, ...)
Enfin bon, c'est mon avis... tu as p-e tes raisons d'avoir choisi d'implémenter ça directement dans PHP, moi il me semble que c'est plus naturel de déclarer ces données dans une base de données (d'où ce nom, justement! ^^)
RE: Besoin d'avais sur ma classe formulaire - My Hotel - 14-12-2009
Je suis désolé, j'ai pas lu, trop long
Mais bon, quand je vois dès le début des arrays de 70 lignes, je me dis quand même : y'a pas moyen de faire plus simple? C'est pas un peu lourd quand même?
Pour un truc comme ça, je sais d'ailleurs pas pourquoi tu l'as codée toi-même. C'est assez inutile, sachant qu'il en existe de très bonne sur le web : comme par exemple http://www.siteduzero.com/forum-83-457000-p1-lib-php-la-kovacouform-en-version-2-0.html, que j'utilise, mais google t'en indiquera d'autres.
Donc, sinon, je n'ai pas bien lu ton code, en tout cas c'est propre, bien indenté, c'est un bon point Après, on peut toujours discuter de l'intérêt de ce genre de méthodes : Code PHP : <?php
private function validRequired($string)
{
if(empty($string))
return false;
else
return true;
}
A mon gout, c'est redondant if(validRequired($string)) au lieu de if(!empty($string)), c'est même plus long!
Voilà, à mon humble avis, tu ne devrais pas perdre du temps pour ton jeu à coder ce genre de chose, attaques toi à l'essentiel, puis après tu peaufineras des trucs du genre.
Bye
P.S : les beaux commentaires phpcod, c'est bien, mais sans fautes, c'est mieux : "Liste des validator autoriser pour un element de formulaire"... On dit autorisés
RE: Besoin d'avais sur ma classe formulaire - Siko - 16-12-2009
Merci, a tous désolé pour les deux premiers message mais j'avais pas tellement de temps (j'étais en cour avec le prof qui passait toutes les 30sec dérrière moi :] )
@MyHotel, j'ajoute des validateurs lors de la création de mon formulaire, ensuite je n'ai plus qu'a utiliser isValid, pour savoir si mon formulaire a bien été rempli correctement. Si tu regarde bien tu remarquera que validRequired est private.
Pour la mise en place en bdd, je vois pas tellement l'intérêt, sachant qu'une fois les données récupérer je vais me retrouver avec a peu près le même array, donc autant éviter la connexion. Et c'est plus facile a mettre en place comme ca je pense pas besoin de crée de table, si je change de projets.
Je pense que ma prochaine étapes va être de scinder la classe, en mettant les validators dans une même classe, les renders aussi.
L'etapes suivante sera de mettre en place des validateurs javascript aussi :]
RE: Besoin d'avais sur ma classe formulaire - My Hotel - 16-12-2009
OK, je comprends la logique, la seule chose que je comprends pas c'est : pourquoi tu codes ça toi-même, sachant qu'il en existe toutes les variantes possibles, et même plus, sur le web?
Sinon, bonne chance quand même pour ta classe.
RE: Besoin d'avais sur ma classe formulaire - NicoMSEvent - 16-12-2009
moi aussi je re-coderais ça, pour dire : "je l'ai fait moi même" (et puis, ça permet de bien cerner tous les aspect du développement)
Un bon point pour toi! Vérification coté client, mais aussi (et surtout) coté serveur!
RE: Besoin d'avais sur ma classe formulaire - Siko - 17-12-2009
Bien sur, le javascript c'est pour faire plaisir au kikoo qui vont faire wahou sont fort chez siko il verifie avant que j'envoie :o
En fait la classe de formulaire c'est parce que moment j'ai que ca a faire, et que ca me permet de bosser sur des classes, et plus bosser avec des classes seulement.
|