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 :

[Symfony 2] Surcharge du formulaire edition et des éléments profils - FOS UserBundle


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Expert Technique Java
    Inscrit en
    Septembre 2012
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Expert Technique Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 117
    Points : 75
    Points
    75
    Par défaut [Symfony 2] Surcharge du formulaire edition et des éléments profils - FOS UserBundle
    Bonjour à tous !

    Bon le titre est relativement explicite :p
    Bon Symfony, du moins sur ce bundle je suis honnêtement à la ramasse.
    J'ai cherché bon nombre de tuto ou d'aide existante sur le net, et je ne trouve pas exactement mon problème.

    J'ai un projet Symfony où mon FOSUserBundle fonctionne parfaitement, le formulaire du login me convient très bien mais cependant le formulaire pour éditer les données du profil se limite qu'à trois champs par défaut ( login, email, password ).

    J'ai suivi en particulier ce tuto de la doc officiel, mais sans succès ou alors je ne comprends pas tout -_- :

    https://github.com/FriendsOfSymfony/...iding_forms.md

    Comment faire pour mettre la main sur l'origine du formulaire d'édition du profil, parce que moi je n'ai que ç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
    {% trans_default_domain 'SonataUserBundle' %}
     
     
     
    <div class="container">
        <div class="row">
            <div class="col-sm-6 col-md-4 col-md-offset-4" style="margin:0 auto; float:none">
                <h1 class="text-center login-title">{{ 'form.registration_title'|trans }}</h1>
                <div class="well">
    	        	<div class="clearfix"></div>
    	            <form action="{{ path('fos_user_registration_register') }}" {{ form_enctype(form) }} method="POST" class="form-register form-horizontal">
    		        {{ form_widget(form) }}
     
    	            <br />
    	            <br />
    	            <input class="btn btn-lg btn-info btn-block" type="submit" value="{{ 'registration.submit'|trans }}">            		
    	            </form>
                </div>
     
                <p class="text-center">
                	<a href="{{ path('fos_user_security_login') }}" class="white">{{ 'form.already_register' | trans }}</a> 
                </p>
     
            </div>
        </div>
    </div>
    Comment trouver et ajouter des attributs à ce formulaire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {{ form_widget(form) }}
    Au risque de paraître bête, je ne sais pas où et comment on fait pour ajouter ou même trouver l'origine de ce genre de ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {{ 'form.registration_title'|trans }}
    Comment faire pour ajouter des champs sur le profil de l'utilisateur ?
    C'est à dire que j'ai ajouté des champs dans ma base de données ( dans la table user toujours), mais je ne vois que le login, email et password avec la possibilité de les éditer celles-ci. Comment faire pour ajouter de nouveau attribut dans le formulaire sur lequel nous visionnons juste le profil de l'utilisateur ?

    Le seul formulaire que j'ai trouvé en fouillant un peu partout c'est celui du login, que je n'est pas besoin de modifier :

    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
    class RegistrationType extends BaseType
    {
        public function buildForm(FormBuilderInterface $builder,
                                               array $options)
        {
            parent::buildForm($builder, $options);
     
            $builder
    	        ->add('captcha', 'captcha', array(
    	            'width' => 100,
    	            'distortion' => false,
    	            'quality' => 100,
    	            'background_color' => [255,255,255],
    	            'as_url' => true,
    	            'reload' => true,
    	            'attr' => array('class'=>'form-control captcha')))
    	        ->add('email', 'email', array(
    	        	'label' => 'form.email', 
    	        	'translation_domain' => 'FOSUserBundle', 
    	        	'attr'=>array('class'=>'form-control')))
                ->add('username', null, array(
                	'label' => 'form.username', 
                	'translation_domain' => 'FOSUserBundle', 
                	'attr'=>array('class'=>'form-control')))
                ->add('plainPassword', 'repeated', array(
                    'type' => 'password',
                    'options' => array('translation_domain' => 'FOSUserBundle'),
                    'first_options' => array('label' => 'form.password', 'attr'=>array('class'=>'form-control')),
                    'second_options' => array('label' => 'form.password_confirmation', 'attr'=>array('class'=>'form-control')),
                    'invalid_message' => 'fos_user.password.mismatch',
                ));
     
        }
     
     
        public function getName()
        {
            return 'sonata_user_registration';
        }
    }
    Fiou, c'est complexe, même après la lecture de la doc offi

    Ce que je ne comprends pas c'est que dans tous les problèmes ou tuto que je vois, tous le monde parle de surcharge de formulaire déjà présent... mais bon dans UserBundle/Form/Type j'ai que RegistrationType.php, UserInfoType et photoType... donc rien en rapport avec la mise à jour du profil ou l'affichage du profil utilisateur...

    Merci d'avance !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    Le Type de formulaire que tu veux surcharger est celui-ci

    https://github.com/FriendsOfSymfony/...leFormType.php

    cela se fait en trois étape qui sont décrites dans le lien que tu donnes
    1. créer une classe qui hérite de ProfileFormType, et ajouter les champs de formulaire que tu veux (My/UserBundle/Form/ProfileFormType.php)
    2. enregistrer cette classe en tant que service dans (My/UserBundle/Resource/config/service.xml)
    3. paramétrer le FOS User pour qu'il utilise ton type de formulaire + tôt que celui par défaut (app/config/config.yml)


    c'était la partie "ajouter un champ au formulaire"

    Si tu veux personaliser la partie vue/html

    -> créer un fichier twig qui va remplacer celui par défaut
    http://symfony.com/fr/doc/current/co...validation-etc

    -> lire la doc sur les formulaires dans twig
    http://symfony.com/fr/doc/current/re...reference.html


    {{ 'form.registration_title'|trans }}
    -> le filtre trans est une fonction twig pour traduire du texte
    http://symfony.com/fr/doc/current/book/translation.html

    au début de ton fichier twig tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {% trans_default_domain 'SonataUserBundle' %}
    cela veut dire que les traductions seront chargés depuis l'un de ces fichiers de traduction https://github.com/sonata-project/So...s/translations
    par défaut (donc sans ce code {% trans_default_domain 'SonataUserBundle' %} ) les traductions sont chargés depuis des fichiers nommés messages.fr.yml ou message.fr.xliff


    dans UserBundle/Form/Type j'ai que RegistrationType.php, UserInfoType et photoType... donc rien en rapport avec la mise à jour du profil ou l'affichage du profil utilisateur...

    Le problème semble venir d'une confusion entre le FOSUserBundle et le SonataUserBundle
    (les deux ne sont pas incompatible), regarde déjà dans app/AppKernel.php si le SonataUserBundle est réellement activé

  3. #3
    Membre régulier
    Homme Profil pro
    Expert Technique Java
    Inscrit en
    Septembre 2012
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Expert Technique Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 117
    Points : 75
    Points
    75
    Par défaut
    Bonjour à toi !

    Merci beaucoup pour ces explications très détaillés.
    Je regarde ça cette après midi et je te tiens au courant.

    Pour répondre rapidement à ta question, j'ai ( je pense ) activité mon SonataUserBundle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Sonata\UserBundle\SonataUserBundle('FOSUserBundle')
    C'est pour ça que je pense que se sont la même chose, le bundle SonataUserBundle et FOSUserBundle ^^
    En tout cas si je peux avancer ça va être super...

    J’éditerai mon poste pour te dire l'avancé.

  4. #4
    Membre régulier
    Homme Profil pro
    Expert Technique Java
    Inscrit en
    Septembre 2012
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Expert Technique Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 117
    Points : 75
    Points
    75
    Par défaut Re
    Re,

    Je viens de faire ce que tu m'as dis concernant ce point là :

    Le Type de formulaire que tu veux surcharger est celui-ci

    https://github.com/FriendsOfSymfony/...leFormType.php

    cela se fait en trois étape qui sont décrites dans le lien que tu donnes
    créer une classe qui hérite de ProfileFormType, et ajouter les champs de formulaire que tu veux (My/UserBundle/Form/ProfileFormType.php)
    enregistrer cette classe en tant que service dans (My/UserBundle/Resource/config/service.xml)
    paramétrer le FOS User pour qu'il utilise ton type de formulaire + tôt que celui par défaut (app/config/config.yml)
    Seulement, je bloque carrément...

    Voici dans le détail ce que j'ai fais :

    J'ai copié collé le code du lien que tu m'as donné, et je l'ai mis dans un fichier que j'ai créée dans UserBundle/Form/Type qui s'appelle EditerProfileForm.php.
    Dans la méthode buildUserForm tout en bas du fichier j'ai modifié et ajouté deux attribut supplémentaire j'ai fais comme ceci :

    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
        /**
         * Builds the embedded form representing the user.
         *
         * @param FormBuilderInterface $builder
         * @param array                $options
         */
        protected function buildUserForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('username', null, array('label' => 'form.username', 'translation_domain' => 'FOSUserBundle'))
                ->add('email', 'email', array('label' => 'form.email', 'translation_domain' => 'FOSUserBundle'))
                ->add('profileVal', 'profileVal', array('label' => 'form.profileVal', 'translation_domain' => 'FOSUserBundle'))
                ->add('address', 'address', array('label' => 'form.address', 'translation_domain' => 'FOSUserBundle'))
            ;
        }
    J'ai ensuite voulu l'ajouté dans mon service... mais je ne le trouve pas par rapport à ce que tu m'as dis :


    2. enregistrer cette classe en tant que service dans (My/UserBundle/Resource/config/service.xml)
    Et même si je l'avais trouvé, je ne vois pas du tout comment afficher le nouveau formulaire que j'ai créée puisque dans mon fichier j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {{ form_widget(form) }}
    J'aurai bien aimé faire quelque chose comme {{ form_widget(form.fos_user_profile) }} ( le nom que j'ai donné au forme dans la méthode getName() mais ça ne fonctionne pas.
    Ce qui me rend le plus dingue c'est que j'ai l'impression qu'il y a plusieurs tableau...
    Car j'ai beau fouillé partout je n'arrive pas à remonter à la source.

    Quelle est la syntaxe pour appelé mon tableau que je viens de créer ?

    Voici en image le formulaire de edition Profil que j'aimerai changer :

    Nom : formulaire.png
