Page 1 sur 3

Formulaire avec OOP

Posté : 05 avr. 2011, 13:23
par rimie1
bonjour!

c'est quoi la meilleur methode d'avoir un formulaire, que l'on peut utiliser dans le site plusieurs fois, par exemple:

page1.php, on a besoin de 3 champs (nom, prenom, adresse);
page2.php, on a besoin de 2 champs (username et mot de passe);
page3.php, on a besoin de 7 champs (nom, prenom, adresse, mot de passe, confirmation mot de passe, adresse, email);

Alors a chaque fois on fait un formulaire ca prend du temps, est ce qu'il y a une methode de faciliter la tache, et on peut appeller les champs qu'on souhaitait afficher et utiliser.

merci

Re: Formulaire avec OOP

Posté : 05 avr. 2011, 14:05
par sadeq
Bonjour,

Effectivement on peut concevoir des formulaires modulables qui réutilisent d'autres modules sous-formulaires spécifiques.
Dans ton cas : le formulaire "page3.php" réutilise les sous-formulaires "page1.php" et "page2.php"

Techniquement sous php/html, on peut utiliser l'instruction include() pour placer un module de sous-formulaire comme ça:
page3.php
<html>
<body>
<form name="formulaire_general" method="post">
....  
 <?php  include("page1.php"); ?>
....
 <?php  include("page2.php"); ?>
..... autres champs
</form>
</body>
</html>
voici le contenu des sous-formulaires, par exemple, page1.php :
<p>Nom * <input name="nom" value="" /></p>
<p>Prénom * <input name="prenom" value="" /></p>
... autres champs
etc ...

Re: Formulaire avec OOP

Posté : 05 avr. 2011, 14:43
par rimie1
j'ai voulu les mettre en OOP, avec des classes, est ce que cette methode est bonne et si vous avez d'autres idees plus pratiques:
<?php
//include("class.form.php");


class Form {
	
	function name_field() {
		echo '<input type="text" name="name" id="name" size="30" maxlength="30" />';
	}
}

$frm = new Form;
$frm->name_field();
?>
<br />

<?php
class Formx {
	
	function name_fieldx( $name_fieldx) {
		echo $name_fieldx.' <input type="text" name="name" id="name" size="30" maxlength="30" />';
	}
}

$frmx = new Formx;
$frmx->name_fieldx('Name: ');
$frmx->name_fieldx('Nom: ');
?>

Re: Formulaire avec OOP

Posté : 05 avr. 2011, 14:51
par rimie1
est ce que je peux ajouter des attributs a <input..>, par exemple, mon input normal est:
<input type="text" name="name" id="name" size="30" maxlength="30" />
et lors de l'appel j'ajoute class='ma_class'

Re: Formulaire avec OOP

Posté : 05 avr. 2011, 19:48
par sadeq
Oui tu peux écrire la balise input complète mais tu ne pourras pas rajouter d'autres attributs au moment de l'include().

Re: Formulaire avec OOP

Posté : 06 avr. 2011, 03:26
par rimie1
et si je l'utilise comme ca:
<?php
class Formx {
       
        function name_fieldx( $name_fieldx) {
                echo $name_fieldx.' <input type="text" name="name" id="name" size="30" maxlength="30" />';
        }
}

$frmx = new Formx;
$frmx->name_fieldx('Name: ');
$frmx->name_fieldx('Nom: ');
?>
je peux ajouter d'autres attributs a input?

Re: Formulaire avec OOP

Posté : 07 avr. 2011, 05:28
par rimie1
et comment faire afin d'ajouter des attributs a mon formulaire:

input simple:
<input type="text" name="name" id="name" size="30" maxlength="30" />
j'aimerais l'appeller et a chaque fois je voudrais effectuer des changements, par exemple, ajouter une class:
<input type="text" name="name" id="name" size="30" maxlength="30" class="nom" />

Re: Formulaire avec OOP

Posté : 07 avr. 2011, 06:11
par moogli
salut,

