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 :

Comment appliquer une contrainte à un form embarqué


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Points : 378
    Points
    378
    Par défaut Comment appliquer une contrainte à un form embarqué
    Hello

    Je n'arrive pas appliquer des rules sur mon form embedded

    Je dois mettre un règle pour que username et email ne soient unique

    Mon entité

    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
     
    <?php
    //Entity
    class Voluntary {
     
    ...
     
       /** 
         * @ORM\OneToOne(targetEntity="Ac\AcSecurityBundle\Entity\User", cascade={"persist"})
         * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
         * @Assert\Type(type="Ac\AcSecurityBundle\Entity\User")
         */        
        private $user;   
     
     /**
         * Set user
         *
         * @param Ac\AcSecurityBundle\Entity\User $user
         */
        public function setUser(\Ac\AcSecurityBundle\Entity\User $user)
        {
            $this->user = $user;
        }
    Mon formulaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class VoluntaryType extends AbstractType {
     
        public function buildForm(FormBuilder $builder, array $options) {
                ->add('name')
                ->add('surname')
                ->add('user', 'fos_user_registration') 
         }
    J'ai essayé plein de trucs mais rien ne fonctionne j'ai un crash de l'applic

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'jfs' for key 'UNIQ_1483A5E992FC23A8'
    J'ai essayé en mettant dans mon voluntarytype

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     public function getDefaultOptions(array $options) {
            return array(
                'data_class' => 'Marche\VolontaireBundle\Entity\Voluntary',
                 'validation_groups' => array('default', 'registration','profile')
     
            );
        }
    J'ai essayé dans ma classe de mettre ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    * @DoctrineAssert\UniqueEntity(fields="email", message="Podany adres e-mail jest już zajęty.")
     * @DoctrineAssert\UniqueEntity(fields="username", message="Podany login jest już zajęty.")
    J'ai aussi essayé ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     * @Assert\Type(type="Marche\MarcheSecurityBundle\Entity\User", groups={"registration", "profile"})
         * @Assert\Valid
         */
     
        private $user;
    Mais rien n'y fait je sais plus quoi faire d'autre

    Si quelqu'un sait m'aider...

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    http://symfony.com/doc/2.0/reference.../Callback.html

    Dans le callback, tu peux faire tous les tests que tu veux!
    Un petit si la réponse convient. Merci.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Bonjour,

    J'ai le même problème que toi j'ai voulu faire un Gestionnaire des Utilisateurs basé sur FosUserBundle avec comme départ le tutorial avancé de J.Place.
    Par défaut ça fonctionnait mais comme je voulais ajouter des champs "personnels" j'ai du tout faire sauter...

    Et finalement la seule solution "propre" a été de refaire des routes et un contrôleur dédié qui utilise le service "usermanager" troué dans la doc du FOSUserBundle sur Github.
    Du coup je refais mes tests d'unicité grace à ce service, je valide le format de l'email avec une contrainte etc...

    C'est lourd à code mais çà fonctionne. Par contre j'ai pu garder le "mot de passe perdu" mais je dois encore voir pour déclencher un reset par l'administrateur.

    Et dans la foulée j'ai pu mettre en place un Ajax pour tester directement si le username et l'email sont disponibles.

    Ca t'aide ?

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par RapotOR Voir le message
    http://symfony.com/doc/2.0/reference.../Callback.html

    Dans le callback, tu peux faire tous les tests que tu veux!
    La méthode est sympa mais comment on l'applique à FOSUserbundle ?
    J'ai pas la main sur les propriétés que je veux tester vu qu'elles sont définies dans le bundle...

    Et je me vois pas ajouter des champs "email_perso" juste pour faire le test, un peu moche non ?

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Points : 378
    Points
    378
    Par défaut
    @Guldil

    Tu saurais partager ton code ?

    C'est la galère ce truc mon applic doit sortir lundi

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Points : 378
    Points
    378
    Par défaut
    En plus fosuer fourni un service de validation mais je sais pas comment l'utiliser

    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
    <services>
            <!-- Unique Validator Service -->
            <service id="fos_user.validator.unique" class="%fos_user.validator.unique.class%">
                <argument type="service" id="fos_user.user_manager" />
                <tag name="validator.constraint_validator" alias="fos_user.validator.unique" />
            </service>
     
            <!-- Password Validator Service -->
            <service id="fos_user.validator.password" class="%fos_user.validator.password.class%">
                <call method="setEncoderFactory">
                    <argument type="service" id="security.encoder_factory" />
                </call>
                <tag name="validator.constraint_validator" alias="fos_user.validator.password" />
            </service>
        </services>

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Je vais bien l'ameliorer grace au message de l'autre fil de discussion (Avoir un Form pour gérer les contraintes), mais l'idée c'est ca :

    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
     
    //Appeler par un Administrateur lorsqu'il cree un utilisateur lui meme
    public function createAction()
        {
            $userManager = $this->container->get('fos_user.user_manager');
            $user = $userManager->createUser();
     
            $message='';
            $erreur_message='';
     
            $form = $this->container->get('form.factory')->create(new UtilisateurForm(), $user);
            $request = $this->container->get('request');
            $tab = $request->get('utilisateur');
            if ($request->getMethod() == 'POST'){
                    $form->bindRequest($request);
                    if ($form->isValid()){
     
                        $validator = $this->get('validator');
                        $validatorEmail = new EmailValidator();
                        if (!$validatorEmail->isValid($tab['email'],new Email())){
                            $erreur_message = 'Erreur : Cette adresse email est invalide!';
                        }
     
                        if ($erreur_message == ''){
                             if ($user->getUsername() != $tab['username']){
                                $user_ctrl = $userManager->findUserByUsername($tab['username']);
                                if (isset($user_ctrl)){
                                    $erreur_message='Erreur : Un utilisateur avec cet identifiant existe déjà!';
                                }
                            }
     
                            $user_ctrl = $userManager->findUserByEmail($tab['email']);
                            if (isset($user_ctrl)){
                                if ($user_ctrl->getId() != $user->getId()){
                                    $erreur_message='Erreur : Un utilisateur avec cet email existe déjà!';
                                }
                            }
     
                            if ($erreur_message == ''){
                                $user->setSociete($user->getEntreprise()->getNom());
                                $encoder = $this->container->get('security.encoder_factory')->getEncoder($user);
                                $password = $encoder->encodePassword($user->getPassword(), $user->getSalt());
                                $user->setPassword($password);
                                $user->setEnabled(true);
                                $userManager->updateUser($user);
                            }
                        }
                    }
            }
            return $this->container->get('templating')->renderResponse(
                'MyAppUtilisateurBundle:GestionUtilisateur:create.html.twig',
                array(
                    'form' => $form->createView(),
                    'message' => $message,
                    'erreur_message' => $erreur_message,
                ));
        }

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    Il faudrait peut être créer un bundle qui hérite de FOSUserbundle.
    Tout ce que tu définis prend le dessus sur ce qui est definit dans le bundle parent.
    Un petit si la réponse convient. Merci.

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/07/2011, 12h39
  2. Comment appliquer une mise en forme à de nouvelles feuilles?
    Par jacksparot dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/04/2011, 20h09
  3. comment appliquer une contrainte FB sous Delphi ?
    Par Just-Soft dans le forum Bases de données
    Réponses: 24
    Dernier message: 24/03/2011, 00h01
  4. Réponses: 3
    Dernier message: 27/02/2007, 15h11
  5. [icone]Comment appliquer une icone sur le.exe
    Par JavaLeDirePartout dans le forum JBuilder
    Réponses: 7
    Dernier message: 24/07/2003, 17h28

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