Affichages : 2483
Taille : 10,8 Ko

    Déjà pour le titre c'est change email ?
    Et moi je veux juste rajouter un champ entre password et email tout simplement...

    J'espère que c'est plus claire comme cela.

    Désolé pour mon noobisme et merci par avance.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    'ai ensuite voulu l'ajouté dans mon service... mais je ne le trouve pas par rapport à ce que tu m'as dis :
    généralement dans un Bundle tu as une classe Extension dans le répertoire DependencyInjection, la méthode load de cette classe définie quels sont les fichiers de configs à charger, le + souvent cela va se trouver dans My/Bundle/Resources/config/services.xml, mais ça pourrait trés bien être un fichier yml

    Aprés tu peux enregistrer des services ailleurs, comme par exemple dans le fichier app/config/config.yml:

    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
    #app/config/config.yml
    
    framework:
      ## ....
    
    twig:
      ## ...
    
    ## le fichier config.yml est constitué de +sieurs sections (framework, twig, etc..) si la section services n'existe pas, il faut la créer
    services:
            my_user.registration.form.type    ## l'id de ton service
            class: UserBundle\Form\Type\EditerProfileForm  ## ici le nom de ta classe
            arguments: [%fos_user.model.user.class%] ## comme ta classe hérite de la classe de base RegisterFormType, elle a le même constructeur qui demande comme argument le nom de la classe User
            tags:
                - { name: form.type, alias: my_registration_form } ## ce tag indique que c'est un type de formulaire (concretement dans un form tu peux désormais faire $formBuilder->add('my_registration_form');
    à partir de là, ta classe est enregistré en tant que service, en lançant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    app/console container:debug
    tu auras la liste des service, dont un nommé "my_user.registration.form.type"
    et dans un controller tu pourras faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $myRegistrationForm = $this->get("my_user.registration.form.type");
    C'était pour info, car en fait tu n'en auras jamais besoin puisque l'on va juste indiquer au FOSUSerBundle d'utiliser ton service de formulaire +tôt que celui qui est configuré par défaut
    toujours dans ce app/config/config.yml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fos_user:
        # ...
        registration:
            form:
                type: my_registration_form


    Et même si je l'avais trouvé, je ne vois pas du tout comment afficher le nouveau formulaire que j'ai créée puisque dans mon fichier j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {{ form_widget(form) }}

    la fonction form_widget est suffisante pour afficher tout les champs de ton formulaire.
    Normalement à ce niveau là tes champs persos devraient être affiché.

    Si tu as besoin de personnaliser tu pourras toujours faire aprés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    {{form_label(form.name)}} {{form_widget(form.name)}} {{form_errors(form.name)}}
    {#etc...#}
    {{form_rest(form)}} {#affiche tous les champs de formulaire qui n'ont pas été encore affiché #}
    Tout cela est dans la doc de Symfony http://symfony.com/fr/doc/current/re...reference.html

  6. #6
    Membre régulier
    Homme Profil pro
    Expert Technique Java
    Inscrit en
    Septembre 2012
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Expert Technique Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 117
    Points : 75
    Points
    75
    Par défaut
    Tout d'abord merci infiniment de ton aide, ça permet d'avancé et surtout de mieux comprendre certains point noir.
    Ok je viens de faire ce que tu m'as dis.

    Voici mes fichiers :

    ProfileFormType.php que tu m'as dis de créer dans UserBundle/Form/Type :

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    <?php
     
    /*
     * This file is part of the FOSUserBundle package.
     *
     * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
     *
     * For the full copyright and license information, please view the LICENSE
     * file that was distributed with this source code.
     */
     
    namespace FOS\UserBundle\Form\Type;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
    use Symfony\Component\Security\Core\Validator\Constraint\UserPassword as OldUserPassword;
    use Symfony\Component\Security\Core\Validator\Constraints\UserPassword;
     
    class ProfileFormType extends ProfileFormType
    {
        private $class;
     
        /**
         * @param string $class The User class name
         */
        public function __construct($class)
        {
            $this->class = $class;
        }
     
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            if (class_exists('Symfony\Component\Security\Core\Validator\Constraints\UserPassword')) {
                $constraint = new UserPassword();
            } else {
                // Symfony 2.1 support with the old constraint class
                $constraint = new OldUserPassword();
            }
     
            $this->buildUserForm($builder, $options);
     
            $builder->add('current_password', 'password', array(
                'label' => 'form.current_password',
                'translation_domain' => 'FOSUserBundle',
                'mapped' => false,
                'constraints' => $constraint,
            ));
        }
     
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => $this->class,
                'intention'  => 'profile',
            ));
        }
     
        public function getName()
        {
            return 'edition_profile';
        }
     
        /**
         * Builds the embedded form representing the user.
         *
         * @param FormBuilderInterface $builder
         * @param array                $options
         */
        protected function buildUserForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('username', null, array('label' => 'form.username', 'translation_domain' => 'FOSUserBundle'))
                ->add('email', 'email', array('label' => 'form.email', 'translation_domain' => 'FOSUserBundle'))
                ->add('phone', 'phone', array('label' => 'form.phone', 'translation_domain' => 'FOSUserBundle'))
            ;
        }
    }
    Et mon config.yml :

    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
    # User bundle
    services:
        sonata.registration.form.type:
            class: Application\Sonata\UserBundle\Form\ProfileFormType
            arguments: [%fos_user.model.user.class%]
            tags:
                - { name: form.type, alias: edition_profile }
     
     
    fos_user:
        db_driver: orm 
        firewall_name: main
        user_class: Application\Sonata\UserBundle\Entity\User
        service:
            mailer: fos_user.mailer.twig_swift
        registration:
            form:
                type: edition_profile
            confirmation:
                enabled:    true
                from_email:
                    address:        xxxx
                    sender_name:    xxxxx
        resetting:
            email:
                from_email:
                    address:        xxx
                    sender_name:    xxxx!
    Et mon fichier edit_content.html.twig :

    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
    {% trans_default_domain 'SonataUserBundle' %}
     
     
     
    <div class="col-sm-6 col-md-4 col-md-offset-4" style="margin:0 auto; float:none;">
    	<h1 class="text-center login-title">{{ 'profile.edit.title'|trans }}</h1>
     
    	<form action="{{ path('user_resetting') }}" {{ form_enctype(form) }} method="POST" class="form-horizontal well" role="form">
    	    {{ form_widget(form) }}
    	    <div class="form-group">
    	        <input type="submit" class="btn btn-lg btn-info btn-block" value="{{ 'profile.edit.submit'|trans }}" />
    	    </div>
    	</form>
     
        <a href="{{ path("user_info") }}" class="text-center new-account white">{{ 'profile.edit.back'|trans }}</a>
     
    </div>
    Dans mon fichier ProfileFormType.php, j'ai ajouté cette ligne là dans la fonction buildUserForm :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->add('phone', 'phone', array('label' => 'form.phone', 'translation_domain' => 'FOSUserBundle'))
    Et lorsque je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {{ form_widget(form.phone) }}
    Je ne vois pas ça valeur alors que form.username marche bien.

    Je viens de m'apercevoir que si j'efface tout mon fichier que je viens de créer ProfileFormType.php, le formulaire de change pas... ( peut-être logique vu qu'il hérite mais pas sûr). En tout cas, si je supprime le champ username par exemple ( dans la méthode buildForm ), ça ne change absolument rien...

    J'ai dû oublier quelque chose puisque mon formulaire de change pas de forme...

    Une idée ?

    Merci d'avance !!

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    <?php
     
    /*
     * This file is part of the FOSUserBundle package.
     *
     * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
     *
     * For the full copyright and license information, please view the LICENSE
     * file that was distributed with this source code.
     */
     
    namespace FOS\UserBundle\Form\Type;
     
    //....
     
    class ProfileFormType extends ProfileFormType
    {
        private $class;
     
        /**
         * @param string $class The User class name
         */
        public function __construct($class)
        {
            $this->class = $class;
        }
     
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            if (class_exists('Symfony\Component\Security\Core\Validator\Constraints\UserPassword')) {
                $constraint = new UserPassword();
            } else {
                // Symfony 2.1 support with the old constraint class
                $constraint = new OldUserPassword();
            }
     
            $this->buildUserForm($builder, $options);
     
            $builder->add('current_password', 'password', array(
                'label' => 'form.current_password',
                'translation_domain' => 'FOSUserBundle',
                'mapped' => false,
                'constraints' => $constraint,
            ));
        }
     
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => $this->class,
                'intention'  => 'profile',
            ));
        }
     
        public function getName()
        {
            return 'edition_profile';
        }
     
        /**
         * Builds the embedded form representing the user.
         *
         * @param FormBuilderInterface $builder
         * @param array                $options
         */
        protected function buildUserForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('username', null, array('label' => 'form.username', 'translation_domain' => 'FOSUserBundle'))
                ->add('email', 'email', array('label' => 'form.email', 'translation_domain' => 'FOSUserBundle'))
                ->add('phone', 'phone', array('label' => 'form.phone', 'translation_domain' => 'FOSUserBundle'))
            ;
        }
    }
    D'aprés ce code le nom de ta classe est FOS\UserBundle\Form\Type\ProfileFormType;
    et d'aprés ce namespace elle devrait se trouver dans vendor/friendsofsymfony/user-bundle/FOS/UserBundle/Form/Type.

    Hors il ne rien modifier dans le dossier vendor
    Cette classe devrait se trouver dans src/My/UserBundle/Form et avoir un namespace cohérent avec cette localisation soit src/My/UserBundle/Form

    d'autre part elle hérite d'une classe ProfileFormType , une classe ne peut hériter d'elle même non?
    Et si elle hérite d'une autre classe, il est inutile de faire un copier/coller de l'existant, voir le code fournie par FOSUserBundle, https://github.com/FriendsOfSymfony/...iding_forms.md

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    services:
        sonata.registration.form.type:
            class: Application\Sonata\UserBundle\Form\ProfileFormType
            arguments: [%fos_user.model.user.class%]
            tags:
                - { name: form.type, alias: edition_profile }
    Le nom de la classe enregistrée en tant que service ne correspond de toute façon pas à celle que tu as écrites.
    D'ou vient cette classe?
    Se trouve t'elle dans src/Application/Sonata/UserBundle/Form/ ?
    Si c'est le cas, les choses ne sont pas du tout à leur place (les librairies externes vont dans vendor)


    Pour info, les correspondances entre les namespace des classes et les répertoires se trouvent dans vendor/composer/autoload_classmap.php.
    (tout ce qui n'est pas spécifié doit alors se trouver dans le dossier src)

  8. #8
    Membre régulier
    Homme Profil pro
    Expert Technique Java
    Inscrit en
    Septembre 2012
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Expert Technique Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 117
    Points : 75
    Points
    75
    Par défaut
    Super ça marche bien !

    Tant j'y suis, j'essaie de récupérer l'entreprise à la quelle appartient mon utilisateur et je propose une liste déroulante d'entreprise pour mettre à jour mon champ entreprise dans user mais je n'y arrive pas....

    Voici mes fichiers :

    controller.php :

    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
    public function entrepriseEditAction() {
     
    		//get connected user id
            $user=$this->getUser()->getId();
     
            //request info
            $em = $this->getDoctrine()
                         ->getManager();
     
            $info = $em->getRepository('ApplicationSonataUserBundle:User')->find($user);
            $entreprise = $em->getRepository('OilWorksAppBundle:Entreprise')->findAll();
     
    		$formBuilder = $this->createFormBuilder($info);
     
    		$form = $formBuilder->getForm();
    		$form = $this->createForm(new UserInfoType(), $info);
     
    		if($this->getRequest()->getMethod() == "POST") {
    			$request = $this->getRequest();
    			$form->bind($request);
    			if($form->isValid()) {
    				$em->flush();
    			}
    		}
     
    		return $this->render('OilWorksAppBundle:WorksApp:entrepriseEdit.html.twig', array(
    			'form' => $form->createView()
    			));
    	}
     
    	public function getUser()
    	{
     
    		$user = $this->container->get('security.context')->getToken()->getUser();
    		if(!is_object($user) || !$user instanceof UserInterface)
    			throw new AccessDeniedException('Vous n\'avez pas accès à cette section');
     
    		return $user;
    	}

    Si je mets ce bout de code dans mon userTypeInfo ( mon formulaire ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ->add('entreprise','entity', array(
                'class' => 'Oil\WorksAppBundle\Entity\Entreprise',
                'property' => 'entLibelle',
                'multiple' => false,
                'required' => true))
            ;
    J'ai bien l'affichage de ma liste déroulante de toutes les entreprises.
    Seulement moi je veux que lorsqu'on choisie une entreprise et qu'on clique sauvegarder les changements, ça me change bien id_entreprise dans la table user.

    Quelqu'un aurait une idée ?
    Il me manque quelque chose sûrement...

Discussions similaires

  1. [1.x] Admin generator: Restreindre l'accès des formulaires edit
    Par nsoinard dans le forum Symfony
    Réponses: 3
    Dernier message: 17/05/2010, 15h25
  2. Réponses: 6
    Dernier message: 15/05/2007, 17h27
  3. Nom des éléments d'un formulaire
    Par licorne dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 15/12/2005, 09h45
  4. Test sur formulaire avec liste des erreurs
    Par Nicos77 dans le forum Langage
    Réponses: 37
    Dernier message: 17/11/2005, 10h22
  5. Réponses: 3
    Dernier message: 17/10/2005, 16h26

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