Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

[PHP5] - CLASSE DE VÉRIFICATION DE FORMULAIRE


Information sur la source

Catégorie :Class et Objet ( POO ) Classé sous : formulaire, vérification, form, analyse, poo Niveau : Initié Date de création : 29/11/2007 Date de mise à jour : 19/12/2007 14:49:04 Vu / téléchargé: 6 865 / 457

Note :
7,5 / 10 - par 2 personnes
7,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (45)
Ajouter un commentaire et/ou une note

Description

Bonjour à tous ! :)
Voila, je devais me faire une classe afin de vérifier les entrées d'un formulaire. J'ai fait trois classes et deux gestionnaires d'erreur que vous trouverez dans le zip.

Alors la classe de vérification (formCheck) s'appele en statique. Du coup, vous pouvez l'appeler pour n'importe quel usage tant qu'elle reste accessible là ou vous l'appelez :)

Alors voila comment cela se passe.
Vous instanciez la classe formHandler.
Ensuite vous instanciez autant de formRule que vous voulez pour vos éléments (une instance de formRule pour un élément).
Vous leur appliquer des regles définies dans formCheck, en utilisant : setNomFunctionDansFormCheck (mettre le set avant), avec en premier parametre (optionnel), une valeur à transmettre à la fonction de formCheck (int, string ou array), et en deuxieme parametre (ou premier s'il n'y a rien à passer à la fonction formCheck), le message d'erreur à afficher.

Ensuite vous pouvez mettre votre instance de formRule pour l'element dans la méthode addRule de formHandler.
(Vous pouvez mettre toutes les instances à la suite dans addRule, ou appeler addRule pour chaques éléments)

La fonction validate de formHandler va vérifier s'il n'y a pas eu d'erreurs retournée par les instances de formRule.
Vous pouvez afficher la valeur de l'élément dans l'instance de formRule juste en appelant l'instance (voyez l'exemple) (utilisation de __toString ())

Vous pouvez récuperer une erreur, toutes les erreurs pour un élément ($oFormRuleInstance->getError ($NumErreur) ou $oFRI->getAllErrors ()), ou juste récuperer la premiere erreur apparue : $oFormHandler->getFirstError () (voir exemple).
S'il n'y a pas eu d'erreur, getFirstError retourne null.

Wala :)

Voici le résultat :
 

Source

  • <?php
  • require_once ('genericException/genericException.class.php');
  • require_once ('formHandler/formRule.class.php');
  • require_once ('formHandler/formHandler.class.php');
  • $oFh = new formHandler ();
  • $oLogin = new formRule ('login');
  • $oLogin->setIsRequired ('Veuillez indiquer un pseudo !');
  • $oLogin->setMaxLength (25, 'Votre pseudo ne doit pas faire plus de 25 caractères !');
  • $oPass = new formRule ('passwd');
  • $oPass->setIsRequired ('Veuillez indiquer un mot de passe');
  • $oPass->setMinLength (6, 'Votre mot de passe doit avoir plus de 6 caractères');
  • $oConf = new formRule ('confpass');
  • $oConf->setIsRequired ('Veuillez indiquer une Confirmation de mot de passe');
  • $oConf->setMinLength (6, 'Votre Confirmation de mot de passe doit avoir plus de 6 caractères');
  • $oConf->setIsEqual ($oPass, 'Votre mot de passe doit être identique a sa confirmation');
  • $oMail = new formRule ('email');
  • $oMail->setIsRequired ('Votre email est obligatoire !');
  • $oMail->setIsEmail ('Votre email est invalide !');
  • $oWeb = new formRule ('web');
  • $oWeb->setIsRequired ('Votre site Web est requis !');
  • $oWeb->setIsUrl ('l\'Url de votre site est invalide !');
  • $oGenre = new formRule ('genre');
  • $oGenre->setIsRequired ('Genre requis !');
  • $oGenre->setIsNotEqual('---------', 'Veuillez choisir un genre !');
  • $oAnimaux = new formRule ('animaux');
  • $oAnimaux->setIsRequired ('Animaux requis !');
  • $oFh->addRule($oLogin, $oPass, $oConf, $oMail, $oWeb, $oGenre, $oAnimaux);
  • if ($oFh->validate ()) {
  • echo "Le formulaire à parfaitement été validé ! :)";
  • }
  • else {
  • ?>
  • <form method="post" action=".">
  • Login : <input type="text" name="login" value="<?php echo $oLogin; ?>" /><br />
  • Password : <input type="text" name="passwd" value="<?php echo $oPass; ?>" /><br />
  • Confirmation : <input type="text" name="confpass" value="<?php echo $oConf; ?>" /><br />
  • Email : <input type="text" name="email" value="<?php echo $oMail; ?>" /><br />
  • Site Web : <input type="text" name="web" value="<?php echo $oWeb; ?>" /><br />
  • <select name="genre[]">
  • <option>---------</option
  • <option value="H">Homme</option>
  • <option value="F">Femme</option>
  • </select>
  • <br />
  • <select size="9" MULTIPLE="MULTIPLE" name="animaux[]">
  • <option>Chat</option>
  • <option>Chien</option>
  • <option>Hamster</option>
  • <option>Lapin</option>
  • <option>Autre</option>
  • </select><br />
  • <?php echo $oFh->getFirstError (); ?><br />
  • <input type="submit" name="Envoyer !" />
  • </form>
  • <?php
  • }
  • ?>
<?php
require_once ('genericException/genericException.class.php');
require_once ('formHandler/formRule.class.php');
require_once ('formHandler/formHandler.class.php');

$oFh = new formHandler ();

$oLogin = new formRule ('login');
$oLogin->setIsRequired ('Veuillez indiquer un pseudo !');
$oLogin->setMaxLength (25, 'Votre pseudo ne doit pas faire plus de 25 caractères !');

$oPass = new formRule ('passwd');
$oPass->setIsRequired ('Veuillez indiquer un mot de passe');
$oPass->setMinLength (6, 'Votre mot de passe doit avoir plus de 6 caractères');

$oConf = new formRule ('confpass');
$oConf->setIsRequired ('Veuillez indiquer une Confirmation de mot de passe');
$oConf->setMinLength (6, 'Votre Confirmation de mot de passe doit avoir plus de 6 caractères');
$oConf->setIsEqual ($oPass, 'Votre mot de passe doit être identique a sa confirmation');

$oMail = new formRule ('email');
$oMail->setIsRequired ('Votre email est obligatoire !');
$oMail->setIsEmail ('Votre email est invalide !');

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

$oGenre = new formRule ('genre');
$oGenre->setIsRequired ('Genre requis !');
$oGenre->setIsNotEqual('---------', 'Veuillez choisir un genre !');

$oAnimaux = new formRule ('animaux');
$oAnimaux->setIsRequired ('Animaux requis !');

$oFh->addRule($oLogin, $oPass, $oConf, $oMail, $oWeb, $oGenre, $oAnimaux);

if ($oFh->validate ()) {
	echo "Le formulaire à parfaitement été validé ! :)";
}
else {
	?>
	<form method="post" action=".">
	Login : <input type="text" name="login" value="<?php echo $oLogin; ?>" /><br />
	Password : <input type="text" name="passwd" value="<?php echo $oPass; ?>" /><br />
	Confirmation : <input type="text" name="confpass" value="<?php echo $oConf; ?>" /><br />
	Email : <input type="text" name="email" value="<?php echo $oMail; ?>" /><br />
	Site Web : <input type="text" name="web" value="<?php echo $oWeb; ?>" /><br />
	<select name="genre[]">
		<option>---------</option
		<option value="H">Homme</option>
		<option value="F">Femme</option>
	</select>
	<br />
	<select size="9"  MULTIPLE="MULTIPLE" name="animaux[]">
		<option>Chat</option>
		<option>Chien</option>
		<option>Hamster</option>
		<option>Lapin</option>
		<option>Autre</option>
	</select><br />
	<?php echo $oFh->getFirstError (); ?><br />
	<input type="submit" name="Envoyer !" />
	</form>
	<?php
}
?>

Conclusion

Voila pour le petit exemple :)

Après modifications, cette classe permet une meilleur flexibilité pour la gestion des éléments.
Maintenant, pour la structure ou les avis, j'attends vos commentaires :)
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

