Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 06-08-2009 19:31:01

oswalidos
Membre
Date d'inscription: 12-07-2009
Messages: 39

[ZF 1.8]Zend_Validate_Db_NoRecordExists et recuperation de l'id

salut ,
j'utilise Zend_Validate_Db_NoRecordExists pour que l'administrateur ne peut pas créer deux utilisateur avec le meme login ,c'est pour la creation ,maintenant dans le cas de modification ,la contrainte est toujours là ,
mais zend doit chercher verifier tout les login dans la base sauf dans la ligne de l'utilisateur qu'on est entrain de modifier ses informations (sinon l'erreur "ce login existe deja" sera toujours affiché) .

ce cas est prevu par zend ,donc je dois specifier a Zend_Validate_Db_NoRecordExists qu'il doit chercher dans la table x la colonne y sauf en excluant la colonne z ayant la valeur 'alpha' .
dans mon cas x = 'utilisateur' , y = LOGIN_UTL , z = LOGIN_UTL  , alpha = l'id de l'utilisateur en cours de modification .

pour cela je fait ça :

Code:

        $form = new Form_utilisateur();
        $this->view->form = $form;
        $this->view->title= 'Modifier utilisateur';

        if ($this->getRequest()->isPost()) {
            $form->getElement('LOGIN_UTL')->addValidator(
            new Zend_Validate_Db_NoRecordExists(
                'utilisateur', 'LOGIN_UTL',
            array(
                'field' => 'ID_UTL',
                'value' => $this->getRequest()->getPost('ID_UTL'))
            ));
                
            $form->getElement('EMAIL_UTL')->addValidator(
            new Zend_Validate_Db_NoRecordExists(
                'utilisateur', 'EMAIL_UTL',
            array(
                'field' => 'ID_UTL',
                'value' => $this->getRequest()->getPost('ID_UTL'))
            ));
                
        
            $formData = $this->getRequest()->getPost();
            if ($form->isValid($formData)) {
                $NOM_UTL = $form->getValue('NOM_UTL');
                                                    // etc ..................................

en fait , ça fonctionne sans probleme, mais ça ne me plait pas sad

mes questions :
-pourquoi en remplaçant ceci  "$this->getRequest()->getPost('ID_UTL'))" par $form->getValue('ID_UTL') ,ça ne fonctionne pas ?
peut etre la bas je suis entrain d'ajouter un validator dans le formulaire pour cela je ne peux pas utiliser encore la formulaire(ecriture et lecture sur l'objet $form dans la meme instruction) ???

-y a il une methode plus élégante en utilisant Zend_Validate_Db_NoRecordExists ?
j'ai pensé a instancier la formulaire juste apres  "if ($this->getRequest()->isPost()) {"(car c'est le seul endroi dont je peux recuperer les valeurs de mon formulaire)  et donner l'id (dans mon cas je l'ai recuperer comme ça : "$this->getRequest()->getPost('ID_UTL')" ) en parametre au constructeur du formulaire.
est ce que c'est faisable et pourquoi ? serai il une bonne solution ?
tros de questions ? roll


merci d'avance smile

Dernière modification par oswalidos (06-08-2009 19:31:40)

Hors ligne

 

#2 06-08-2009 21:45:08

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [ZF 1.8]Zend_Validate_Db_NoRecordExists et recuperation de l'id

j'avais créer un validateur où je passe à sa construction un Zend_Db_Table_Abstract et le champ à vérifier. Assez simple pour vérifier si un pseudo ou un email existent déjà dans la base. Celà date d'avant la création de ce validteur mais j'ai gardé une préférence pour le mien. Si sa t'interesse

Hors ligne

 

#3 07-08-2009 09:47:18

itecman
Membre
Lieu: Orléans
Date d'inscription: 03-07-2009
Messages: 57

Re: [ZF 1.8]Zend_Validate_Db_NoRecordExists et recuperation de l'id

Salut,

Je partirais sur le fait qu'on voit rarement (surement pour éviter les questions que tu es en train de te poser), qu'un identifiant/login soit modifiable. En général c'est plus le mot de passe qui se change.

