Formulaire avec OOP

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Formulaire avec OOP

Tres instructif

par emporbappet » 28 juil. 2011, 01:32

tres interessant, merci

Re: Formulaire avec OOP

par rimie1 » 18 avr. 2011, 05:24

rebonjour,

j'avance un petit peu comme une tortue, j'aimerais l'ameliorer au niveau de control des erreurs, par exemple ajouter le champs enctype au niveau de l'entete du formulaire:
public final function __construct($name, $method='', $action='', $enctype='') {
// l'entete du formulaire
// je verifie si enctype est la
		if($enctype)
		{
			$form = '<form name="'.$name.'" method="'.$method.'" action="'.$action.'" '.$enctype.'>';	
		}
		else // sinon pas la peine
		{
			$form = '<form name="'.$name.'" method="'.$method.'" action="'.$action.'">';
		}
		echo $form; // on affiche le formulaire

//code
}

public final function addInput($type, $name='', $value='', $size='', $maxlength='', $checked=''){
// ici je controle les champs:

switch($type)
	{
case 'password':
		echo '<input type="'.$type.'" name="'.$name.'" value="'.$value.'" size="'.$size.'" maxlength="'		.$maxlength.'" id="'.$id.'" class="'.$class.'" />';
		break;
case 'file':
		echo '<input type="'.$type.'" name="'.$name.'" />';
  		break;
}

// si vous remarquiez le champs 'file' il faut ajouter au form l'attribut enctype 'ENCTYPE="multipart/form-data"', alors je fais une verification:

if(empty($name))
		{
			$this->error[] = '<li>Input nom vide</li>';
			return false;
		}
	
		if($type == 'file')
		{
			$this->error[] = '<li>il existe un file</li>';
			return false;
		}

//code
}
Je voudrais pas afficher le message d'erreur 'il existe un file', mais de changer $form au constructeur vers celle qui comporte $enctype:
			$form = '<form name="'.$name.'" method="'.$method.'" action="'.$action.'" '.$enctype.'>';	
j'aurais le code ci-dessus automatique apres l'ajout d'un champs file:
<?php
$frm1 = new formulaire('monForm1', '', '', ''); // imprimer l'entête du formulaire (name, method, action)
$frm1->addInput('text', 'nomtext'); // champ text
$frm1->separation();
############## ici je l'ajoute donc il faut avoir un formulaire avec enctype
$frm1->addInput('file', 'nomFile', 'valeur'); // file upload
?>
merci

Re: Formulaire avec OOP

par rimie1 » 18 avr. 2011, 00:53

en premier lieu j'ai mal compris sa fonction, je l'ai souvent vu comme premiere fonction de la class, alors j'ai cru qu'il faut toujours l'executer avant d'etablir d'autres fonctions, cela dit, d'apres votre explication, qu'on l'utilise pour des raisons routine, par exemple, un formulaire, il faut toujours commencer par <form...> et les autres champs (input, checkbox,..), le constructeur instancie la class, par defaut il faut lancer <form..> avant de construire les autres champs, aussi pour la connexion,.. ainsid e suite, j'espere que j'ai bien compris la difference, merci AB, je vais continuer mon travail sur le formulaire :) =D>

Re: Formulaire avec OOP

par AB » 17 avr. 2011, 18:13

Si tu veux dire qu'elles ont le même rôle parce que ce sont toutes les deux des fonctions et que l'on peut leur faire faire ce que l'on veut, alors oui elles ont le même "rôle" : celui d'exécuter des instructions.

Mais la fonction constructeur sera déclenchée dès que l'on instancie la classe, alors qu'il faudra appeler les autres.

Tu n'es pas obligé d'avoir une fonction constructeur dans une classe, c'est une option. Cela sert quand il faut faire une action systématique, une routine avant de se servir de la classe (d'où le mot constructeur :wink: ) .

Par exemple si tu veux travailler sur un fichier texte, dans tous les cas il faudra ouvrir ce fichier texte et on peut donc mettre (si l'on veut faire ainsi) l'adresse du fichier en paramètre dans le constructeur.
class Fichier {

var fich_content;

public function __construct($fichier) 
{
if (is_file($fichier))
$this->fich_content = file_get_contents($fichier);
else
exit("ce fichier n'existe pas à l'adresse indiquée");
}

public function recherche($string) 
{
return strpos($this->fich_content,$string);
}

public function taille($encodage) 
{
return mb_strlen($this->fich_content,$encodage);
}

}

$fich = new Fichier('document/toto.txt');

$nb_caractres = $fich->taille('utf-8');

$motif = 'titi';
$position_motif = $fich->recherche($motif);

if ($position_motif !== false) echo 'le fichier comprend '.$nb_caractres.' caractères et le mot '.$motif.' a été trouvé en '.$position_motif.' position';

Re: Formulaire avec OOP

par rimie1 » 17 avr. 2011, 03:14

Mais une fonction normale ne s'exécute pas automatiquement lors de l'intanciation de la classe !
Comment faut-il te le dire :?:
Ce que j'ai retenu c'est que les 2 fonctions ont le meme role!!!

seulement la facon d'afficher le resultat de chacune est different, par exemple dans mon code:
class formulaire {

public final function __construct($name, $method='', $action='', $enctype='') {
//code
}

public final function addInput($type, $name='', $value='', $size='', $maxlength='', $checked=''){
//code
}
}// fin de la class

$frm1 = new formulaire('monForm1', '', '', ''); // imprimer l'entête du formulaire (name, method, action)
$frm1->addInput('text', 'nomtext'); // champ text
pour construct on fait new nomClass et pour la function nomMethode on fait $var->nomMethode :(

Re: Formulaire avec OOP

par AB » 16 avr. 2011, 18:00

Mais une fonction normale ne s'exécute pas automatiquement lors de l'intanciation de la classe !
Comment faut-il te le dire :?:

Re: Formulaire avec OOP

par rimie1 » 16 avr. 2011, 17:26

Est-ce qu'une fonction publique s'exécute automatiquement lors de l'instanciation de la classe ?
le probleme je n'ai pas encore compris le role de construct, alors que je vois qu'elle a le meme role qu'une fonction normale:
public function nomMethode()
{

}
==
public function __construct()
{

}

Re: Formulaire avec OOP

par AB » 16 avr. 2011, 17:11

Quand on fait $this->var = $var; c'est pour définir une variable "globale interne à la classe" (on y aura accès depuis n'importe qu'elle fonction de la classe en faisant $this->var). $var quant à elle est une variable classique, la plupart du temps issue d'un paramètre d'une fonction.
<?php
class Affiche_var
{

private $var = 10;

	public function modif_var($var)
	{
		$this->var = $var;
	}
	
	public function affiche()
	{
		echo $this->var;
	}
}

$init = new Affiche_var;
$init->	affiche();	
echo '<br />';
$init->	modif_var('20');
$init->	affiche();
?>
Evidemment c'est pareil que
<?php
class Affiche_var
{

private $var = 10;

	public function modif_var($toto)
	{
		$this->var = $toto;
	}
	
	public function affiche()
	{
		echo $this->var;
	}
}

$init = new Affiche_var;
$init->	affiche();	
echo '<br />';
$init->	modif_var('20');
$init->	affiche();
?>

Re: Formulaire avec OOP

par AB » 16 avr. 2011, 16:53

Est ce que l'utilisation de __construct est la meme que public function()
merci
Est-ce qu'une fonction publique s'exécute automatiquement lors de l'instanciation de la classe ?

Re: Formulaire avec OOP

par rimie1 » 16 avr. 2011, 16:29

$var est une variable "standard" dont la portée est interne à la fonction qui l'utilise -> les autres fonctions n'y auront pas accès.
$this->var défini une variable dont la portée est interne à la classe -> toutes les fonctions de la classe pourront y avoir accès.

function __construct est la fonction qui s'exécutera dès l'instanciation de la classe (en utilisant les éventuels paramètres fournis dans de l'instanciation).
Est ce que vous pouvez me donner un exemple sur:
private $var;
$this->var = $var;
Je les ai supprime, et ce ne change rien.

Est ce que l'utilisation de __construct est la meme que public function()

merci

Re: Formulaire avec OOP

par AB » 15 avr. 2011, 17:37

$var est une variable "standard" dont la portée est interne à la fonction qui l'utilise -> les autres fonctions n'y auront pas accès.
$this->var défini une variable dont la portée est interne à la classe -> toutes les fonctions de la classe pourront y avoir accès.

function __construct est la fonction qui s'exécutera dès l'instanciation de la classe (en utilisant les éventuels paramètres fournis dans de l'instanciation).

Re: Formulaire avec OOP

par rimie1 » 15 avr. 2011, 13:09

Bravo =D>
Merci, c'est quoi exactement:
private $var;
$this->var = $var;
private $method; // POST et GET

$this->name     = $name; // nom
+ c'est quoi la difference entre: function __construct et function nomDeLaFonction

J'ai essaye de mettre comme ca, et ca ne marche pas
public final function addInput($name, $type='', $checked='', $size='', $maxlength=''){

// code

}

$frm1->addInput('nom', 'text', '10', '80'); // champ text avec modif
Merci

Re: Formulaire avec OOP

par sadeq » 15 avr. 2011, 11:12

Bravo =D>

Re: Formulaire avec OOP

par rimie1 » 15 avr. 2011, 06:31

un essai mediocre, pas encore termine:
<?php

class formulaire {
    // Toutes les propriétés du formulaire
    private $formMethod; // array (POST et GET)
    private $method; // POST et GET
	private $action;
	private $name;
    private $value;
    private $type; // text, password, button, submit, radio, checkbox 
    private $id;
    private $class;
    private $size;
    private $maxlength;
    private $cols;
    private $rows;
    //private $inputType;
    //private $error;
    //private $form;
    //private $afterinput;
    


		


######## On construit le formulaire:

public final function __construct($name, $method='', $action='') { // aucun champ n'est obligatoire
			
		// le nom du formulaire:
		$this->name = $name;

		// la methode
		# on liste les differentes methodes
		$this->formMethod = array('POST','GET');
		// on supprime l'espace
		$method = trim($method);
		// si la method est vide on met POST par defaut sinon on la laisse
		$method = (empty($method)) ? 'POST' : $method;
		// si la method remplie ne contient pas le tableau formMethod (post, get) on met a defaut post
		$method = (!in_array($method, $this->formMethod)) ? 'POST' : $method;
		// on  retourne la method
		$this->method = $method;
	
	
		//l'action
        $action = (empty($action)) ? $_SERVER['PHP_SELF'] : $action;
        $this->action = $action;
        // l'entete du formulaire
       	echo '<form name="'.$name.'" method="'.$method.'" action="'.$action.'" >';
       
       }
       
	
	//public final function addInput($name, $type='', $checked='', $size='', $maxlength=''){
	public final function addInput($name, $type='', $checked=''){
       	
       	//echo $type;
		
		$value 		= (empty($value)) 		? 	$name	: $value;
		$id 		= (empty($id)) 			? 	$name 	: $id;
		$class 		= (empty($class)) 		?	$name 	: $class;
		$size		= (empty($rows)) 		? 	20 		: $size;
		$maxlength	= (empty($maxlength)) 	? 	50	 	: $maxlength;
		
		$this->name 	= $name; // nom
		$this->id 		= $id; // id
		$this->class	= $class; // class
		$this->cols		= $size; // size
		$this->rows		= $maxlength; // maxi
		
	switch($type)
	{
		case 'password':
		echo '<input type="'.$type.'" name="'.$name.'" value="'.$value.'" size="'.$size.'" maxlength="'		.$maxlength.'" id="'.$id.'" class="'.$class.'" />';
		break;
		
		case 'submit':
		echo '<input type="'.$type.'" name="'.$name.'" value="'.$value.'" id="'.$id.'" class="'.$class.'" />';
		break;
				
		case 'button':
		echo '<input type="'.$type.'" name="'.$name.'" value="'.$value.'" id="'.$id.'" class="'.$class.'" />';
		break;
		
		case 'radio':		
		if($checked)
		{
		echo '<input type="'.$type.'" name="'.$name.'" value="'.$value.'" id="'.$id.'" class="'.$class.'" '.$checked.' />';	
		}
		else
		{
		echo '<input type="'.$type.'" name="'.$name.'" value="'.$value.'" id="'.$id.'" class="'.$class.'" />';
		}
		break;
				
		case 'checkbox':		
		if($checked)
		{
		echo '<input type="'.$type.'" name="'.$name.'" value="'.$value.'" id="'.$id.'" class="'.$class.'" '.$checked.' />';	
		}
		else
		{
		echo '<input type="'.$type.'" name="'.$name.'" value="'.$value.'" id="'.$id.'" class="'.$class.'" />';
		}
		break;
		
		// par defaut un text
		default:
		echo '<input type="text" name="'.$name.'" value="'.$value.'" size="'.$size.'" maxlength="'.$maxlength.'" id="'.$id.'" class="'.$class.'" />';
				
			}
		$this->type = $type;
       	//$this->inputType = array('text', 'password', 'submit', 'button', 'radio','checkbox');
  		// si le type est vide on met text par defaut sinon on la laisse
		//$type = (empty($text)) ? 'text' : $text;
		// si le type ne contient pas le tableau inputType (text, ...) on le met a defaut text
		//$type = (!in_array($type, $this->inputType)) ? 'text' : $type;
		// on  retourne le type
		} // end addInput function


	#Textarea
	public final function addTextarea($name, $cols='', $rows='', $fillTextarea='', $optionsTextarea=''){
		
		$id 			= (empty($id)) 				? 	$name 		: $id;
		$class 			= (empty($class)) 			?	$name		: $class;
		$fillTextarea	= (empty($fillTextarea)) 	? 	'Du text' 	: $fillTextarea;
		$cols			= (empty($cols)) 			? 	40 			: $cols;
		$rows			= (empty($rows)) 			? 	5 			: $rows;

		$this->name 	= $name; // nom
		$this->id 		= $id; // id
		$this->class	= $class; // class
		$this->cols		= $cols; // cols
		$this->rows		= $rows; // rows
		
		if($optionsTextarea)
		{				
			echo '<textarea name="'.$name.'" cols="'.$cols.'" rows="'.$rows.'" '.$optionsTextarea.'>'.$fillTextarea.'</textarea>';
		}
		else
		{
			echo '<textarea name="'.$name.'" cols="'.$cols.'" rows="'.$rows.'">'.$fillTextarea.'</textarea>';	
		}

	} // end textarea


	#StartSelect
	public final function addStartSelect($name=''){
		
		$id 			= (empty($id)) 				? 	$name 		: $id;
		$class 			= (empty($class)) 			?	$name		: $class;
		//$size			= (empty($size)) 			? 	''			: $size;

		$this->name 	= $name; // nom
		$this->id 		= $id; // id
		$this->class	= $class; // class
		//$this->size		= $size; // size
		//$this->rows		= $rows; // rows
		
				
			echo '<select name="'.$name.'">';

	} // end StartSelect
	
	#Options Select
	public final function addOptionsSelect($fillOption, $value='', $optionOptions=''){
		
		$id 			= (empty($id)) 				? 	$name 				: $id;
		$class 			= (empty($class)) 			?	$name				: $class;
		$value			= (empty($value)) 			? 	0					: $value;
		$fillOption		= (empty($fillOption)) 		? 	'Select from list'	: $fillOption;

		$this->name 	= $name; // nom
		$this->id 		= $id; // id
		$this->class	= $class; // class
		$this->value	= $value; // valeur option
		//$this->rows		= $rows; // rows
		
		
		if($optionOptions)
		{				
			echo '<option value="'.$value.'" DISABLED>'.$fillOption.'</option>';
		}
		else
		{
			echo '<option value="'.$value.'">'.$fillOption.'</option>';	
		}

	} // end Options Select
	

	#EndSelect
	public final function addEndSelect(){
			echo '</select>';

	} // end EndSelect





	// separation des champs
	public function separation()
    {
       echo "<br />";
    }
    
	// terminer le Form
    public function terminer()
    {
       echo "</form>";
    }


}// end class formulaire

$frm1 = new formulaire('monForm1', '', ''); // imprimer l'entête du formulaire (name, method, action)
$frm1->addInput('nom', 'text'); // champ text
//$frm1->addInput('nom', 'text', '10', '80'); // champ text avec modif

$frm1->separation();

$frm1->addInput('nom', 'checkbox', 'Checked="checked"'); // checkbox avec checked
$frm1->addInput('nom', 'checkbox'); // checkbox sans checked

$frm1->separation();

$frm1->addInput('nom', 'radio', 'Checked="checked"'); // radio avec checked
$frm1->addInput('nom', 'radio'); // radio sans checked

$frm1->separation();

$frm1->addTextarea('nom', '', ''); // textarea sans text

$frm1->separation();

$frm1->addTextarea('nom', '20', '3', 'Test ici'); // textarea avec du text

$frm1->separation();

$frm1->addTextarea('nom', '35', '3', 'textarea avec readonly', 'READONLY'); // textarea avec READONLY

$frm1->separation();

$frm1->addStartSelect('select1');
$frm1->addOptionsSelect('','','DISABLED');
$frm1->addOptionsSelect('valeur2', 'option4');
$frm1->addEndSelect();

$frm1->separation();



$frm1->terminer();






?>

Re: Formulaire avec OOP

par rimie1 » 15 avr. 2011, 03:17

je vais creer la mienne, elle va combiner entre les 2 class ainsi avec d'autres elements et ameliorations