Passe un tableau d'argument à ta méthode et traite ce tableau pour construire ton champ de formulaire :)


@+

Re: Formulaire avec OOP

Posté : 07 avr. 2011, 11:07
par rimie1
comme ca:
<?php
class Formxxx {
	
	function name_fieldxxx($name, $options, $value) {
		
		switch($type)
		{
			case 'text' :
			$this->addElement($name, array('type'=>'text','options'=>array('Size'=>'','Maxlength'=>'')), $value);
			break;
}
}
}

$frmxxx = new Formxxx;
$frmxxx->name_fieldxxx('le nom', 'les options', 'la valeur');

?>

Re: Formulaire avec OOP

Posté : 11 avr. 2011, 04:09
par rimie1
un autre essai, et me donne une erreur:

Warning: Missing argument 1 for Form::__construct(), called in form3.php on line 11
<?php
class Form {
	
	public $type;
    public $name;
    public $size;
    public $maxlength;
    public $id;
    public $class;
    
	public function __construct($type, $name, $size, $maxlength, $id, $class) {

        $this->type   		= $type;
        $this->name   		= $name;
       	$this->size 	 	= $size;
        $this->maxlength 	= $maxlength;
        $this->id  			= $id;
        $this->class   		= $class;
        }
		
		public function input_field()
		{
		echo '<input type="'.$type.'" name="'.$name.'" size="'.$size.'" maxlength="'.$maxlength.'" id="'.$id.'" class="'.$class.'" />';
		
		}    
	
}

$frm = new Form;
$frm->input_field('text', 'lenom', '30', '50', 'ids', 'classes');
?>
merci

Re: Formulaire avec OOP

Posté : 11 avr. 2011, 13:53
par sadeq
Non, il faut donner à chaque objet ses propriétés. Pour le FORM ses propres propriétés comme : name, action, method, ...
et pour le INPUT ses propriétés comme : name, id, type, value, onclick, onchange, ...

Correction:
<?php
class Form {
    // propriétés de Form
    public $name;
    public $method;
    public $action;

    // construction de l'objet Form
    public function __construct($name="", $method="get", $action="") { // aucun champ n'est obligatoire
       $this->name = $name;
       $this->method = $method;
       $this->action = $action;
       // imprimer l'entête
       echo "<form name=\"$name\" method=\"$method\" action=\"$action\" >";
    }
    // terminer le Form
    public function terminer()
    {
       echo "</form>";
    }
}

class InputField   {
    // propriétés de InputField    
    public $name;
    public $value;	
    public $type;	
	public $label;
    public $id;
    public $class;
    public $size;
	public $maxlength;

     // construction de l'objet InputField
    public function __construct($name, $value="", $type="text", $label="", $id="", $class="", $size="auto", $maxlength="auto") // seul le champ name est obligatoire
    {
         $this->name = $name;
		 $this->value = $value;
		 $label = trim($label)==""?strtoupper($name):$label; // si label est vide le remplacer par name en majuscules
		 $this->label = $label;
		 $id = trim($id)==""?$name:$id; // si id est vide le remplacer par name
		 $this->id = $id;
         $this->class= $class;
         $this->type = $type;
         $this->size= $size;
         $this->maxlength = $maxlength;
         // imprimer le code HTML de l'InputField
        echo "<label for=\"$name\">$label :</label><input type=\"$type\" name=\"$name\" value=\"$value\" size=\"$size\" maxlength=\"$maxlength\" id=\"$id\" class=\"$class\" />";
     }    
}

// test des classes
// voici le cas d'utilisation de l'objet Form
$f1 = new Form("monForm1"); // imprimer l'entête du Form
// voici les cas d'utilisation de l'objet InputField
new InputField("nom", "", "text"); // spécifie : name, value et type de l'objet InputField
new InputField("prenom"); // ne spécifie que name les autres propriétés de l'objet InputField ont des valeurs par défaut
new InputField("action", "enregistrer", "submit"); // spécifie : name, value et type de l'objet InputField
$f1->terminer(); // imprimer la fin du Form

// voici le cas d'utilisation de l'objet Form avec rappel des données postées par la méthode POST
$f2 = new Form("monForm2", "post"); 
//
new InputField("pseudo", $_POST['pseudo']); // champ de type text avec rappel de la valeur postée en cas de réaffichage
new InputField("mot de passe", "", "password");  // champ de type password
new InputField("action", "enregistrer", "submit");
//
$f2->terminer();
?>

Re: Formulaire avec OOP

Posté : 12 avr. 2011, 07:22
par rimie1
merci sadeq je vais le recommencer pour le comprendre

Re: Formulaire avec OOP

Posté : 13 avr. 2011, 03:52
par rimie1
Merci sadeq, j'aurais quelques questions concernant le formulaire, je vais les rapporter apres la fin de son analyse

Re: Formulaire avec OOP

Posté : 13 avr. 2011, 07:15
par rimie1
rebonjour!
si je voudrais combiner tous les inputs, ici j'ai mis radio:
########### Class des Inputs
class RadioField   {
    // propriétés de InputField    
    public $name;
    public $value;     
    public $type;      
    public $id;
    public $class;
    
     // construction de l'objet RadioField
    public function __construct($name, $value="", $type="radio", $id="", $class="")
    {
         $this->name = $name;
         $this->value = $value;
         $id = trim($id)==""?$name:$id;
         $this->id = $id;
         $this->class= $class;
         $this->type = $type;
        
        echo "<input type=\"$type\" name=\"$name\" value=\"$value\" id=\"$id\" class=\"$class\" />";
        
     }    
}

$f3 = new Form("monForm3", "post");
//
new RadioField("radio1", "Small", 'radio');
new RadioField("genre");
new RadioField("action", "envoyer", "submit");
//
$f3->terminer();
dans le cas des: radio, checkbox, text et password, ils ont tous <input>, je peux faire comme ca:
public function __construct($name, $value="", $type="", $id="", $class="", $size="auto", $maxlength="auto")
ca marche pour text et password, alors que pour les radio et checkbox, il n'existe pas les attributs size et maxlength, est ce qu'il existe une methode pour combiner les 4 (text, password, radio, checkbox) en une seule methode?

merci

Re: Formulaire avec OOP

Posté : 13 avr. 2011, 10:34
par sadeq
Bonjour,
Je pense que ce n'est pas très grave au niveau HTML de mettre des attributs dans une balise qui ne les gère pas. Donc on peut laisser le programme comme ça et il gérera aussi le cas des radios et checkbox.
Mais si tu veux respecter le standard XHTML, tu peux ajouter dans la classe InputField au niveau de la fonction affichage des conditions (if ou switch) sur le champ $type pour varier les affichages des champs selon leur type (text ou radio ou ...)

Mais pour aller plus loin, dans le modèle objet, la méthode qui permet de subdiviser les descriptions des classes de même nature selon leurs spécificités, s'appelle l'héritage.
En effet, les objets qui en substance ont des points communs mais aussi des divergences peuvent dériver d'une même classe mère qui représente leurs traits communs. Donc la classe mère décrit les propriétés et méthodes communes et les classes filles qui en dérivent, décrivent chacune leurs propres propriétés et méthodes spécialisées.

Dans notre cas, on peut imaginer un héritage entre la classe InputField qui fait la description des propriétés et méthodes communes des objets de même nature : input (text, password, submit, reset, radio, checkbox...) et des classes dérivées par leur type comme : le bouton (submit et reset), le bouton radio et le checkbox.

Voici le schéma d'un modèle objet d'héritage :
La classe mère:
------------------
Class InputField {
$name, $value, $type, $id, $class; //... toutes les propriétés communes aux objets INPUT
function afficher() { echo .....}
}

Une des classes fille (radio par exemple): hérite de toutes les propriétés et méthodes publiques de sa mère et peut les réutiliser ou les réécrire.
------------------------------------------------
Class radio extends InputField {
$checked; //... toutes les propriétés spécifiques aux objets RADIO
function afficher() { echo .....}
}