Salut tout le monde, j'ai créé une petite classe de création de formulaires et j'aimerais avoir quelques retour afin de l'améliorer (J'avais ouvert un sujet sur le forum php car je n'avais pas vu le forum créaations. J'ai tout de même tenu compte des quelques remarques postées sur celui-ci).
Voici le lien github.
Si le readme n'est pas assez clair vous pouvez bien entendu me poser des questions ici mais la syntaxe est très facile.
Merci d'avance!
Hugo
Salut!
Je vois que tout le monde se fait sa petite class Form ^^ (je m'en suis fait une y a pas longtemps)
C'est assez simpliste pour le moment : tu peux générer des champs et c'est presque tout.
Pour te donner une idée, pour la mienne, j'ai rajouté la possibilité de passer un paramètre pour ajouter des classes CSS, de wrapper les éléments dans des balises (histoire d'avoir un HTML un brin plus propre), etc...
Évidemment, je l'ai pas sous la main, je me suis fait ça chez moi. Je te l'envoie dès que j'ai fini le boulot :)
Ta classe est super, le code est concis et simple ;)
Côté code, est-ce qu'il ne serait pas plus judicieux d'utiliser un "switch" plutôt d'une série de "if" "elseif" (je ne sais pas si cela impacterait au niveaux des performances, mais c'est aussi pour la lisibilité du code) ?
Merci à tous pour ces retours très encourageants!!! J'ai modifié la fonction end() et l'ai renommé en build() avec en plus une option pour afficher directement ou non le formulaire. J'ai aussi modifié les if() elseif() en switch. J'ai ensuite calculé le temps d'éxecution et voilà les résultats :
Ancienne version (celle actuellement sur github car pas encore mise à jour) : 0.0036039352416992 sec
Version actuelle : 0.0026218891143799 sec
Version actuelle minimifiée : 0.00203299522399 sec
Ne connaissant pas grand chose au fonctionnement interne de php, y'a-t-il quelqu'un pour me dire si ces résultats sont corrects et surtout s'il sont améliorables!
Au passage je met le nouveau code ici, vous semble-t-il plus lisible, logique, optimisé bref meilleur quoi! ?
<?php
/*
* Form class by hugopb82, enjoy!
* Fork me on github!
*/
class Form{
private $data = [];
private $end;
/*
* Set form attributes
* @param $data array form attributes
*/
public function __construct($data){
$this->data = is_array($data) ? $data : array('action' => $data);
}
/*
* Add an input in the form
* @param $type string type of the form field
* @param $name string name of the form field
* @param $label string label of the form field (default is $name)
* @param $options array attributes for the fields
* @return string final html code
*/
public function add($type, $name, $label = null, $options = null){
$label = !is_null($label) ? $label : ucfirst($name) . ' :';
switch($type){
case 'hidden':
case 'submit':
$attributes = $this->attributes($options);
$end = '<input type="' . $type . '" name="' . $name . '" '. ($type == 'submit' ? 'value=" ' . $label . ' "' : '') . ' ' . $attributes .' >';
break;
case 'textarea':
$attributes = $this->attributes($options);
$end = $this->label($label, '<textarea name="' . $name . '" ' . $attributes .' ></textarea>');
break;
case 'select':
$html = '<select name="' . $name . '">';
foreach($options as $k => $v){
if(is_array($options[$k])){
$attributes = '';
foreach($v as $k2 => $v2){
$attributes .= $k2 . '="' . $v2 . '" ';
}
$html .= '<option ' . $attributes . ' >' . $k . '</option>';
}else{
$html .= '<option>' . $v . '</option>';
}
}
$html .= '</select>';
$end = $this->label($label, $html);
break;
default:
$attributes = $this->attributes($options);
$end = $this->label($label, '<input type="' . $type . '" name="' . $name . '" ' . $attributes .' >');
break;
}
$this->end .= $end;
}
/*
* Build the final html code
* @return string final html code
*/
public function build($buffer = true){
$html = '<form ';
foreach($this->data as $k => $v){
$html .= $k . '="' . $v . '" ';
}
$html .= '>' . $this->end . '</form>';
if(!$buffer){
echo $html;
}else{
return $html;
}
}
/*
* Warp the input with a label
* @param $label string value of the label
* @param $input string html input code
* @return string final html code
*/
protected function label($label, $input){
return '<label>' . $label . $input . '</label>';
}
/*
* Get form attributes
* @param $options array associative array of form attributes
* @return string html attributes code
*/
protected function attributes($options){
$attributes = '';
if(!is_null($options) && is_array($options)){
foreach($options as $k => $v){
$attributes .= $k . '="' . $v . '" ';
}
}
return $attributes;
}
}
Merci d'avance
build()
juste après l'avoir instancié ?Ces nombres sont le temps d'execution de la page de test disponible sur github. Pour la minification, il est vrai que je ne voyais pas trop l'intérêt du coup je vais laisser tomber cette idée :)
Pour la fonction build tu peux garder le code en mémoire en faisant :
$code = $form->build();
Ou bien l'afficher directement en faisant :
$form->build(true);
Voilà, J'espère avoir répondu a tes questions :)
Hugo
Bonjour, j'ai reçu un message sur le forum d'OpenClassrooms concernant cette classe qui me disait que la meilleure syntaxe possible était celle la :
$form->add(new Textbox('Arg1','arg2'));
Je voulais savoir quelle était votre avis sur cette syntaxe, qui implique une reconstruction de a à z du code...
Merci d'avance!
Pour être pointilleux au max, il manque une parenthèse :p
$form->add(new Textbox('Arg1', 'arg2'));
Après, moi j'ai du mal avec cette syntaxe, créér des éléments directement dans une instance, c'est peut être mieux, mais j'aime pas.
Je pars du principe qu'il faut faire avec ce avec quoi tu es le plus à l'aise :)