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

8 réponses


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

hugopb82
Auteur

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

  • Sa ne veut pas dire grand chose ces nombres, c'est quoi ? Temps pour inclure la fonction ? Temps pour exécuter une tâche précise ?
  • Je connais personne qui minifie le PHP, sa le rend illisible et surtout sa sert à rien, parce que le code n'est pas envoyé au client (contrairement au HTML/CSS/JS).
  • Sa veut dire que si on veut 'render' directement, il faut appeler build() juste après l'avoir instancié ?
hugopb82
Auteur

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

hugopb82
Auteur

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 :)

hugopb82
Auteur

[Erreur corrigée]
Bon ben je laisserait les deux solutions... Merci!