ta première question : "$this->getRequest()->getPost('ID_UTL'))" par $form->getValue('ID_UTL')
-> ça ne marche pas dans quel sens ? Pas de valeur retournée je suppose. Es tu sur que les deux sont équivalent ?

la seconde : j'ai utilisé la même méthode que throrin19 pour identifier un utilisateur et le Zend_Db_Table_Abstract le fait très bien. Donc dans ton cas, faire la même chose pour voir s'il est présent dans la base et placer ta conditionnelle.

Globalement : peut être que tu cherche à faire trop de chose au même endroit. Ici dans ton code je comprends que soit tu viens de valider ton formulaire utilisateur, soit t'es dans un premier passage. Je suppose que c'est le code d'une de tes actions qui contient ça, et là à vu de nez je comprends pas pourquoi à chaque fois il y a instanciation du formulaire.

Si tu peux mieux préciser les choses, en disant ou se trouve ce code, quand il est lancer (via le formulaire de modification à priori), ça pourrait aider tongue !

Bye

Dernière modification par itecman (07-08-2009 09:48:51)


-- itecman smile

ZF 1.8.4 - Zend Server CE

Hors ligne

 

#4 07-08-2009 12:57:41

oswalidos
Membre
Date d'inscription: 12-07-2009
Messages: 39

Re: [ZF 1.8]Zend_Validate_Db_NoRecordExists et recuperation de l'id

merci smile

itecman a écrit:

ta première question : "$this->getRequest()->getPost('ID_UTL'))" par $form->getValue('ID_UTL')
-> ça ne marche pas dans quel sens ? Pas de valeur retournée je suppose. Es tu sur que les deux sont équivalent ?

non ,je ne suis pas sur qu'il sont equivalent , mais je crois qu'il doivent retourner la meme valeur , getValue recupere la valeur partir de l'objet request ,pour moi je suppose qu'il retourne la meme valeur .

itecman a écrit:

la seconde : j'ai utilisé la même méthode que throrin19 pour identifier un utilisateur et le Zend_Db_Table_Abstract le fait très bien. Donc dans ton cas, faire la même chose pour voir s'il est présent dans la base et placer ta conditionnelle.

merci de me donner un apercu sur vos methode ,j'ai jamais creer un validateur mais je pense qu'un probleme persisite : le fait qu'on recuperer l'id pour le transmettre au validateur juste apres le submit de la part de l'utilisateur, donc où passé l'id ? si vous voulez bien je voudrais voir le code de votre validateur et surtout où lui passer l'id ?

itecman a écrit:

Globalement : peut être que tu cherche à faire trop de chose au même endroit. Ici dans ton code je comprends que soit tu viens de valider ton formulaire utilisateur, soit t'es dans un premier passage. Je suppose que c'est le code d'une de tes actions qui contient ça .

désolé ,j'etais concentré sur le validateur. donc ,effectivement c'est le code d'une action ,voila le code complet :

Code:

    public function modificationAction()
    {
        $form = new Form_utilisateur();
        $this->view->form = $form;
        $this->view->title= 'Modifier utilisateur';

        if ($this->getRequest()->isPost()) {
            $form->getElement('LOGIN_UTL')->addValidator(
            new Zend_Validate_Db_NoRecordExists(
                'utilisateur', 'LOGIN_UTL',
            array(
                'field' => 'ID_UTL',
                'value' => $this->getRequest()->getPost('ID_UTL'))
            ));
                
            $form->getElement('EMAIL_UTL')->addValidator(
            new Zend_Validate_Db_NoRecordExists(
                'utilisateur', 'EMAIL_UTL',
            array(
                'field' => 'ID_UTL',
                'value' => $this->getRequest()->getPost('ID_UTL'))
            ));
                
        
            $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_UTL'); 
                if ($id < 1) throw new Exception('error ' . $id);
                
                $this->users->modifierUtilisateur($id,$NOM_UTL,$PRENOM_UTL,$EMAIL_UTL,
                $ADRESSE_UTL,$CATEGORIE_UTL,$PASS_UTL,$LOGIN_UTL);
                $this->_redirect('/utilisateurs');
            }
        }
        else {
            $id = $this->_getParam('id', 0);
            if ($id > 0) {
                //$form->getElement('ID')->setValue($id);
                $form->populate($this->users->getUtilisateur($id));
            }
            else throw new Exception("Probleme de passage de parametre par GET");
        }
    }

itecman a écrit:

et là à vu de nez je comprends pas pourquoi à chaque fois il y a instanciation du formulaire.

car $form = new utli_Form est en dehors de if else ??
je ne comprend pas exactement ce que tu veux dire ,en principe oui le formulaire est instancié lors de la demande de modification et aussi rempli par les valeur de l'utilisateur a modifié, puis il est instancié une autre fois pour recuperer les valeurs avec $form->getValue qui ne fonctionne qu'apres

Code:

 $form->isValid($this->getRequest()->getPost())

merci pour votre aide

Dernière modification par oswalidos (07-08-2009 13:00:18)

Hors ligne

 

#5 07-08-2009 14:35:15

itecman
Membre
Lieu: Orléans
Date d'inscription: 03-07-2009
Messages: 57

Re: [ZF 1.8]Zend_Validate_Db_NoRecordExists et recuperation de l'id

Bon,

Essayons de bien se comprendre

Disons que t'es dans ton contrôleur : UtilisateurController
Tu as une action : modificationAction

J'imagine que tu as un indexAction ou t'initialises un formulaire, ou bien que tu liste tes utilisateurs avec un lien "Modifier". Ce lien lance l'action "utilisateur/modification" et c'est la que tu crées ton formulaire et tu fais tes tests.

Ou alors ta fonction "modificationUtilisateur" ne te sert juste qu'a "valider"...

Alors quand je vois la fonction complète, je comprends qu'a un moment t'as un action qui va lancer cette méthode (normal) et cette méthode construit le formulaire vérifie les conditions pour lui greffer des validateurs.

Donc premier passage :
* je lance utilisateur/modification
* il créer un formulaire et il est mis dans la vue pour avoir son rendu
* tu ne passes pas le premier if à priori SAUF si tu viens de valider un formulaire avec méthode POST

