Formulaire : 4 en 1

Contenu du snippet

PROBLEMATIQUE :
A devoir gérer des forumlaires, on se trouve confronté aux modes suivants :
1/ formulaire vierge avec champs vide
2/ formulaire avec champs manquant ou données incohérentes après validation
3/ formulaire avec les données de la BdD pour modification
4/ fiche du formulaire affiché sans les champs

Au déut je faisais 3 ou 4 pages, puis 1 page avec des contraintes et des test de variables d'état infernales....

Alors j'ai pété un plomb, et j'ai réalisé quelques fonctions qui couvrent 95% de mes besoins. Si vous voulez passé à 100%, modifiez les fonctions ou ajoutez-en ^^

PRINCIPE :
- un fichier "INCLUDE" avec lesdites fonctions de champs de formulaire
- un appel de fonction variable selon les tests nécessaires, qui dépendent évidement de votre appli, de votre envie, bref de vous...

Je vous donne l'architecture générale du Biniou, pas les détails particuliers

Source / Exemple :


Dans un fichier qu'il faut "INCLUDE"...

<?PHP
/////////////////////////////////////////////////////////////////
function F_FormText($type,$nom,$tail,$maxi,$aide,$conf,$texte)
	{
	// $type : gère le mode d'affichage
 	// $nom : nom du champs
	// $tail : taille du champ
	// $maxi : nombre maximum de caractère autorisé
	// $aide : blabla d'aide sur le champs (obligatoire, facultatif, nbr de caract...) que j'affiche au bout de la souris avec une fonction JS sur OnMouseOver
	// $conf : si besoin, affiche une pop-Up de confirmation
	// $texte : valeur du champs venant de $_POST ou de la valeur en BdD
	$rezu='';
	if($type==0){// affiche simplement avec les données prêtes à être modifiée
		$rezu.=stripslashes($texte).'<input type="hidden" name="'.$nom.'" value="'.stripslashes($texte).'" />';
		}
	else{
		$rezu.='<input type="text" size="'.$tail.'" name="'.$nom.'"';
		$rezu.=' value="'.stripslashes($texte).'"';
		if($maxi>0){$rezu.=' maxlength="'.$maxi.'"';}
		if(strlen($aide)>2){$rezu.=' onmouseover="popfeun(\''.$aide.'\');" onfocus="popfeun(\''.$aide.'\');" onmouseout="kill()" onlostfocus ="kill()"';}
		if($conf!=0){$rezu.=' onclick="if (window.confirm(\''.$conf.'\')){kill();return true;} else {kill();return false;}';}
		$rezu.=' />';
		}
	return ($rezu);
	}
///////////////////////////////////////////////////////////////////////////
function F_FormArea($type,$nom,$lign,$colo,$aide,$texte)
	{
	// $type : gère le mode d'affichage
 	// $nom : nom du champs
	// $lign : nbr de ligne du champs
	// $colo : nbr de colonne
	// $aide : blabla d'aide sur le champs (obligatoire, facultatif, nbr de caract...) que j'affiche au bout de la souris avec une fonction JS sur OnMouseOver
	// $texte : valeur du champs venant de $_POST ou de la valeur en BdD
	$rezu='';
	if($type==0){// // affiche simplement avec les données prêtes à être modifiée
		$rezu.=(nl2br(trim($texte))).'<input type="hidden" name="'.$nom.'" value="'.stripslashes($texte).'" />';
		}
	else{
		$rezu.='<textarea name="'.$nom.'" cols="'.$colo.'" rows="'.$lign.'" wrap="physical"';
		if(strlen($aide)>2){$rezu.=' onmouseover="popfeun(\''.$aide.'\');" onfocus="popfeun(\''.$aide.'\');" onmouseout="kill()" onlostfocus ="kill()"';}
		$rezu.=' />'.stripslashes($texte).'</textarea>';
		}
	return ($rezu);
	}
