begin process at 2012 02 15 09:53:38
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > [PHP5] - CLASSE DE VÉRIFICATION DE FORMULAIRE

[PHP5] - CLASSE DE VÉRIFICATION DE FORMULAIRE


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :10 443 / 697

Auteur : codefalse

Ecrire un message privé
Site perso
Commentaire sur cette source (46)
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

Les Membres Club peuvent 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 :)

 Sources du même auteur

[PHP5] MULTI-THREADING : ACCÉLÉRATION DU TEMPS DE TRAVAIL D'...
Source avec Zip GESTIONNAIRE DE MODÈLES SQL
Source avec Zip [PHP5] - SIMPLE CLASSE D'ENVOI D'EMAIL
Source avec Zip CATAPULT FRAMEWORK, VERSION 0.1 : "ORIGIN"
[PHP5] - CLASSE D'UPLOAD

 Sources de la même categorie

CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter
Source avec Zip SIMPLETEMPLATE par thunderhunter
Source avec Zip Source avec une capture VOIR QUI VISITE VOTRE SITE par Dariumis
Source avec Zip CLASS SIMPLE CBASEDONNEE par smag42

 Sources en rapport avec celle ci

Source avec Zip VÉRIFICATION DE FORMULAIRE EN PHP par psonic13
Source avec Zip Source avec une capture PHPJSVFORM : DES CLASSES PHP, DES JAVASCRIPTS POUR CRÉER FAC... par synanceia
Source avec une capture GÉNÉRATION/GESTION DE FORMULAIRE VIA FICHIER XML par Garno
Source avec Zip Source avec une capture GÉNÉRATEUR DE FORMULAIRE [AJAX][PHP5] par Morphinof
PHP5 - CLASSE DE VÉRIFICATION DE FORMULAIRE SIMPLE par NainPuissant

Commentaires et avis

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

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

++

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 ?

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 !

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

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.

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

}
}
}
}

++

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

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

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

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

++

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

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

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

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

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

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.

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

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

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

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

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

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

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

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

Note : je ferai une mise à jour prochainement !

Commentaire de psykoboy57 le 14/12/2007 22:25:00

yep ca marche merci

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.

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

Commentaire de webdeb le 14/12/2007 22:59:55

Pas de quoi :)

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

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.

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

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

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

Commentaire de psykoboy57 le 15/12/2007 21:52:40

sauf le mail non obligatoire que j'ai pas regarde

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

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

Commentaire de psykoboy57 le 19/12/2007 01:17:53

des news par ici ? :)

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

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

Commentaire de psykoboy57 le 19/12/2007 15:16:50

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

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

++

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



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

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

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


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

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

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

Commentaire de Banish le 02/07/2010 14:29:00

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

 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

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,889 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales