[PHP5] - CLASSE DE VÉRIFICATION DE FORMULAIRE

cs_iomega Messages postés 144 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 1 septembre 2008 - 30 nov. 2007 à 10:26
Banish Messages postés 1 Date d'inscription jeudi 11 mars 2010 Statut Membre Dernière intervention 2 juillet 2010 - 2 juil. 2010 à 14:29
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/44864-php5-classe-de-verification-de-formulaire

Banish Messages postés 1 Date d'inscription jeudi 11 mars 2010 Statut Membre Dernière intervention 2 juillet 2010
2 juil. 2010 à 14:29
Zipzip n'a pas dû beaucoup chercher ^^

Bref, c'est vrai que le code exemple n'est pas à jour. Si vous voulez rapidement tester cette classe, il faut:

1) Ajouter la classe genericException qui manque dans le zip, et que l'on peut trouver ici:
http://files.codes-sources.com/fichier.aspx?id=44038&f=genericException%2fgenericException.class.php

2) Remplacer les require du code de test par:
require_once ('formHandler/formRule.class.php');
require_once ('formHandler/formHandler.class.php');

3) Ajouter un
require_once ('genericException.class.php');
dans formHandlerException.class.php et formRuleException.class.php

Sinon, code bien fichu, que je vais tester et éventuellement compléter pour qu'il livre des valeurs sécurisées (addslashes, htmlentities etc).
zipzip2005 Messages postés 1 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 8 mai 2009
8 mai 2009 à 20:05
Jamais vu un code aussi merdique !!
la classe generic handler est manquante dans la livraison
l'auteur nous demande d'aller chercher dans ses autres sources , la lasse manquate
apres avoir qq minutes de recherches , je trouve une classe a peu pres du meme nom, est ce la bonne version ? je l'ignore
je teste ... et là je vois s'afficher des erreurs interne au pretendu frame work de validation des formulaire .

Codefalse , tu portes bien ton nom
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
25 janv. 2009 à 14:39
à la place du return false, il faisait quoi ? s'il retournait null, fallait tester if (is_null ($tonretour));

pour la condition, essaye plutot :
if (!empty ($this->pro))
return $this->pro;
else
return false; // null ?

Ca fait plaisir de voir que ma classe est utilisée sur tes sites :) vraiment :)
marciv Messages postés 6 Date d'inscription mercredi 19 octobre 2005 Statut Membre Dernière intervention 21 janvier 2009
25 janv. 2009 à 12:54
Bon ça marche avec la fonction suivante et en remettant toutes les variables en protected :

public function __get($pro) {
if($this->$pro!="") {
return $this->$pro;
}
else {
return false;
}
}

thanks et bon dimanche
marciv Messages postés 6 Date d'inscription mercredi 19 octobre 2005 Statut Membre Dernière intervention 21 janvier 2009
24 janv. 2009 à 18:29
Merci codefalse de tes précisions, peut être qu'un jour les classes n'auront plus de secrets pour moi :-) ce jour étant loin je précise :

mon problème n'est pas exactement de voir un si un email à été renseigné mais de faire un test spécifique en fonction de la valeur d'un champs du formulaire,
exemple
formulaire:
<select style="background-color:#D6DEF5;" name="devis_type_de_bien">
<option>-----</option>
<option value="maison">Maison</option>
<option value="appartement">Appartement</option>
<option value="autre">Autre</option>
</select>

Si autre, précisez :


donc j'ai besoin d'un truc du genre :

if (($devis_type_de_bien->_aElementValue=="autre")) {
$devis_type_de_bien_autre->setIsRequired ('Veuillez indiquer des précisions sur le type de bien !');
$devis_type_de_bien_autre->setMinLength (3, 'Vos précisions sur le type de bien doivent comporter plus de 3 caractères (Exemple : parking ouvert, commerce rdc, box etc...) !');
}

Je n'ai pas trouvé comment faire autrement...

j'ai bien essayé de rajouter un truc du genre :
public function __getVal() {
return ($this->aElementValue);
}
avec
test sur $devis_type_de_bien_autre->__getVal()
mais ça marche pas

PS au fait quand tu fait le test :
(is_object ($devis_type_de_bien_autre) && $devis_type_de_bien_autre instanceof formRule)
le retour est toujours true que le champs du formulaire soit renseigné ou pas et quand je print j'ai toujours ça :

formRule Object ( [_sDelimiter:protected] => . [_aElementValue] => [_iCountErrors:protected] => 0 [_aErrors:protected] => Array ( ) [_aRules:protected] => Array ( ) )

En tout cas merci de tes précisions et de ta classe qui ne quitte plus mes site :-)
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
24 janv. 2009 à 12:00
Pour ton problème, tu peux tester un :

if (is_object ($oMail) && $oMail instanceof LACLASSE) { // Traitement ici }

Je n'ai pas trouvé d'ou venait $oMail, mais tu test si c'est bien un objet et s'il appartient bien à la classe que tu souhaite, auquel cas tu fait le travail dessus. Sinon, tu lance une exception, stoppe le script, ou ce que tu veux :)
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
24 janv. 2009 à 11:58
Une des règles du jeu de la POO est de ne jamais mettre d'attributs en public, toujours en private/protected. Pourquoi ?

Imagine ceci :
class MyMath {
public $_iNum1;
public $_iNum2;

public function multiply () {
return $this->_iNum1 * $this->_iNum2;
}
}

$o = new MyMath ();
$o->_iNum1 = 'salut';
$o->_iNum2 = 5;
echo $o->multiply ();

Et là, joli plantage !

Maintenant, si tu fait de cette manière :
class MyMath {
private $_iNum1;
private $_iNum2;

public function multiply () {
return $this->_iNum1 * $this->_iNum2;
}

public function __set ($myVar, $myValue) {
if (!is_int ($myValue))
throw new Exception ('second parameter must be an Integer !');

$this->$myVar = $myValue;
}
}

Du coup, si la personne décide de mettre n'importe quoi sauf du int, là, ca ne passera pas ! C'est une sécurité !

Bon, sur mon exemple j'aurai juste trois points à commenter :
_ L'utilité de mon exemple est fort contestable dans le fait que des fonctions de type sum, multiply, square, prennent directement les valeurs à travailler en paramètre. Mais c'est un exemple pour montrer le pourquoi du comment des attributs privés/publiques. On peux aussi trouver un domaine d'application ou le multiply ne prendrais pas de valeurs :p
_ En POO global (sans tenir compte des spécificités du langage php), on aurait mis des getter/setters pour chaque variables (setNum1, getNum1 et setNum2, getNum2), mais vu que php propose la méthode __get/__set, autant en profiter (je n'ai pas mis __get car inutile dans cet exemple)
_ Je ne fait pas de vérification sur $myVar dans la méthode __set existe, ca devra donc etre _iNum1 ou _iNum2, sinon, ca servira à rien (voir ca risque de générer des erreurs). Encore une fois, ce n'est qu'un exemple, donc je ne l'ai pas amélioré !

J'espère maintenant que tu vois mieux pourquoi il faut éviter de mettre des publics dans une classe :)
marciv Messages postés 6 Date d'inscription mercredi 19 octobre 2005 Statut Membre Dernière intervention 21 janvier 2009
24 janv. 2009 à 03:11
petite précision pour ceux que cela intéressent, chez moi le test sur l'objet
$oMail [if (isset ($oMail)) ]ne marche pas,

il faut dans le fichier formRule.class remplacer :

protected $_aElementValue;
par
public $_aElementValue;

et effectuer le test sur $oMail->_aElementValue
par exemple :
if($oMail->_aElementValue!="") {
$oMail->setIsEmail ('Votre email est invalide !');
}

voila :-)
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
19 déc. 2007 à 15:26
@codefalse : je réfléchis à une solution dans la soirée et je te tiens informé.

++
psykoboy57 Messages postés 12 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 10 avril 2008
19 déc. 2007 à 15:16
oui c'est finalement ce que j'ai fini par faire !
Merci a toi ;)
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
19 déc. 2007 à 14:51
Bon, ca y est c'est mis à jour :)
Donc par contre dans le zip il n'y a pas le package genericException, faites attentions ! :)
Vous pourrez le trouver sur mes autres classes ! :p

@Webdeb : je t'ai pas oublié pour ta classe de Rib, mais je suis bloqué sur le comment faire !! :/
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
19 déc. 2007 à 09:59
@PsykoBoy57 : par contre, par rapport à tes remarques, il y a un point qui est à éclaircir : tu demande à faire en sorte que si le mail est vide, la fonction isEmail doit te retourner true quand meme, elle doit retourner false uniquement si le mail n'est pas valide. Hors, sémantiquement, la fonction isEmail doit retourner false si la chaine est vide, car une chaine vide n'est pas un email valide !
La possibilité, c'est de tester :

$oMail = new formRule ('email');
if (isset ($oMail)) {
$oMail->setIsEmail('Vous devez spécifier une adresse email valide !');
}

-------------------------
@Webdeb : Si je met une fonction pour valider un numéro de RIB, je suis fasse à un probleme. Généralement, les différentes valeurs sont séparées par des champs différents, je ne pourrai donc pas faire un $oRib = new formRule ('rib');
La seule possibilité que je vois, serait de faire, dans le formulaire, des champs name="rib[]" pour chaques parties du rib, dans l'ordre, et de passer rib dans la classe formRule.

Qu'en pense-tu ?
---------------------------
A mon avis, il faut que je gère de meilleure facon les éléments en Array, ne serait-ce que pour valider les listes à puces tel que celles de Psykoboy.

Enfin bref j'attends vos réponses histoire de voir :)
psykoboy57 Messages postés 12 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 10 avril 2008
19 déc. 2007 à 01:17
des news par ici ? :)
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
16 déc. 2007 à 00:32
t'inquiete, je vais m'en occuper ! :)
psykoboy57 Messages postés 12 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 10 avril 2008
15 déc. 2007 à 21:52
sauf le mail non obligatoire que j'ai pas regarde
psykoboy57 Messages postés 12 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 10 avril 2008
15 déc. 2007 à 21:48
rbon en faisant la modif du commentaire du 14/12/2007 21:20:46 ca marche !
J'ai juste eu a rajouter une fonction __get dans la classe formRule pour recuperer le __sElementValue.
Je ne sais pas si tu compte faire autrement mais moi ca marche.
Du coup on recupere le array avec $pref->_sElementValue (si $pref est la regle sur un champ multiple)

Voila
tout marche now
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
15 déc. 2007 à 09:51
exact, là ya un sérieux probleme ...
je vais me pencher dessus !
psykoboy57 Messages postés 12 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 10 avril 2008
15 déc. 2007 à 03:31
Bon, je reviens a la charge ^^

Toujours concernant les listes multiples, je ne parviens pas a recuperer les differentes valeurs ! Je me sert de ton astuce pref.0, mais comment recuperer toutes les valeurs, si l'utilisateur entre 4 choix par exemple ? pref.0 me retourne uniquement le premier choix.
Ou j'ai pas compris comment faire, ou on peux pas ^^

Je pourrai trifouiller la source moi meme, mais je prefere te le dire, pour que ca serve a tout le monde. Qui plus est tu es plus apte a modifier ta source que moi.
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
14 déc. 2007 à 22:59
Pas de quoi :)

Je trouvai que mon code avait sa place avec le tien ;)
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
14 déc. 2007 à 22:48
L'idée est sympa, il faut que je fasse une mise à jour de toute facon, je regarderai pour inclure ton code :)

Merci en tout cas :)
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
14 déc. 2007 à 22:42
Salut Codefalse,

Si ça t'intéresse, je viens de publier sur mon site une classe permettant de valider un numéro de compte bancaire français. Tu pourrais intégrer ces vérifications je pense dans la classe de règle.

Tout est ici : http://www.apprendre-php.com/tutoriels/tutoriel-32-classe-de-controle-et-de-validation-de-rib-francais.html

Je n'ai pas réussi à la déposer sur PHPCS car visiblement l'envoi de sources déconne en ce moment :(

++

Hugo.
psykoboy57 Messages postés 12 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 10 avril 2008
14 déc. 2007 à 22:25
yep ca marche merci
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
14 déc. 2007 à 21:20
Note : je ferai une mise à jour prochainement !
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
14 déc. 2007 à 21:20
En effet, si on met rien tu a une erreur, faut corriger ca :p

Tu peux remplacer
# foreach ($sSElts as $sCurrentElement) {
# if (isset ($aToElement[$sCurrentElement]))
# $aToElement = $aToElement[$sCurrentElement];
# else
# throw new formRuleException ('ERR_FORMRULE_ELEMENT_NOT_EXISTS', $sElement, __LINE__, __FUNCTION__);
# }
#
# $this->_sElementValue = $aToElement;

par

# foreach ($sSElts as $sCurrentElement) {
# if (isset ($aToElement[$sCurrentElement]))
# $aToElement = $aToElement[$sCurrentElement];
# else {
# $aToElement = '';
# break;
}
# }
#
# $this->_sElementValue = $aToElement;

Dans la classe formRule, dans le constructeur
(désolé pour la mise en forme)

Normalement ca devrait marcher ... normallement
psykoboy57 Messages postés 12 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 10 avril 2008
14 déc. 2007 à 20:48
Ok en fait si je fait un print_r de mon tableau POST lors de la validation du sondage, je vois que le champ "pref" n'apparait pas.
Apres lui avoir mis une valeur selesctionnee par defaut, ca marche...

Mais j'aimerais eviter ! Je ne comprends vraiment pas pourquoi ca marche chez toi et pas chez moi. peux tu tester avec le bout de formulaire suivant :
// faites pas attention a l'id du select, je pense pas que ca joue et en plus il est pas beau
<select size="9" MULTIPLE="MULTIPLE" id="pref[]" name="pref[]">
<option value="francaise">Chansons francaise</option>
<option value="electro">Electro</option>
<option value="rap">Rap</option>
<option value="reaggae">Reaggae</option>
<option value="autre">Autre</option>
</select>

et la verif suivante :
$fPref = new formRule('pref.0');
$fPref->setIsRequired('Donnes nous tes preferences musicales !');

Je comprends vraiment pas
psykoboy57 Messages postés 12 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 10 avril 2008
14 déc. 2007 à 20:33
Je viens de verifier, j'ai bien mis un zero... mais il veux pas... J'avoue ne pas savoir d'ou ca viens
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
14 déc. 2007 à 19:46
tu a bien mis pref.0 (zéro) ?

Ca marche chez moi ! ?! :p
psykoboy57 Messages postés 12 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 10 avril 2008
14 déc. 2007 à 15:39
hehe merci pour tes reponse, je vais tester tout ca !
Donc pour le
$oWeb = new formRule ('web');
$oWeb->setIsUrl ('l\'Url de votre site est invalide !');
Je voulais en fait parler du mail, il faut donc lire :
$oMail = new formRule ('email');
$oMail->setIsEmail ('Votre email est invalide !');
J'ai mal copie dans mon message. C'est l'histoire du mail non obligatoire a verifier en fait.

$oGenre->setIsNotEqual ('---------', 'Veuillez choisir un élément valide !');
C'est la seul qui marche. Ne pas mettre value dans l'option equivaut a prendre le label comme valeur.

L'ajout d'une regle
$fPref = new formRule('pref.0');
ne marche pas : Uncaught formRuleException :: __construct() -> Element pref.0 does not exists.
La declaration dans mon formulaire :
<select size="9" multiple="multiple" id="pref" name="pref[]">

Tout me semble bon non ?

Merci encore ami belfortain
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
14 déc. 2007 à 09:47
"Je me doute que ca a aucun rapport avec ta classe mais mettre value="null" marche-t-il ? est ce considerer comme "null" ou null" Je pense que ce sera considéré comme "null" et pas comme quelque chose de vide.

"Ne peut-on pas valider un email s'il n'est pas obligatoire ? (il me met un email invalide meme si le champs n'est pas rempli)" => Je vais voir ca

"$oWeb = new formRule ('web');
$oWeb->setIsUrl ('l\'Url de votre site est invalide !');

Ne semble pas marcher." => Je vais voir ca aussi !
Pour l'url, ca marche chez moi. Quelle url tu a mis qui ne fonctionne pas ?

Pour ta liste à choix multiple, tu veux faire quoi ? savoir si une valeur au moin à été spécificiée ? si oui tu peux faire

$oRule = new formRule ('animaux.0');
$oRule->setIsRequired ('Au moin un choix doit être effectué !');

Ca marche. En fait, le . dans le formRule, spécifie un tableau, un elt1.elt2.etl3 correspond à elt1[elt2[elt3]]; Donc animaux.0 correspond à animaux[0]
Tu peux aussi faire un $oGenre->setIsNotEqual ('---------', 'Veuillez choisir un élément valide !'); Pour la premiere liste histoire d'obliger de choisir un autre élément.

Merci beaucoup ! c'est grâce à des gens comme toi que les codes évoluent :)
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
14 déc. 2007 à 07:24
je vais faire les tests en conséquences, mais pour pas que tu attende trop, pour la liste simple, si tu à
<select name="genre">
<option>---------</option
<option value="H">Homme</option>
<option value="F">Femme</option>
</select>

Tu fait un simple isRequired sur genre et ca devrait marcher.
Je vais tester cela et trouver une solution pour la liste à choix multiples ! :)
psykoboy57 Messages postés 12 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 10 avril 2008
14 déc. 2007 à 04:24
Salut, encore moi

Pour ce qui est des listes simples, j'ai fait une fonction isDifferent sur la base de isEqual en mettant l'option
<option value="null">------------</option>
C'est un peu du bricolage mais ca marche.

Par contre pour les listes multiples, tjs rien.
Si je met le nom "animaux[]" en nom de regle, il ne me trouve pas l'objet ! Une idee ?

$oWeb = new formRule ('web');
$oWeb->setIsUrl ('l\'Url de votre site est invalide !');

Ne semble pas marcher. Ne peut-on pas valider un email s'il n'est pas obligatoire ? (il me met un email invalide meme si le champs n'est pas rempli)

Merci encore pour ta classe.
psykoboy57 Messages postés 12 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 10 avril 2008
13 déc. 2007 à 15:38
Ben par exemple ma liste etant
<select name="sexe" id="sexe">
<option>------------</option>
<option value="femme">Femme</option>
<option value="homme">Homme</option>
</select>

Verifier que l'utilisateur a selectionner autre chose que le premier element.
J'aimerais considerer cet element comme valeur null. Je me doute que ca a aucun rapport avec ta classe mais mettre value="null" marche-t-il ? est ce considerer comme "null" ou null ?

autre ca, une liste a selection multiple du genre :
<select name="animaux[]">
<option>Chien</option>
<option>Chat</option>
<option>Tortue</option>
<option>Peruche</option>
</select>
l'ajut d'une regle sur animaux[] ne marche pas. (si j'ai correctement fait mes test hier soir). La aussi, verifier qu'au moins une valeur est choisie.

Voila merci encore
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
13 déc. 2007 à 13:29
qu'est-ce que tu veux tester dans la liste exactement ?
psykoboy57 Messages postés 12 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 10 avril 2008
13 déc. 2007 à 02:56
Tres utile ta classe !
Le code est propre.
Petite question, comment faire pour verifier les listes " (choix multiples, etc...)
Je n'ai rien trouve concernant cela, et j'aimerais utiliser ta classe pour verifier l'integralite de mon form.

Merci encore
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
7 déc. 2007 à 13:51
J'y ai pensé à cela, mais le truc, c'est que je veux vraiment être indépendant du code html derriere (pourquio obligatoirement du code html ? pourquoi pas autre chose ?).
Si je voulais utiliser du code html, j'aurai pris le pacakage PEAR HTML_QUICKFORM2 (je me suis basé sur leur idée pour le formualaire).
Il est tres complet et plutot agréable à utiliser.
Sauf que je ne veux QUE analyser le formulaire, de facon à être libre derriere de la mise en place de mon formulaire (ca devient vite le bordel quand on veux mettre des css particuliers, une mise en page originale, car la classe génére un html précis).
Bon, je peux toujours sortir un xml qui sera interprété par la suite en xslt. Mais perso je préfére faire le code html par un template ou quelque chose du genre :)

Apres rien ne t'oblige à le faire ;)
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
7 déc. 2007 à 09:19
C'est vraiment mieux ;)

Ainsi nous avons une véritable séparation entre la gestion globale du formulaire et les régles. Il sera donc plus facile de faire évoluer la classe de règles de cette manière, c'est à dire d'écrire de nouvelles règles.

Je pense que tu pourrais pousser le développement encore plus loin en intégrant une classe qui permettent de générer le formulaire. Du genre :

$oForm = new MyForm();
$oForm->addFieldset();
$oForm->addLegend('Informations personnelles');
// Le array permet d'ajouter des attributs html facultatif
$oForm->addInputBox('Votre nom','nom','', array('maxlength'=>40,'size'=>20));
$oForm->addInputBox('Votre prénom','prenom','', array('maxlength'=>40,'size'=>20));
$oForm->closeFieldset();
$oForm->addFieldset();
$oForm->addLegend('Remarques');
$oForm->addTextarea('Vos commentaires','remarques','', 25, 12, array('class'=>tinymce)); // 25 et 12 == cols et rows
$oForm->addSubmitButton('Valider','soumission');

Quand tu fais $oForm->generate(), le code HTML du formulaire est généré.

++
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
7 déc. 2007 à 04:02
Alors voila Webdeb ! j'ai mis la source à jour, avec la modification du code comme prévu.
Dit moi ce que tu en pense :)
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
3 déc. 2007 à 17:37
@Iomega : Désolé pour le temps de la réponse. En fait, dans le concept, tu instancie cette classe, tu lui met des regles pour l'élement que tu veux analyser, ensuite tu fait une simple condition $oFH->validate(). Si la validation est bonne, tu procede à la suite (ajout dans la base de donnée par exemple). Sinon (else) tu affiche le formulaire. Le premier, comme le formulaire n'a pas été validé, ca ira forcément dans le else, ensuite, ca ira soi dans le if, si les règles ont été vérifiées, sinon, ca retournera dans le else.
Quand tu es dans le else, tu peux afficher les valeurs pour chaques elements du formulaire, ou afficher une erreur pour chaque éléments ou à la fin pour tous les éléments, ou pour un élément. Les possibilités sont étendues !

Je veux pas t'expliquer tout en détails, ce serait de donner à manger du prémaché :p Regarde le code et essaye de le comprendre par toi même. Mais si tu bloque sur un point, n'hésite pas, je t'aiderai sans soucis ! :)
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
3 déc. 2007 à 14:11
euh perso la deuxieme fois c'est pire ;)
Je vais voir ce que je peux faire la dessus, je ferai une mise à jours prochainement, je vous tiens au courant :)

Merci en tout cas :)
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
3 déc. 2007 à 13:24
Je reposte le code vu qu'il s'est mal indenté et que j'ai fait une erreur à un endroit :

public function validate()
{
$oRule = null;

// On parcourt la copie du tableau $_POST (j'admets que tu fonctionne ainsi)
foreach($aFormFields as $fieldName => $fieldValue)
{
// On récupère l'objet rule correspondant à chaque champ
if(!empty($this->_aRules[ $fieldName ]))
{
$oRule = $this->_aRules[ $fieldName ];

// On vérifie chaque règle
if(true === $oRule->getIsRequired())
{
// On teste la valeur
if(empty($fieldValue))
{
throw new FormHandlerException('Le champ '. $fieldName .' ne peut rester vide !');
}

// On teste la longueur min
if(strlen($fieldValue) < $oRule->getMinLength())
{
throw new FormHandlerException('Le champ '. $fieldName .' doit avoir une valeur minimale de '. $oRule->getMinLength() .' caractères !');
}

// On teste la longueur max
if(strlen($fieldValue) > $oRule->getMaxLength())
{
throw new FormHandlerException('Le champ '. $fieldName .' doit avoir une valeur maximale de '. $oRule->getMaxLength() .' caractères !');
}

}
}
}
}

++
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
3 déc. 2007 à 13:21
>> Sinon le point qui me chagrine à propos de cette méthode, c'est la validation :
>> On peux faire un $oFH->validate () mais ca va devoir appeler en boucle les classes filles pour voir comment s'est passé les règles.
>> Une idée à propos de ca ?

Nan je ne vois pas où est le problème. On peut améliorer mon exemple comme ceci en fait :

$oFH = new formHandler($_POST, $_FILES);

$oRule = new FormRule();
$oRule->setIsRequired(true);
$oRule->setMinLength(8);
$oRule->setMaxLength(15);
...
$oFH->addNewRule('login', $rule); // Où login est le nom du champ à traiter

Dans ta classe FormHandler, tu as un attribut privé qui est un tableau associatif des règles. Ce qui donne :

class FormHandler()
{
private $_aRules = array();

public function addNewRule($sFormField, $oFormRule)
{
$this->_aRules[ $sFormField ] = $oFormRule;
}
}

Donc tu vas stocker les objets de type FormRule dans ton tableau associatif de ta classe FormHandler. Ainsi, dans ta méthode qui valide les données tu peux directement accéder aux informations des objets FormRule de cette manière :

public function validate()
{
$oRule = null;

// On parcourt la copie du tableau $_POST (j'admets que tu fonctionne ainsi)
foreach($aFormFields as $fieldName => $fieldValue)
{
// On récupère l'objet rule correspondant à chaque champ
if(!empty($this->_aRules[ $fieldName ]))
{
$oRule = $this->_aRules[ $fieldName ];

// On vérifie chaque règle
if(true === $oRule->getIsRequired)
{
// On teste la valeur
if(empty($fieldValue))
{
throw new FormHandlerException('Le champ '. $fieldName .' ne peut rester vide !');
}
// On teste la longueur min
if(strlen($fieldValue) < $oRule->getMinLength())
{
throw new FormHandlerException('Le champ '. $fieldName .' doit avoir une valeur minimale de '. $oRule->getMinLength() .' caractères !');
}

// On teste la longueur max
if(strlen($fieldValue) > $oRule->getMaxLength())
{
throw new FormHandlerException('Le champ '. $fieldName .' doit avoir une valeur maximale de '. $oRule->getMaxLength() .' caractères !');
}

}
}
}
}

Tu vois globalement comment tu pourrais procéder ?

++

Hugo.
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
3 déc. 2007 à 12:59
Bon, il reste certainement des modifications à faire, je vais encore travailler dessus, notament sur ce qu'a dit WebDeb, mais il est déjà suffisament fonctionnel :)
cs_Zephyr11 Messages postés 4 Date d'inscription lundi 10 juillet 2006 Statut Membre Dernière intervention 14 novembre 2010
3 déc. 2007 à 12:14
Débutant et donc incapable de juger objectivement, mais ce code est parfaitement en phase avec ce dont j'avais besoin. Merci !
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
3 déc. 2007 à 09:45
l'idée est bonne, tres bonne ! :)
Juste deux choses :
J'aurai vu juste les choses à peine différement :

$oFH = new formHandler ($_POST, $_FILES); // La on est d'accords :)
$oLoginRule = $oFH->newRule ('login'); // La petite différence :)
$oLoginRule->setIsRequired(true);
$oLoginRule->setMinLength(8);
$oLoginRule->setMaxLength(15);

Mais pour le concept c'est ptete meilleur, je vais travailler dessus !
Sinon le point qui me chagrine à propos de cette méthode, c'est la validation :
On peux faire un $oFH->validate () mais ca va devoir appeler en boucle les classes filles pour voir comment s'est passé les règles.
Une idée à propos de ca ?
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
2 déc. 2007 à 23:54
Je pense que tu aurais pu faire une classe dédiée pour les règles et les filtres. Et faire par exemple :

$oFH = new formHandler ($_POST, $_FILES);

$rule = new FormRule('login');
$rule->setIsRequired(true);
$rule->setMinLength(8);
$rule->setMaxLength(15);
...

$oFH->addRule($rule);

++
cs_iomega Messages postés 144 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 1 septembre 2008
30 nov. 2007 à 10:26
Salut c'est super ta class mais moi je suis débutant et je voudrai savoir si tu pouvais faire d'autres exemples
Merci beaucoup
Rejoignez-nous