JeuWeb - Crée ton jeu par navigateur
Besoin d'avais sur ma classe formulaire - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Besoin d'avais sur ma classe formulaire (/showthread.php?tid=4483)

Pages : 1 2


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... Wink


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 Smile
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 Wink 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 Wink


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? Smile

Sinon, bonne chance quand même pour ta classe. Wink


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.