///////////////////////////////////////////////////////////////////////////
function F_FormRadio($type,$nom,$posi,$aide,$lib,$recu)
	{
	// $type : gère le mode d'affichage avec 5 choix
 	// $nom : nom du champs
	// $posi : valeur affectée au choix du champs (1,2,3,4,5...)
	// $lib : libellé du choix du champs (oui, non, nsp...)
	// $aide : blabla d'aide sur le champs (obligatoire, facultatif, nbr de caract...) que j'affiche au bout de la souris avec une fonction JS sur OnMouseOver
	// $recu : valeur du champs venant de $_POST ou de la valeur en BdD
	$rezu='';
	if($type==0){// affiche simplement
		if($recu==$posi){$rezu.=$lib.'<input type="hidden" name="'.$nom.'" value="'.$recu.'" />';}
		}
	elseif($type==1){// en paragraphe, bouton puis lib
		$rezu.='<input type="radio" name="'.$nom.'" value="'.$posi.'"';
		if($recu==$posi){$rezu.=' checked="checked"';}
		if(strlen($aide)>2){$rezu.=' onmouseover="popfeun(\''.$aide.'\');" onfocus="popfeun(\''.$aide.'\');" onmouseout="kill()" onlostfocus ="kill()"';}
		$rezu.=' /> '.$lib.' &nbsp;&nbsp;&nbsp;';
		}
	elseif($type==2){// en paragraphe, lib puis bouton
		$rezu.=$lib.' <input type="radio" name="'.$nom.'" value="'.$posi.'"';
		if($recu==$posi){$rezu.=' checked="checked"';}
		if(strlen($aide)>2){$rezu.=' onmouseover="popfeun(\''.$aide.'\');" onfocus="popfeun(\''.$aide.'\');" onmouseout="kill()" onlostfocus ="kill()"';}
		$rezu.=' />&nbsp;&nbsp;&nbsp;';
		}
	elseif($type==11){// en tableau, avec TR/TD,  bouton puis lib AJOUTER tag <table>
		$rezu.='<tr><td align="center"><input type="radio" name="'.$nom.'" value="'.$posi.'"';
		if($recu==$posi){$rezu.=' checked="checked"';}
		if(strlen($aide)>2){$rezu.=' onmouseover="popfeun(\''.$aide.'\');" onfocus="popfeun(\''.$aide.'\');" onmouseout="kill()" onlostfocus ="kill()"';}
		$rezu.=' /></td><td>'.$lib.'</td></tr>';
		}
	elseif($type==21){//  en tableau, avec TR/TD, lib puis bouton AJOUTER tag <table>
		$rezu.='<tr><td>'.$lib.'</td><td align="center"><input type="radio" name="'.$nom.'" value="'.$posi.'"';
		if($recu==$posi){$rezu.=' checked="checked"';}
		if(strlen($aide)>2){$rezu.=' onmouseover="popfeun(\''.$aide.'\');" onfocus="popfeun(\''.$aide.'\');" onmouseout="kill()" onlostfocus ="kill()"';}
		$rezu.=' /></td></tr>';
		}
	return ($rezu);
	}
///////////////////////////////////////////////////////////////////////////
?>

Dans le fichier d'utilisation, qui contient le "INCLUDE" du fichier qui contient les fonctions...
Voici le principe d'utilisation pour chaque type de champs 'fonctionnisé'. Je vous passe la mise en page...

1/ Traitement de la BdD
...
<?PHP
if(isset($_POST['p_kelchoix']) && $_POST['p_kelchoix']>0){// pas de mise à jour ! Je viens d'une page de lsite de choix, et le choix est fait via p_kelchoix.
	$_SESSION['id_encours']=$_POST['p_kelchoix'];
	$det_fiche=F_InfoFiche(0,$_SESSION['id_encours'],$db_link);// ma fonction de requete
	}
else{
	if($_SESSION['id_encours']>0){
		$det_fiche=F_InfoFiche(0,$_SESSION['id_encours'],$db_link);// ma fonction de requete
		}
	else{
		$_SESSION['id_encours']=0;
		}
	}
if(isset($_GET['g_koi'])){
	 if($_GET['g_koi']==99){//ni mise à jour, ni création. Demande de création à venir
		$type=2;
		$mise_jour=0;
		$creation=0;
		$nosql=0;
		}
	elseif($_GET['g_koi']==66){//ni mise à jour, ni création. Demande de modif à venir
		$type=0;
		$mise_jour=0;
		$creation=0;
		}
	elseif($_GET['g_koi']==1){// mise à jour. Modif à venir
		$type=1;
		$mise_jour=1;
		$creation=0;
		}
	elseif($_GET['g_koi']==2){//création. Modif à venir
		$type=1;
		$mise_jour=0;
		$creation=1;
		}
	elseif($_GET['g_koi']==0){// ni l\'un ni l\'autre. Modif à venir
		$type=1;
		$mise_jour=0;
		$creation=0;
		}
	}
else{// fomulaire vierge : g-koi pas défini RAF
	$type=99;
	$mise_jour=0;
	$creation=0;
	}
if($mise_jour==1 || $creation==1){//update
	if($mise_jour==1){
		$rek_u_fich='update fiche set ... where FS_ID='.$_SESSION['id_encours'];
		mysql_query($rek_u_fich,$db_link) or die(mysql_error());
		$det_fiche==F_InfoFiche(0,$_SESSION['id_encours'],$db_link);// ma fonction de requete
		$effet='La fiche a été mise à jour.';
		}
	else{$effet=' La fiche a été mise à jour, et contient ('.$nosql.') erreurs .<br />Vous pourrez toujours la modifier ultérieurement, en la sélectionnant dans votre liste de Fiche.';}
	if($creation==1 && $_SESSION['rocket']==0){
		$rek_i_fich='insert into fiche ...';
		mysql_query($rek_i_fich,$db_link) or die(mysql_error());
		$_SESSION['id_encours']=mysql_insert_id();
		$effet='La fiche a enregistrée.';
		$_SESSION['rocket']=1;// gestion du REFRESH ^^
		$det_fiche==F_InfoFiche(0,$_SESSION['id_encours'],$db_link);// ma fonction de requete
		}
	if($creation==1 && $_SESSION['rocket']==0){$effet=' La fiche a été déjà été enregistrée, pas la peine d\'insister ^^ !';}
	}
?>

2/ Traitement du FORM
...
<form id="form2" name="form2" method="post" action="fiche.php?g_koi=<?PHP
 if($_GET['g_koi']==99){echo '2';}
 elseif($_GET['g_koi']==66){echo 0;}
 else{echo 1;}
 ?>">
...
...
<?PHP if($type!=0) { ?>
    <input name="p_etat" type="hidden" value="<?PHP echo $nosql;?>" />
<?PHP if($type==2) { ?>
    <input name="Valide" type="submit" value="Valider la fiche suivi" />
<?PHP } else { ?>
    <input name="Valide" type="submit" value="Enregistrer la fiche de suivi" />
<?PHP } } else { ?>
    <input name="Valide" type="submit" value="Modifier cette fiche" />
<?PHP } ?>
  </p>
</blockquote>
</form>
<p>&nbsp;</p>
<p>&nbsp;</p>
<?PHP } ?>
...

3/ Traitement des champs

...
if(strlen($effet)>10){echo '<br><span class="text3"><strong><font color="#FF0000" size="+1">'.$effet.'</font></strong></span><br>';}
...
<table>
<tr>
    <td align="right" valign="top">Nom : </td>
    <td><?PHP
$effet='';
if($type==99){//formulaire vide
	$typaff=1;
	$aide=addslashes('OBLIGATOIRE. Saisissez le nom de famille de la mère.<br />2 caractères de long minimum, 100 maximum.');
	$texte='';
	}
elseif($type>0){//formulaire avec donnée de POST ou de BdD
	$typaff=1;
	$aide=addslashes('OBLIGATOIRE. Saisissez le nom de famille de la mère.<br />2 caractères de long minimum, 100 maximum.');
	$texte=$det_fiche[0]['F_MERE_NOM'];// je prend les données de la BdD
	if(isset($_POST['p_m_01']) && strlen($_POST['p_m_01'])>1 && strlen($_POST['p_m_01'])<101){$texte=stripslashes(trim($_POST['p_m_01']));}
	if(strlen($texte)<2){// comme un nouveau, vide, mais du à une erreur
		//echo 'hoho : lg='.strlen($texte).'<br />';
		$texte='';
		$nosql++;// variable de contrôle des erreurs, qui comptabilise le nbr d'erreur
		$effet=$nosql.'/ Le nom doit avoir au minimum 2 caractères de long, et au maximum 100.';
		}
	}
