Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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 :
$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
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 ?
merci d'avance
Dernière modification par oswalidos (06-08-2009 19:31:40)
Hors ligne
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
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 !
Bye
Dernière modification par itecman (07-08-2009 09:48:51)
Hors ligne
merci
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 :
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
$form->isValid($this->getRequest()->getPost())
merci pour votre aide
Dernière modification par oswalidos (07-08-2009 13:00:18)
Hors ligne
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
Hors ligne
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
Hors ligne
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
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 :
[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 :
[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
[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)
Hors ligne
Pages: 1