Bonjour, voila aujourd'hui j'ai réaliser une petite class pour gérer les formulaire en PHP, elle est pas trés poussé mais j'aimerai le faire mais pour cela me faudra des avis, et des choses a améliorer, voici le code de la class:

        <?php
class Form{
    private $method;
    private $action;
    private $data;

    public function __construct($method,$action,$data = array()){
        $this->method = $method;
        $this->action = $action;
        echo '<form method="'.$this->method.'" action="'.$this->action.'">';
        $this->data = $data;
    }
    public function input($type,$name,$prop = null){
        echo '<input type="'.$type.'" name="'.$name.'" value="'.$this->getValue($name).'" '.$this->getProp($prop).'>';
    }
    public function select($name,$option = array()){
        echo '<select name="'.$name.'">';
        foreach ($option as $op) {
            $convert = explode(';', $op);
            return '<option value="'.$convert[0].'">'.$convert[1].'</option>';
        }
        echo '</select>';
    }
    public function getProp($index){
        $prop = explode(';', $index);
        if($prop[0] == "c"){
            return 'class="'.$prop[1].'"';
        } else if($prop[0] == "i"){
            return 'id="'.$prop[1].'"';
        } else {
            return null;
        }
    }
    public function getValue($index){
        return isset($this->data[$index]) ? $this->data[$index] : null;
    }
    public function submit($value = null, $prop = null){
        $value = (is_null($value)) ? 'Envoyer' : $value;
        return '<input type="submit" value="'.$value.'" '.$this->getProp($prop).'>';
    }

    public function end(){
        return '</form>';
    }

    }

Voici l'utilisation de la class:

    $form = new Form('POST', 'index.php', array('username' => 'Mehdi', 'pass' => '****'));
    $form->input('text', 'username', 'c;form-control');
    $form->input('password', 'pass', 'c;form-control');
    $form->select('host', array("serveur1;serv1", "serveur2;serv2"));
    $form->submit('Connexion', 'c;form-control');
    $form->end();

7 réponses


Salut,

Peux-tu nous montrer l'output de l'exemple s'il te plait, parce que ce n'est pas très explicite...

salut,
Ce n'est pas vraiment évident, comme il a dit "Forever", il mieux de montrer un petit output et d'ajouter une petite doc pour mieux s'y retrouver.

voici un petit essay que j'ai fais:
Form.php :

<?php
/**
*class Form
*permet de créer un formulaire plus vite et simplement
*/
class Form
{
    /**
    *@var array données utilisées par le formulaire
    */
    private $data   = array();

    /**
    *@var string la méthode utilisée par le formulaire
    */
    private $method = "POST";

    /**
    *@var string la page cible du formulaire
    */
    private $target     = "#";

    /**
    *@var int permet d'incrimenter l'id donné aux label du formulaire
    */
    private static $idInput = 0;

    /**
    *@param array $data données utilisées par le formulaire
    *@param string $method la méthode utilisée par le formulaire
    *@param string $target la page cible du formulaire
    */
    public function __construct($data = array(), $method = "POST", $target = "#")
    {
        if ($data != null) 
        {
            $this->data     = $data;
            $this->method   = $method;
            $this->target   = $target;
            $this->createForm();
        }

    }

    /**
    *permet de générer le formulaire
    */
    public function createForm()
    {       
?>
        <form action="<?php echo $this->target; ?>" method="<?php echo $this->method; ?>">
        <?php foreach($this->data as $input)
                {
        ?>  
                    <label for="<?php echo 'input'.self::$idInput; ?>"><?php echo $input['label'] ?></label>
                    <input type='<?php echo $input['type'] ?>' name="<?php echo $input['name'] ?>" id="<?php echo 'input'.self::$idInput;   self::$idInput++; ?>" /> </br>
        <?php
                } 
        ?>  
            <button type="submit">Envoyer</button>
        </form>
<?php
    }

    /**
    *@param array $data données utilisées par le formulaire
    */
    public function setInput($data)
    {
        $this->data[] = $data;
    }

    /**
    *@param string $method la méthode utilisée par le formulaire
    */
    public function setMethod($method)
    {
        $this->method = $method;
    }

    /**
    *@param string $target la page cible du formulaire
    */
    public function setTarget($target)
    {
        $this->target = $target;
    }

    /**
    *permet de générer le formulaire
    */
    public function draw()
    {
        $this->createForm();
    }
}

et index.php :

        <?php

    require("Form.php");

    // création d'un formulaire directement avec une surcharge du constructeur de la class
    $login = new Form(array(
                                array(
                                'label' => 'Login',
                                'type' => 'text',
                                'name' => 'login'
                                ),
                                array(
                                'label' => 'Password',
                                'type' => 'password',
                                'name' => 'password'
                                )
                            ),
                        'POST',
                        '#'
                    );

    // création d'un formulaire vide (qui va etre terminé à l'aide des fonctions de la classe)

    $form2 = new Form();

    // ajouter un input de type text
    $form2->setInput( array(
                            'label' => 'Email',
                            'type' => 'text',
                            'name' => 'email'
                        )
                    );

    // ajouter un input de type password
    $form2->setInput( array(
                            'label' => 'Password',
                            'type' => 'password',
                            'name' => 'password'
                        )
                    );

    // ajouter un input de type checkbox
    $form2->setInput( array(
                            'label' => 'Accepter les termes du contrat.',
                            'type' => 'checkbox',
                            'name' => 'okContrat',

                        )
                    );

    // définir la page cible du formulaire
    $form2->setTarget('index.php');

    // définir la méthode du formulaire
    $form2->setMethod('POST');

    // générer le formulaire
    $form2->draw();

ce qui va générer le code html suivant :

    <form action="#" method="POST">

            <label for="input0">Login</label>
            <input type='text' name="login" id="input0" /> </br>

            <label for="input1">Password</label>
            <input type='password' name="password" id="input1" /> </br>

            <button type="submit">Envoyer</button>
        </form>
        <form action="index.php" method="POST">

            <label for="input2">Email</label>
            <input type='text' name="email" id="input2" /> </br>

            <label for="input3">Password</label>
            <input type='password' name="password" id="input3" /> </br>

            <label for="input4">Accepter les termes du contrat.</label>
            <input type='checkbox' name="okContrat" id="input4" /> </br>

            <button type="submit">Envoyer</button>
        </form>

Alors plusieurs points ;)

Tu affiches un echo dans ton constructeur :/
Utilises plutôt des méthodes privées qui vont retourner la fonction pour démarrer le formulaire, ça sera plus propre.

Avec les echo toujours, n'en affiches aucun, fais des retours plutôt et affiches les quand tu en as besoin.

Ensuite petit conseil, tu passes par des tableaux, c'est une bonne idée. Mais :

$form2->setInput( array(
                            'label' => 'Accepter les termes du contrat.',
                            'type' => 'checkbox',
                            'name' => 'okContrat',

                        )
                    );

ne serait-il pas plus simple en faisant :

$attributes = array('class' => 'ma_classe_css', 'placeholder' => 'mon placehorder');
$form2->setInput('okContrat', 'checkbox', 'Accepter les termes du contrat', $attributes = array()); ?

Parce que l'utilité d'une classe c'est de taper moins de code, et avec ta classe au final on ne gagne pas plus de temps qu'en tapant le code html direct :/

Ou même sépare le label de l'input (dans certains cas les labels seront optionnels).

Hello MehdiWEB,

Voici mon avis :

  • $method et $action ne doivent pas selon moi être des propriétés de ta classe, car elles ne sont réutilisées nulle part dans ta classe
  • éviter le echo dans le construct, supprimer le construct et créér une méthode "create" ou "open" qui aurait les même paramètres que ton constructeur actuel
  • faire un return et non un echo dans les méthodes input() et select() comme tu le fais déjà dans end() et submit();
  • utiliser sprintf pour générer le html

Ebauche avec le sprintf :

<?php 

/**
* Form
*/
class Form {

  private $tag = [
    'open'   => '<form %s>',
    'input'  => '<input name="%s" %s>',
    'button' => '<button %s>%s</button>',
    'close'  => '</form>'
  ];

  private $data = [];

  public function create($data = [], $options = []){
    $attributes = $this->getAttributes($options);
    $html = sprintf($this->tag['open'], $attributes);
    return $html;
  }

  public function input($name, $options = []){    
    $attributes = $this->getAttributes($options);
    $html = sprintf($this->tag['input'], $name, $attributes);    
    return $html;
  }

  private function getAttributes($options){
    $attributes = '';
    foreach( $options as $key => $value) {
      $attributes .= "$key=\"$value\"";
    }    
    return $attributes;
  }

  public function end($submit = 'Envoyer'){
    $options = ['type' => 'submit'];
    $attributes =  $this->getAttributes($options);
    $html = sprintf($this->tag['button'], $attributes, $submit);
    $html .= sprintf($this->tag['close']);
    return $html;
  }  

}

$form = new Form();
echo $form->create();
echo $form->input('test', ['class' => 'ok']);
echo $form->end();

?>