else{$typaff=0;$texte=$det_fiche[0]['F_MERE_NOM']; $aide='';}// $type=0 : affiche la fiche existante sans formulaire
echo F_FormText($typaff,'p_m_01',40,100,$aide,0,$texte);
if(strlen($effet)>10){echo '<br><span class="txt4_22">'.$effet.'</span>';}
?></td>
  </tr>
  <tr>
    <td align="right" valign="top">Possède une TV ? </td>
    <td><?PHP
$effet='';
if($type==99){//formulaire vide
	$typaff=2;
	$aide=addslashes('OBLIGATOIRE. Précisez si l\'individu possède une TV.');
	$recu=99;
	echo F_FormRadio($typaff,'p_ae_01',1,$aide,'Oui ',$recu);
	echo F_FormRadio($typaff,'p_ae_01',2,$aide,'Non ',$recu);
	}
elseif($type>0){//formulaire avec donnée de POST ou de BdD
	$typaff=2;
	$aide=addslashes('OBLIGATOIRE. Précisez si l\'individu possède une TV.');
	$recu=$det_fiche[0]['F_TV'];// je prend les données de la BdD
	if(isset($_POST['p_ae_01'])){$recu=$_POST['p_ae_01'];/*echo 'recu de post='.$recu.'<br />';*/}
		if($recu!=2 && $recu!=1){// comme un nouveau, vide, mais du à une erreur
		$nosql++;// variable de contrôle des erreurs, qui comptabilise le nbr d'erreur
		$effet=$nosql.'/ Vous devez spécifier si l\'individu possède une TV ou non.';
		}
	echo F_FormRadio($typaff,'p_ae_01',1,$aide,'Oui ',$recu);
	echo F_FormRadio($typaff,'p_ae_01',2,$aide,'Non ',$recu);
	}
else{// $type=0 : affiche la fiche existante sans formulaire (nécessaire de traiter chaque cas individuellement...
	$typaff=0;$recu=$det_fiche[0]['F_TV']; $aide='';
	if($recu==2){echo F_FormRadio($typaff,'p_ae_01',2,$aide,'Non ',$recu);}
	elseif($recu==1){echo F_FormRadio($typaff,'p_ae_01',1,$aide,'Oui ',$recu);}
	else{echo F_FormRadio($typaff,'p_ae_01',0,$aide,'...non défini ',0);}
	}
if(strlen($effet)>10){echo '<br><span class="txt4_22">'.$effet.'</span>';}
?></td>
  </tr>
</table>
<?PHP
$effet='';
if($type==99){//formulaire vide
	$typaff=1;
	$aide=addslashes('OPTIONNEL.<br />Saissisez içi toutes les informations concernant la fiche.');
	$texte='';
	echo '<blockquote><p>Si vous avez une remarque ou des commentaires sur cette fiche, c\'est içi : </p></blockquote>
';
	}
elseif($type>0){//formulaire avec donnée de POST ou de BdD
	$typaff=1;
	$aide=addslashes('OPTIONNEL.<br />Saissisez içi toutes les informations concernant la fiche.');
	$texte=$det_fiche[0]['F_COMMENT'];// je prend les données de la BdD
	if(isset($_POST['p_perso']) && strlen(trim($_POST['p_perso']))>0){$texte=stripslashes(trim($_POST['p_perso']));}
	echo '<blockquote><p>Si vous avez une remarques ou des commentaires sur cette fiche, c\'est içi : </p></blockquote>
';
	}
else{// $type=0 : affiche la fiche existante sans formulaire
	$typaff=0;$texte=$det_fiche[0]['F_COMMENT']; $aide='';
	if(strlen($texte)>1){echo '<blockquote><p>Vos remarques ou commentaires ...</p></blockquote>';}
	else{echo '<blockquote><p>Pas de remarque, ni commentaire sur cette fiche.</p></blockquote>';}
	}
echo F_FormArea($typaff,'p_perso',5,50,$aide,$texte);
if(strlen($effet)>10){echo '<br><span class="txt4_22">'.$effet.'</span>';}
?>

Conclusion :


Depuis que je fais ca, je fais un formulaire de 30 champs avec contrôle des données et gestion de la BdD en 1 journée sans ma prendre la tête...

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.