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 :

addValidator ne fonctionne pas dans le controleur [ZF 1.8]


Sujet :

Zend_Form PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Software engineer
    Inscrit en
    Août 2008
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Software engineer

    Informations forums :
    Inscription : Août 2008
    Messages : 139
    Par défaut addValidator ne fonctionne pas dans le controleur
    salut ,
    dans un formulaire je voudrais verifier l'existance du login dans la base de donnees ,pour la formulaire d'ajout pas de probleme en utilisant Zend_Validate_Db_NoRecordExists comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $existLoginValidator = new Zend_Validate_Db_NoRecordExists(
    		'utilisateur', 'LOGIN_UTL')
    mais pour la formulaire de modification ,zend doit chercher la valeur entrée dans la base sauf dans la ligne de l'utilisateur a modifié .
    ça serait comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $existLoginValidator = new Zend_Validate_Db_NoRecordExists(
    		'utilisateur', 'LOGIN_UTL',
    		array(
    		'field' => 'ID_UTL',
    		'value' => $id)
    		);
    j'ai pensé a ajouter un parametre au constructeur pour faire un teste et ajouter le validator adequat ,maleuheusement ce n'est pas une solution car la formulaire est instancié au debut de l'action, la valeur 'id' de la ligne n'est pas encore recupéré .

    donc j'ai penser a mettre les lignes qui font la difference entre les deux formulaires d'ajout et de modification(qui sont le Validator) dans l'action comme ça :
    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
     
    $form = new Form_utilisateur();
    $this->view->form = $form;
    $this->view->title= 'Modifier utilisateur';
     
    if ($this->getRequest()->isPost()) {
    $formData = $this->getRequest()->getPost();
    if ($form->isValid($formData)) {
    $NOM_UTL = $form->getValue('NOM_UTL');
    $PRENOM_UTL = $form->getValue('PRENOM_UTL');
    $EMAIL_UTL = $form->getValue('EMAIL_UTL');
    $ADRESSE_UTL = $form->getValue('ADRESSE_UTL');
    $CATEGORIE_UTL = $form->getValue('CATEGORIE_UTL');
    $LOGIN_UTL = $form->getValue('LOGIN_UTL');
    $PASS_UTL = $form->getValue('PASS_UTL');
    $id = $form->getValue('ID');
    if ($id < 1) throw new Exception('error ' . $id);
    $user = new Model_Utilisateur();
    $user->modifierUtilisateur($id,$NOM_UTL,$PRENOM_UTL,$EMAIL_UTL,
    $ADRESSE_UTL,$CATEGORIE_UTL,$LOGIN_UTL,$PASS_UTL);
    $this->_redirect('/utilisateurs');
    }
    }
    else {
    $id = $this->_getParam('id', 0);
    if ($id > 0) {
    $form->getElement('ID')->setValue($id);
    $existLoginValidator = new Zend_Validate_Db_NoRecordExists(
    		'utilisateur', 'LOGIN_UTL',
    		array(
    		'field' => 'ID_UTL',
    		'value' => $id)
    		);
    $form->getElement('LOGIN_UTL')->addValidator($existLoginValidator);
    $user = new Model_Utilisateur();				
    $form->populate($user->getUtilisateur($id));
    }
    else throw new Exception("Probleme de passage de parametre par GET");
    }
    voila tout, je m'arrache les cheveux depuis quelques heures mais sans succes

    merci d'avance

  2. #2
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Bonjour,

    Si tu veux vérifier que l'identifiant de l'utilisateur existe bien, il faut utiliser Zend_Validate_Db_RecordExists et pas Zend_Validate_Db_NoRecordExists...

    Pourquoi essaies-tu d'utiliser ce validateur ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Software engineer
    Inscrit en
    Août 2008
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Software engineer

    Informations forums :
    Inscription : Août 2008
    Messages : 139
    Par défaut
    merci ,
    le scenario est le suivant :
    l'administrateur veut modifier les informations d'un utilisateur , s'il a choisi un nouveau login , ce dernier ne doit pas figurer dans la base excepté la ligne de l'utilisateur en cours de modification ,pourcela l'option except dans le constructeur de Zend_Validate_Db_NoRecordExists est prévu pour ce besoin ,donc zend doit verifier l'existance du nouveau login dans toute la base sauf la ligne courante, le probleme c'est queje peux recuperer l'id de la ligne courante que apres l'affichage de la formulaire "populé" pour la premiere fois , donc l'ajout du validateur dois etre ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    else {
    $id = $this->_getParam('id', 0);
    if ($id > 0) {
    $form->getElement('ID')->setValue($id);
    $existLoginValidator = new Zend_Validate_Db_NoRecordExists(
    		'utilisateur', 'LOGIN_UTL',
    		array(
    		'field' => 'ID_UTL',
    		'value' => $id)
    		);
    $form->getElement('LOGIN_UTL')->addValidator($existLoginValidator);
    $user = new Model_Utilisateur();				
    $form->populate($user->getUtilisateur($id));
    le addValidator ne fonctionne pas dans cet endroit du code
    pourquoi ?

    merci d'avance

  4. #4
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Ok, compris !

    Ton problème, c'est que tu définit le validateur lors de l'affichage du formulaire, mais pas lors de la réception des résultats (dans ce cas, c'est un autre formulaire qui est créé).

    Tu as plusieurs solutions pour t'en sortir. La plus simple, mettre en place le validateur en fonction des données envoyées par le client :
    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
    if ($this->getRequest()->isPost()) {
        $formData = $this->getRequest()->getPost();
        if (isset($formData['id'])) {
            $existLoginValidator = new Zend_Validate_Db_NoRecordExists(
    	    'utilisateur',
                'LOGIN_UTL',
    	    array(
    	        'field' => 'ID_UTL',
    	        'value' => $id)
    	    );
        }
        else {
            $existLoginValidator = new Zend_Validate_Db_NoRecordExists('utilisateur', 'LOGIN_UTL');
        }
     
        $form->getElement('LOGIN_UTL')->addValidator($existLoginValidator);
     
        if ($form->isValid($formData)) {
            ...
        }
    }
    ...
    L'inconvénient, c'est que le nom du champ 'id' est dupliqué : il se trouve dans le formulaire, et dans le code de ton action.

    Plus propre, mais aussi plus compliqué : redéfinir la méthode isValid($data) de ton formulaire pour prendre en compte ce cas particulier. La méthode redéfinie doit faire appel à la méthode isValid de Zend_Form puis créer le validateur supplémentaire, puis valider le champ ID...

    Encore mieux, la dernière solution que je te propose, c'est de créer ton propre validateur NoRecordExists qui puisse prendre comme valeur à exclure le contenu de l'élément lui-même...

  5. #5
    Membre confirmé
    Homme Profil pro
    Software engineer
    Inscrit en
    Août 2008
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Software engineer

    Informations forums :
    Inscription : Août 2008
    Messages : 139
    Par défaut
    ooof ,enfin apres n heures dans cette galere
    merci beaucoup pour cette precieuse aide
    ce que j'aime bien ici a part l'entraide biensure, c'est qu'on apprend a s'exprimer ,donc je vous explique mon résonnement :

    tout d'abord je poste le code final de l'action qui fonctionne bien :
    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
     
    public function modificationAction()
    {
    	$form = new Form_utilisateur();
    	$this->view->form = $form;
    	$this->view->title= 'Modifier utilisateur';
     
    if ($this->getRequest()->isPost()) {
    //partie 'post'
    	$form->getElement('LOGIN_UTL')->addValidator(
    	new Zend_Validate_Db_NoRecordExists(
    	'utilisateur', 'LOGIN_UTL',
    	 array(
    	'field' => 'ID_UTL',
    	'value' => $this->getRequest()->getPost('ID'))
    	));
    	$formData = $this->getRequest()->getPost();
     
    	if ($form->isValid($formData)) {
    	$NOM_UTL = $form->getValue('NOM_UTL');
    	$PRENOM_UTL = $form->getValue('PRENOM_UTL');
    	$EMAIL_UTL = $form->getValue('EMAIL_UTL');
    	$ADRESSE_UTL = $form->getValue('ADRESSE_UTL');
    	$CATEGORIE_UTL = $form->getValue('CATEGORIE_UTL');
    	$LOGIN_UTL = $form->getValue('LOGIN_UTL');
    	$PASS_UTL = $form->getValue('PASS_UTL');
    	$id = $form->getValue('ID');
    	if ($id < 1) throw new Exception('error ' . $id);
    	$user = new Model_Utilisateur();
    	$user->modifierUtilisateur($id,$NOM_UTL,$PRENOM_UTL,$EMAIL_UTL,
    	$ADRESSE_UTL,$CATEGORIE_UTL,$PASS_UTL,$LOGIN_UTL);
    	$this->_redirect('/utilisateurs');
    	}
    }
    else {
    //partie 'get' 
            $id = $this->_getParam('id', 0);
            if ($id > 0) {
    	$form->getElement('ID')->setValue($id);
    	$user = new Model_Utilisateur();
    	$form->populate($user->getUtilisateur($id));
    	}
          else throw new Exception("Probleme de passage de parametre par GET");
    }
    }
    un detail que j'ai oublié de mentionner : je passe un parametre 'id' pour afficher le formulaire rempli avec les informations de l'utilisateur(je fait ça si la requete est "get") et puis je met cette valeur dans un hidden champ pour la recuperer quand la requete est "post" et puis enregister les changemnt sur cette ligne ,donc 'id' est un parametre passé avec l'url (get) et 'ID' est un champ hidden .

    puisque dans la partie 'get' le addValidator ne fonctionne pas pour les raisons que j'ai pas encore compris ,donc juste apres le submit je me sert du champ hidden pour donner sa valeur en parametre a Zend_Validate_Db_NoRecordExists et faire un addValidator et yup, ça tourne !

    j'espere qu'il n y a pas d'erreur dans cette raisonnement ,mais je voudrais savoir pourquoi le addvalidator ne marche pas dans la partie 'get' ,sachant que setValue a un champ marche parfaitement comme vous voyez dans le code .

    merci bien

  6. #6
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Citation Envoyé par oswalidos Voir le message
    je voudrais savoir pourquoi le addvalidator ne marche pas dans la partie 'get' ,sachant que setValue a un champ marche parfaitement comme vous voyez dans le code .
    C'est ce que j'essayais de t'expliquer dans mon dernier message...

    Ce que tu appelles la partie 'get', c'est la partie exécutée quand ton formulaire n'a pas été soumis. Dans cette partie, tu crées ton formulaire, et si un identifiant d'utilisateur est passé, tu l'initialise avec les données de cet utilisateur. Si tu y ajoute un validateur, cela fonctionne bien, mais est inutile puisque tu ne l'utilises pas (tu ne valide pas de données soumises par le client).

    Une fois ton formulaire soumis, tu ne passes plus dans "la partie get" ! Et tu instancie un nouveau formulaire (de la même classe, mais ce n'est pas le même objet, donc tu n'as plus le validateur créé sur l'autre formulaire). C'est pour ça que le validateur créé en 'get' ne fonctionnait pas en 'post' (en fait, il n'existait plus, tout simplement).

    C'est plus clair comme ça ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Software engineer
    Inscrit en
    Août 2008
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Software engineer

    Informations forums :
    Inscription : Août 2008
    Messages : 139
    Par défaut
    Citation Envoyé par Eusebe Voir le message
    Une fois ton formulaire soumis, tu ne passes plus dans "la partie get" ! Et tu instancie un nouveau formulaire (de la même classe, mais ce n'est pas le même objet, donc tu n'as plus le validateur créé sur l'autre formulaire). C'est pour ça que le validateur créé en 'get' ne fonctionnait pas en 'post' (en fait, il n'existait plus, tout simplement).
    C'est plus clair comme ça ?
    c'est extraimement claire, merci beaucoup

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/09/2006, 17h46
  2. [FTP] fopen qui ne fonctionne pas dans tous les contextes ..
    Par Christophe Charron dans le forum Langage
    Réponses: 6
    Dernier message: 15/06/2006, 10h25
  3. Réponses: 3
    Dernier message: 26/01/2006, 13h11
  4. La fonction CurrentDb() ne fonctionne pas dans une requête
    Par Sébastien Le Goyet dans le forum Access
    Réponses: 8
    Dernier message: 24/11/2005, 17h46
  5. Réponses: 1
    Dernier message: 27/10/2005, 21h48

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