07 décembre 2007 03:58:10 :
Applications des règles dans l'optique de WebDeb permettant une meilleur flexibilité :) Ajout des fonctions de vérification isUrl, isNotEqual et hasExtension.
07 décembre 2007 04:01:44 :
Quelques corrections dans la source :p
19 décembre 2007 14:49:06 :
Gestion des tableaux d'éléments, maintenant, vous pouvez spécifier un tableau dans la création de l'instance formRule : $oMonPostDeTableau = new formRule('Tableau'); voir l'exemple :) + Corrections de bugs :)

Commentaires et avis

signaler à un administrateur
Commentaire de iomega le 30/11/2007 10:26:55

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

signaler à un administrateur
Commentaire de webdeb le 02/12/2007 23:54:25

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);

++

signaler à un administrateur
Commentaire de codefalse le 03/12/2007 09:45:52 administrateur CS

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 ?

signaler à un administrateur
Commentaire de Zephyr11 le 03/12/2007 12:14:29 7/10

Débutant et donc incapable de juger objectivement, mais ce code est parfaitement en phase avec ce dont j'avais besoin. Merci !

signaler à un administrateur
Commentaire de codefalse le 03/12/2007 12:59:27 administrateur CS

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 :)

signaler à un administrateur
Commentaire de webdeb le 03/12/2007 13:21:27

>> 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.

signaler à un administrateur
Commentaire de webdeb le 03/12/2007 13:24:48 8/10

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 !');
}

}
}
}
}

++

signaler à un administrateur
Commentaire de codefalse le 03/12/2007 14:11:20 administrateur CS

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 :)

signaler à un administrateur
Commentaire de codefalse le 03/12/2007 17:37:43 administrateur CS

@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 ! :)

signaler à un administrateur
Commentaire de codefalse le 07/12/2007 04:02:27 administrateur CS

Alors voila Webdeb ! j'ai mis la source à jour, avec la modification du code comme prévu.
Dit moi ce que tu en pense :)

signaler à un administrateur
Commentaire de webdeb le 07/12/2007 09:19:56

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é.

++

signaler à un administrateur
Commentaire de codefalse le 07/12/2007 13:51:21 administrateur CS

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 ;)

signaler à un administrateur
Commentaire de psykoboy57 le 13/12/2007 02:56:45

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

signaler à un administrateur
Commentaire de codefalse le 13/12/2007 13:29:47 administrateur CS

qu'est-ce que tu veux tester dans la liste exactement ?

signaler à un administrateur
Commentaire de psykoboy57 le 13/12/2007 15:38:18

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

signaler à un administrateur
Commentaire de psykoboy57 le 14/12/2007 04:24:41

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.

signaler à un administrateur
Commentaire de codefalse le 14/12/2007 07:24:11 administrateur CS

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 ! :)

signaler à un administrateur
Commentaire de codefalse le 14/12/2007 09:47:13 administrateur CS

"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 :)

signaler à un administrateur
Commentaire de psykoboy57 le 14/12/2007 15:39:35

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

signaler à un administrateur
Commentaire de codefalse le 14/12/2007 19:46:01 administrateur CS

tu a bien mis pref.0 (zéro) ?

Ca marche chez moi ! ?! :p

signaler à un administrateur
Commentaire de psykoboy57 le 14/12/2007 20:33:58

Je viens de verifier, j'ai bien mis un zero... mais il veux pas... J'avoue ne pas savoir d'ou ca viens

signaler à un administrateur
Commentaire de psykoboy57 le 14/12/2007 20:48:57

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

signaler à un administrateur
Commentaire de codefalse le 14/12/2007 21:20:46 administrateur CS

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

signaler à un administrateur
Commentaire de codefalse le 14/12/2007 21:20:58 administrateur CS

Note : je ferai une mise à jour prochainement !

signaler à un administrateur
Commentaire de psykoboy57 le 14/12/2007 22:25:00

yep ca marche merci

signaler à un administrateur
Commentaire de webdeb le 14/12/2007 22:42:12

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.

signaler à un administrateur
Commentaire de codefalse le 14/12/2007 22:48:33 administrateur CS

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 :)

signaler à un administrateur
Commentaire de webdeb le 14/12/2007 22:59:55

Pas de quoi :)

Je trouvai que mon code avait sa place avec le tien ;)

signaler à un administrateur
Commentaire de psykoboy57 le 15/12/2007 03:31:26

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.

signaler à un administrateur
Commentaire de codefalse le 15/12/2007 09:51:05 administrateur CS

exact, là ya un sérieux probleme ...
je vais me pencher dessus !

signaler à un administrateur
Commentaire de psykoboy57 le 15/12/2007 21:48:38

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

signaler à un administrateur
Commentaire de psykoboy57 le 15/12/2007 21:52:40

sauf le mail non obligatoire que j'ai pas regarde

signaler à un administrateur
Commentaire de codefalse le 16/12/2007 00:32:20 administrateur CS

t'inquiete, je vais m'en occuper !  :)

signaler à un administrateur
Commentaire de psykoboy57 le 19/12/2007 01:17:53

des news par ici ? :)

signaler à un administrateur
Commentaire de codefalse le 19/12/2007 09:59:15 administrateur CS

@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 :)

signaler à un administrateur
Commentaire de codefalse le 19/12/2007 14:51:34 administrateur CS

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 !! :/

signaler à un administrateur
Commentaire de psykoboy57 le 19/12/2007 15:16:50

oui c'est finalement ce que j'ai fini par faire !
Merci a toi ;)

signaler à un administrateur
Commentaire de webdeb le 19/12/2007 15:26:45

@codefalse : je réfléchis à une solution dans la soirée et je te tiens informé.

++

signaler à un administrateur
Commentaire de marciv le 24/01/2009 03:11:36

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 :-)



signaler à un administrateur
Commentaire de codefalse le 24/01/2009 11:58:00 administrateur CS

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 :)

signaler à un administrateur
Commentaire de codefalse le 24/01/2009 12:00:32 administrateur CS

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 :)

signaler à un administrateur
Commentaire de marciv le 24/01/2009 18:29:54

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 :
<input name="devis_type_de_bien_autre" value="" maxlength="30" size="30" type="text">

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 (<em>Exemple : parking ouvert, commerce rdc, box etc...)</em> !');
}

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 :-)


signaler à un administrateur
Commentaire de marciv le 25/01/2009 12:54:04

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

signaler à un administrateur
Commentaire de codefalse le 25/01/2009 14:39:59 administrateur CS

à 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 :)

signaler à un administrateur
Commentaire de zipzip2005 le 08/05/2009 20:05:27

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

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

un Form dans un Form [ par stailer ] Salut tout le monde !Donc voila mon problème :J'ai un formulaire qui contient notamment un champ et une liste déroulante.Lorsque je valide 1 de ces ch 2 boutons submit dans le meme form? [ par LaurentKOogar ] Bonjour et bon début de week end à tous,ptit problème==&gt;ya 1 formulaire avec 1 champt text et dans ce formulaire il faudrait 2 boutons submit1 bout Envoyer un form par mail ! ! ! [ par laubro ] Bonjour,j'ai un formulaire que je voudrais me faire envoyer "par mail", celui-ci contien des champsclassiques : nom prenom adresse......+ 1 case texta vérification de champ d'un formulaire [ par cobrachris ] j'ai lu plusieur post mais j'ai pas vraiment trouver.Voila je vous explique rapidement.J'aimerais cr&#233;er unformulaire pour enregistrer des lieux e Problème inclusion form dans un autre form [ par 2swfan ] Bonjour tout le monde&nbsp; !Voila, je dois faire un formulaire d'ajout de cartes g&#233;ographiques. Dans ce formulaire, l'utilisateur saisit le nom, Question sur le formulaire (vérification email) [ par developvbdebut ] Bonsoir tout le mondeJe souhaiterai savoir si il y a un code qui permet de v&#233;rifier si c'est bien une adresse email qui &#224; &#233;tait rentr&# Problème de tests sur l'envoi d'un formulaire [ par seabird ] Salut a tous , J'ai un petit soucis que je n'arrive pas &#224; r&#233;soudre. En effet j'envois un formulaire par mail qui contient plusieurs champs e form reset [ par mouness ] salut a tous g un petit probleme avec mes formulaire en faite j'ai des formulaire de modification avec le quel je recupere les donnée de la base et le pb avec formulaire [ par billy67000 ] Salut, dans mon formulaire je recupere une valeur d'une base de donn&#233;e (MAX(id)): $val = .... mon form est ici &lt;form name="frm_category" act traitement de plusieurs formulaires sur une seule page php [ par arnold002 ] Bonjour à tous,J'ai un formulaire d'inscription relativement long.Actuellement, l'utilisateur remplit ce formulaire et le valide. Le traitement php se


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 1,061 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.