IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Form PHP Discussion :

Comparer deux champs


Sujet :

Zend_Form PHP

  1. #1
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut Comparer deux champs
    salut,

    j'ai un grand formulaire dans lequel on doit spécifier une heure d'ouverture et une autre de fermeture,

    j'ai essayé de créer un Validateur qui me permetterai de verifier si l'heure de fermeture est plus grande que celle d'ouverture,

    mais j'arrive pas à récuperer la valeur de l'heure d'ouverture (sachant que j'applique le validateur sur l'heure de fermeture)

    voici le code de mon validateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    <?php
    	Class CompareHeuresValidator  extends Zend_Validate_Abstract {
    		const COMPARE = 'compare';
     
    		protected $_messageTemplates = array(self::COMPARE => "L'heure d'ouverture ne peut être plus grande que celle de fermeture ('%value%')");
    		protected $_heure;
     
    		public function __construct($heure){
    			echo "construct heure : ".$heure;
    			$this->_heure = $heure;
    		}
     
    		public function isValid($value){
    			$this->_setValue($value);
    			try{
    				$tab1=explode(":",$this->_heure);
    				$tab2=explode(":",$value);
    			}
    			catch(Exception $e){
    				$this->_error();
    				return false;
    			}
     
    			if ((int)$tab1[0]>(int)$tab2[0]){
    				if ((int)$tab1[1]>(int)$tab2[1]){
    					$this->_error();
    					return false;
    				}
    			}
    			echo "heure : ".$this->_heure;
    			//echo $heure;
    			$this->_error();
    			return false;
    		}
    	}
    et voici une partie de mon code de création du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ........
    	$ouvert = new Zend_Form_Element_Text('h_ouvert');
    	$ouvert->setLabel('Heure d\'ouvertue : ');
     
    	$ferme = new Zend_Form_Element_Text('h_ferme');
    	$ferme->setLabel('Heure de fermeture : ')
    	->addValidator(new CompareHeuresValidator($ouvert->getValue()));
    ........
    Merci d'avance
    Bien cordialement

  2. #2
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (strtotime($ferme)>strtotime($ouvert));
    Retourne true si la saisie est valide, false dans le cas contraire...

    Je ne sais pas si c'est la réponse que tu attendais...
    De retour parmis vous après 10 ans!!

  3. #3
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par Sub0 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (strtotime($ferme)>strtotime($ouvert));
    Retourne true si la saisie est valide, false dans le cas contraire...

    Je ne sais pas si c'est la réponse que tu attendais...
    salut,

    Malheuresement non Sub0

    j'ai un problème concernant la récuperation de la valeur de l'heure d'ouverture, je ne sais pas comment le faire sachant que j'applique le validateur sur l'heure de fermeture

    Merci
    Bien cordialement

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    Dans le constructeur de ton valideur, tu mets l'objet request en paramètre ainsi que l'id du champ avec lequel tu souhaites comparer ta date. Dans ton valideur, tu récupères la date en question par $request->getPost(), et tu fais ta comparaison.

  5. #5
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par vg33 Voir le message
    Dans le constructeur de ton valideur, tu mets l'objet request en paramètre ainsi que l'id du champ avec lequel tu souhaites comparer ta date. Dans ton valideur, tu récupères la date en question par $request->getPost(), et tu fais ta comparaison.
    salut,

    je dirai pas non pour un petit bout de code, parce que ce n'est pas très clair

    Merci d'avance
    Bien cordialement

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    Ton valideur (c'est juste un exemple : à toi d'implémenter les tests) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    class My_Validate_Date extends Zend_Validate_Abstract
    {
     
        const DATE = 'invalidDate';
     
        /**
         * Messages d'erreur
         * 
         * @var array
         */
        protected $_messageTemplates = array(
            self::DATE => "'%value%' must be later than %openDate%."
        );
     
        /**
         * Heure d'ouverture
         * 
         * @var string
         */
        protected $_openDate;
     
        /**
         * variables supplémentaires pour les messages d'erreur
         *
         * @var array
         */
        protected $_messageVariables = array(
            'openDate' => '_openDate'
        );
     
     
        /**
         * Récupère les options de validation
         *
         * @param  string $openDate Heure d'ouverture
         * @return void
         */
        public function __construct($openDate)
        {
            $this->_openDate = $openDate;
        }
     
        /**
         * Defini par Zend_Validate_Interface
         *
         * @param  mixed $value La valeur du champ
         * @return boolean
         */
        public function isValid($value)
        {
            $this->_setValue($value);
     
            // implémente les tests
            if ($value <= $this->_openDate) {
                $this->_error();
                return false;
            }
     
            return true;
        }
    }
    Et dans ton form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $closeDate = new Zend_Form_Element_Text('closeDate');
    if ($this->_request->isPost()) {
        $post = $this->_request->getPost();
        $closeDate->addValidator(new My_Validate_Date($post['openDate']), true);
    }
    Ici, pour simplifier, je n'ai pas passé l'objet request en paramètre mais directement la date d'ouverture : ça permet de réutiliser ce valideur pour n'importe quelle date devant être inférieure à une autre.

  7. #7
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    merci beaucoup vg33 pour ta réponse,
    mais malheureusement ça passe pas, quand j'ai ajouter les lignes de code dans la classe de mon formulaire, ça me donne l'erreur suivante :

    Fatal error: Call to a member function isPost() on a non-object in C:\wamp\www\morogoo\application\models\FormulaireMonument.php on line 74

    Merci
    Bien cordialement

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    Mon exemple de code concerne un controller. Si tu utilises une classe spécifique pour ton form (ce qui est une bonne pratique ), tu dois lui transmettre l'objet request.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class FormulaireMonument {
    public function __construct($request) {
        $this->_request = $request;
        // ton code ici
    }
    }
    Tu peux alors utiliser l'objet request dans ta classe.

  9. #9
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    Merci beaucoup vg33 pour ton aide,
    j'ai essayé d'envoyé l'objet request au formulaire mais ça marche pas, il me donne une erreur quand j'essaye de faire appel à la fonction getPost de Request dans la classe du formulaire,

    Mais j'ai pu hamdoulilah contourner le problème en récuperant la valeur du champ dans le controleur et en l'envoyant vers le formulaire comme parametre,
    ainsi je peux le récuperer au niveau de mon formulaire pour le donner par la suite au validateur,

    et voici un petit bout de code pour ca :
    Le controleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    .........
    	$val=$this->_request->getPost('champ1');
    	$form = new FormulaireMonument($val);
    .........
    La classe du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class FormulaireMonument {
    public function __construct($val) {
         $champ1=new Zend_Form_Element_Text('champ1');
         $champ2=new Zend_Form_Element_Text('champ2');
         $champ2->addValidator(new MonValidateur($val));
         ....
    }
    }
    Le validateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class MonValidateur {
    		protected $_val;
     
    		public function __construct($val){
    			$this->_val = $val;
    		}
     
                    ......
    }
    Voilà
    Merci encore une fois vg33

    Bien cordialement

  10. #10
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut.

    Maintenant que le sujet est résolu, j'ai une idée pour toi, mais rien à voir avec la class objet PHP :
    Avec Javascript, choisir les dates directement dans un calendrier dynamique.
    Ainsi, ne permettre que la sélection d'une date supérieure lors du second choix...
    De retour parmis vous après 10 ans!!

  11. #11
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par Sub0 Voir le message
    Salut.

    Maintenant que le sujet est résolu, j'ai une idée pour toi, mais rien à voir avec la class objet PHP :
    Avec Javascript, choisir les dates directement dans un calendrier dynamique.
    Ainsi, ne permettre que la sélection d'une date supérieure lors du second choix...
    salut,

    oui c'est une très bonne idée sub0,
    j'ai fait un peu le tour et j'ai trouvé que ZEND possède un truc similaire : Zend_Dojo_Form_Element_DateTextBox, je vais essayer de l'utiliser, si ca marche pas je me retournerai vers des framework JS

    Merci beaucoup sub0

    Bien cordialement

  12. #12
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    Très bonne idée de Sub0, car ce sera plus ergonomique !
    En revanche, ne change rien sur le valideur : le principe est toujours de ne jamais faire confiance aux données utilisateur (GPC), même s'il y a validation par javascript.

  13. #13
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Je pense que tu n'auras aucun mal à trouver les sources d'un calendrier dynamique et à l'intégrer à ton formulaire.
    La difficulte sera de modifier ce code pour désactiver toutes les dates qui précédent la date de référence que tu lui donneras en paramètre.
    J'imagine que ça n'existe pas... D'où le challende

    Tiens nous au jus, ce sera avec plaisir si nous pouvons t'aider!
    A+

    [EDIT] A la limite, j'imagine 2 paramètres :

    - dateref : la date de référence (type string ou integer)
    - lockmin : bloque toutes les dates qui précédent ou qui succèdent la date de référence (type boolean)

    Comme ça, si l'utilisateur sélectionne d'abord la date maximale avant la date minimale, tu pourras désactiver toutes les dates supérieures dans le 2ème calendrier.
    De retour parmis vous après 10 ans!!

  14. #14
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    Bonne nouvelle SubO
    Le datepicker de jQuery UI fait ça en quelques lignes de code :
    http://ui.jquery.com/repository/tags...#ui.datepicker (voir Another Date Range).

  15. #15
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Ahhh! Alors vous voyez...
    Je vous l'avais bien dis que ça existait déjà (j'en étais sûr) !

    Plus sérieusement : Bravo vg33, rapide et efficace!
    Petite note au passage : C'est pas SubO, mais Sub0!
    Je sais, ça chipote, mais j'tiens beaucoups à mon zéro
    De retour parmis vous après 10 ans!!

  16. #16
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    Citation Envoyé par Sub0 Voir le message
    Petite note au passage : C'est pas SubO, mais Sub0!
    Je sais, ça chipote, mais j'tiens beaucoups à mon zéro
    C'est noté
    Petite note à mon tour : on a beau avoir le même âge, tu as une bien meilleure vue que moi puisque je n'avais pas vu la différence

  17. #17
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par vg33 Voir le message
    Bonne nouvelle SubO
    Le datepicker de jQuery UI fait ça en quelques lignes de code :
    http://ui.jquery.com/repository/tags...#ui.datepicker (voir Another Date Range).
    salut,

    il est hyper cool ce nouveau datePicker,
    Merci beaucoup encore une fois sub0 et vg33

    Bien cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] comparer deux champs texte
    Par Waldner11 dans le forum Excel
    Réponses: 1
    Dernier message: 02/06/2009, 16h48
  2. Comparer deux champs concaténés
    Par mouaa dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/05/2008, 15h26
  3. Filtrer une table en comparant deux champs entre eux
    Par damene dans le forum Débuter
    Réponses: 13
    Dernier message: 12/04/2008, 19h10
  4. comparer deux champs d un formulaire
    Par williams59 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 21/12/2007, 11h38
  5. Editeur de recherche - comparer deux champs
    Par sscouby dans le forum 4D
    Réponses: 1
    Dernier message: 17/10/2007, 12h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo