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

Symfony PHP Discussion :

Problème d'action.class avec deux sous formulaires, et problème de postvalidator


Sujet :

Symfony PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Problème d'action.class avec deux sous formulaires, et problème de postvalidator
    Bonjour,

    je débute avec Symfony depuis deux semaines, et je suis confronté aujourd'hui a deux problème que je n'arrive pas à résoudre.

    Premier problème :
    Dans mon application, je gère des utilisateurs (Hé oui !). Il a été choisis, lors de l'édition par l'administrateur de données relatives à un utilisateur, de scinder le formulaire en deux : un pour les données "nom, adresse, etc", et un autre pour ses autorisations diverses (accès à certains documents).

    J'ai choisis (peut être à tord) de faire deux sous-classes, userForm.class et userPermissionForm.class, héritées de UserFormBase.class. Les deux sont affichés dans deux templates différents, je passe de l'un à l'autre par un bouton, les données se chargent bien, jusque là, tout va bien.

    Dans mon action.class, j'ai donc une fonction executeEdit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public function executeEdit($request)
      {
        $this->user = $this->getRoute()->getObject();
        $this->form = new UserForm($this->user);
      }
    une fonction executeUserPermissions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public function executeUserPermissions($request)
      {
        $this->user = $this->getRoute()->getObject();
        $this->form = new UserPermissionsForm($this->user);
      }
    et une fonction executeupdate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function executeUpdate(sfWebRequest $request)
      {
        $this->user = $this->getRoute()->getObject();
        $this->form = new UserForm($this->user);
        $this->processForm($request, $this->form);
        $this->setTemplate('edit');
      }
    Le problème est lié à cette dernière. En effet, lorsque que je fais $this->form, je doit savoir quel est le formulaire qui cherche à s'updater. Hors je n'ai pas trouvé la fonction qui me permettrais de récuperer une donnée à mettre en condition dans un if tout bête. C'est peut-être (certainement) trivial, mais je n'ai rien trouvé dans la doc.

    Deuxième problème :

    Chaque utilisateur a un mail, qui sert de login sur l'application. J'ai implanté un postvalidator dans userForm.class qui vérifit l'unicité de ce mail dans la base

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     $this->validatorSchema->setPostValidator(
          new sfValidatorPropelUnique(
            array('model' => 'User', 'column' => 'email', 'field' => 'email'),
            array('invalid'=>'This mail is already used by a user. Please change it.')));
    Lors de l'ajout d'un nouvel utilisateur, pas de problème. Par contre, quand je cherche à mettre à jour les données d'un utilisateur, le postvalidator pose problème : on ne peut pas sauvegarder sans changer le mail.

    Je vous joint la méthod processForm qui sert à sauvegardé les données d'un formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    protected function processForm(sfWebRequest $request, sfForm $form)
      {     
        $form->bind(
          $request->getParameter($form->getName()),
          $request->getFiles($form->getName())
          );
     
        if ($form->isValid())
        {
          $user = $form->save();
          $this->redirect('user/index');
        }
     }
    Je vous remercie d'avance de votre aide.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Réponse au premier problème :

    la méthode $form->getName() te retourne une chaîne de caractère par défaut le nom de ton formulaire mais comme tes deux formulaires sont hériter de la même base il faut que tu redéfinisse la méthode dans chacune de tes formulaire ca te donne un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function getName()
    {
       return 'nomDeMonFormulaire';
    }
    après tu fais ton if avec la valeur retourné .... tu peux renvoyé autre chose qu'une chaine de caractère si tu le désire.

    Voila si ca t'aide déja pour un de tes problème.

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Salut,

    j'ai en fait réussis à trouver une solution pour le premier problème.
    J'utilisais déjà SetNameFormat dans mes deux sous classes de formulaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    
    $this->widgetSchema->setNameFormat('user[%s]');
    
    J'ai mis deux nom différents dans chacune des classes.
    Ensuite, je fait test avec un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    
    $request->getParameterHolder()->has('userDetails')
    
    dans mon executeUpdate, qui me permet d'identifier quel formulaire est à l'origine de la requête. Ça marche, même si c'est un peu à l'arrache.

    Pour le problème de postvalidator, il s'est résolu sans que je bosse spécifiquement dessus. Ça m'emmerde pas mal, j'aurais préféré voir où j'avais fait une erreur et quelle modification l'a corrigé, mais bon.

    FD

Discussions similaires

  1. Probleme avec deux sous formulaire
    Par mr_mans dans le forum 4D
    Réponses: 3
    Dernier message: 11/03/2013, 03h34
  2. Réponses: 5
    Dernier message: 05/10/2011, 17h15
  3. Problème père-fils avec un sous formulaire
    Par beegees dans le forum IHM
    Réponses: 4
    Dernier message: 27/05/2007, 13h07
  4. Problème de lenteur avec 2 sous-formulaires
    Par picatchou dans le forum Access
    Réponses: 1
    Dernier message: 29/01/2007, 08h48
  5. Problème de sub avec un sous formulaire
    Par SpyesX dans le forum Access
    Réponses: 5
    Dernier message: 08/03/2006, 00h27

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