Page 1 sur 1

Ma première class , optimisation

Posté : 27 avr. 2006, 15:41
par Tictac
bonjour , je viens de créer une class pour créer un formulaire de façon dynamique.

Ca fonctionne très bien !! mais à présent , avant de partir dans le gros boulot , je désire savoir si je suis sur la bonne route.

Je vais encore de voir modifier ma class pour les form de type select.

Je me limite pour le formulaire au champ :
-input (text,checkbox)
-textarea
-select


Voici mon code :
<?
//Créons une class pour les champs
 class Champ {
 var $name ;
 var $type ;
 var $valuedef;
 var $size1;
 var $size2;
 
 function Info($type,$name,$valuedef,$size1,$size2)
 	{
	$this->type = $type ;
	$this->name = $name ; 
	$this->valuedef = $valuedef ;
	$this->size1 = $size1 ;
	$this->size2 = $size2 ;
	}
	
 function CreatChamp()
 	{
	if($this->type == 'text')
		{
	printf("<input name=\"%s\"",$this->name) ;
	printf("value=\"%s\"",$this->valuedef);
	printf("type=\"text\" size=\"%s\" />",$this->size1);
		}
	if($this->type == 'textarea')
		{
	printf("<textarea name=\"%s\"",$this->name) ;
	printf("cols=\"%s\"",$this->size1); 
	printf("rows=\"%s\">",$this->size2);
	printf("%s</textarea>",$this->valuedef) ;
		}
	}
 }
?>
<form action="?page=test" method="post">
<table>
<?
$qry_champ = mysql_query("SELECT 
  champ.champ_id,
  champ.champ_fk_subgroup_id,
  champ.champ_name,
  champ.champ_type,
  champ.champ_valuedef,
  champ.champ_obligatoire,
  champ.champ_check_type,
  champ.champ_size1,
  champ.champ_size2,
  champ.champ_checked,
  champ.champ_ordre,
  champ.champ_fk_option_id,
  denom.denom_id,
  denom.denom_fk_champ_id,
  denom.denom_nomfr,
  denom_language.denom_language_id,
  denom_language.denom_language_fk_denom_id,
  denom_language.denom_language_fk_language_id,
  denom_language.denom_language_name,
  language.language_id,
  language.language_name,
  language.language_sub
FROM
 denom
 RIGHT OUTER JOIN champ ON (denom.denom_fk_champ_id=champ.champ_id)
 INNER JOIN denom_language ON (denom.denom_id=denom_language.denom_language_fk_denom_id)
 INNER JOIN language ON (denom_language.denom_language_fk_language_id=language.language_id) WHERE champ_fk_subgroup_id='1' AND language_sub ='$_SESSION[lang]' ORDER BY champ_ordre ASC") or die (mysql_error());
$nb_champ = mysql_num_rows($qry_champ);
for($i=0;$i<$nb_champ;$i++)
	{
	$champ = mysql_fetch_assoc($qry_champ);
	$denom = ($champ['champ_obligatoire'] == 1)? "<b>".$champ['denom_language_name']."</b>" : $champ['denom_language_name'] ;
	?>
<tr>
<td><?=$denom?></td>
<td>
<?
$type = $champ['champ_type'];
$name = $champ['champ_name'];
$valuedef = $champ['champ_valuedef'];
$size1 = $champ['champ_size1'];
$size2 = $champ['champ_size2'];

$champ = new Champ ;
$champ->Info($type,$name,$valuedef,$size1,$size2);
$champ->CreatChamp();
?>
</td>
</tr>
<?	}
?>
</table>
Merci d'avance à vous pour vos conseils !!!

Posté : 27 avr. 2006, 16:22
par Ryle
Bah ca m'a l'air plutot pas mal tout ça :)

Une petite modif que tu peux faire, c'est renommer la méthode "Info" en "Champ" pour en faire un constructeur (méthode portant le même nom que la classe) et ainsi initialiser les valeur directement dans le new :
$champ = new Champ ($type,$name,$valuedef,$size1,$size2); 
Ensuite, je suis pas fan des printf, pour peut qu'il y ait plusieurs variables ont perd vite la notion de laquelle va où (encore que tu fais ça bien en découpant varibale par variable), mais j'ai une préfèrence pour les voir là où elles doivent apparaitre :) (bon apres tu fais comme tu veux hein ;))
    echo '<input name="'.$this->name.'"';
    echo ' value="'.$this->valuedef.'"'; 
    echo ' type="text"';
    echo ' size="'.$this->size1.'" />'; 
Autre chose que j'ai pris l'habitude de faire (déformation java) c'est d'utiliser des getter et setter pour accéder aux attributs.. l'avantage, c'est que si tu as besoin d'effectuer un controle sur une valeur, ou de la formater, tu ne le fais qu'à un seul endroit... :) Mais vu que tu n'y accède pas en dehors de la classe, ca vaut peut être pas la peine de t'embêter..

Pis déformation java toujours, les classes (et par conséquent les constructeurs) commencent par une majuscule, les méthodes commencent par une minuscule :
CeciEstUneClasse
ceciEstUneMethode

Voilà... pioches dans tout ça ce qui te semble interessant, et bon courage pour les select et la gestion des options :)

Posté : 27 avr. 2006, 18:29
par Tictac
merci , je vais déjà changer ca et bien penser au class et methode pour la syntaxe !!(majuscule etc)

je vous tiens au courant du reste !! on sait jamais , ca peut p-e servir à qqun par la suite ;)