Je ne comprends pas trop ta logique au niveau du déroulement des opération. En revanche, le fait de rajouter des validateurs comme ça après avoir "validé" (oui car t'as dans ce if tu as ton getPost donc tu viens bien de valider un formulaire...).

Les validateurs d'après les doc que j'ai vu, il est plus propre de les associer au champs voulu dans ta classe "Form_Utilisateur", mais ton getElement marche aussi normalement.

Une logique que j'aurai suivi :

* Liste utilisateur (avec lien/bouton et l'action "utilisateur/modification")
* j'appelle cette action, j'ai un "id" qui traine (en session ou autre)
* Je crée mon formulaire de modification
* je récupère mon utilisateur (qui doit etre modifier)
* je fais un "populate" du formulaire
* la personne fait ses changements et confirme
* mon validateur placé sur "LOGIN_UTIL" fait les vérifications que tu souhaites sur ce champs et valide ou pas le formulaire
* s'il est valide l'action "utilisateur" va donc se lancer

Bon ça c'est une façon de voir. Maintenant ça dépend fortement de la ou tu viens quand tu lance cette action "utilisateur/modification". Tu viens d'un autre formulaire ? d'un simple lien ? d'un redirect ?

Fait nous part de ton avancement, pour l'exemple de validateur je vais te mettre ça si t'es encore plus perdu avec ce que j'ai dit.

Bye


-- itecman smile

ZF 1.8.4 - Zend Server CE

Hors ligne

 

#6 07-08-2009 17:34:46

oswalidos
Membre
Date d'inscription: 12-07-2009
Messages: 39

Re: [ZF 1.8]Zend_Validate_Db_NoRecordExists et recuperation de l'id

merci de donner de ton temps pour ecrire tout ça alors j'essaie d'etre le plus claire possible

les specifications ,ce que j'ai fait et comment je vois les choses :
-une action index qui liste les utilisateurs ,dans la vue index.phtml il y a les liens pour ajouter,modifier,supprimer un utilisateur ,particulierement pour le lien modifier je transmet un parametre 'id' avec l'url donc en clickant sur modifier la methode d'envoie est 'get'
-un click sur modifier déclanche l'action modification qui instancie le formulaire et l'affecte a view,puis execute seulement le 'else' car la requete est 'get' ,le block 'else' rempli le formulaire avec les infos de l'utilisateur, y compris un champs hidden qui contient l'id de ce dernier.
-un click sur submit déclanche de nouveau l'action modification qui instancie de nouveau le formulaire,puis execute seulement le bloc 'if' car la requete est 'get' maintenant.

donc dans le bloc de 'if' le formulaire est deja instancié et la requete est post ,je veux recuperer l'id en utilisant le champ caché pourcela je fait $this->getRequest()->getPost('ID_UTL')) qui va etre passer au validateur pour verifier l'existance de ce nouveau login dans toute la base mais pas dans la ligne d'id = 'id'

==>c'est seulement apres 'if' que je peux recuperer l'id pour le passer au validateur !
==>un $form->getValue au lieu de $this->getRequest()->getPost('ID_UTL')) ne marche pas ,apparement tant que le formulaire n'est pas validé on n'a pas accés au valeur des elements,mais on peut prendre les valeurs directement de l'objet request.

j'ai une session créer par Zend_Auth mais je l'ai pas utilisé pour stocker l'id ,je vais voir ça .

c'est ce que j'ai pu comprendre ,j'espere que ce n'est pas mediocre,
merci pour votre aide smile

Hors ligne

 

#7 09-08-2009 00:13:21

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [ZF 1.8]Zend_Validate_Db_NoRecordExists et recuperation de l'id

récupère l'id qu'il y a dans l'url. Elle est encore présente si à ton form en vue tu fais un $this->form->setAction($this->url());

ensuite tu la récupère comme ceci dans ton contrôleur: $idutilisateur = (int)$this->_request->getParam('id', 0);

je vois pas où est ton problème et comme ceci c'est beaucoup plus simple

Hors ligne

 

#8 09-02-2012 12:46:21

Echo
Membre
Lieu: Bois Colombes
Date d'inscription: 28-03-2008
Messages: 20
Site web

Re: [ZF 1.8]Zend_Validate_Db_NoRecordExists et recuperation de l'id

Waw, la vache, on en lit des âneries...

Les filters et les validators, ça s'applique directement sur les Zend_Form_Element dans une classe Zend_Form... C'est plus élégant ! Exemple :

Code:

[lang=php]
    $element = new Zend_Form_Element_Text('user_email');
    $element->setLabel('Email');
    $element->addFilter(new Zend_Filter_StringTrim());
    $element->addFilter(new Zend_Filter_StripNewlines());
    $element->addFilter(new Zend_Filter_StripTags());
    $element->addValidator(new Zend_Validate_EmailAddress());
    $element->setRequired(true);
    $this->addElement($element);

Au final, une action "basique" devrait se présenter sous cette forme :

Code:

[lang=php]
$form = new UserForm();
if ($this->getRequest()->isPost() == true)
{
    if ($form->isValid($this->getRequest()->getPost()) == true)
    {
        $oUser = new User();
        try
        {
            $oUser->insert($form->getValues(true));
        }
        catch (Zend_Db_Exception $e)
        {
            print($e->getMessage() . ' ' . $e->getTraceAsString());
        }
        unset($oUser);
    }
}
$this->view->form = $form;
unset($form);

Et pour finir, le validator dont tu as besoin c'est

Code:

[lang=php]
new Zend_Validate_Db_RecordExists('users', 'user_email', array('field' => 'user_id', 'value' => $user_id));

avec $user_id qui définit l'utilisateur qui dispose de l'adresse email.

Dernière modification par Echo (20-02-2012 12:55:38)


Marre de coder tes modèles Object-Relational Mapping? Génère-les automatiquement avec le générateur de classes ORM

Envie de sortir ? Viens sur ToutPourSortir.fr !

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages