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 :

embedForm symfony relation one to one


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2
    Par défaut embedForm symfony relation one to one
    Tous d'abord bonjour à tous, je poste ce message après diverse recherche, mais pas moyen je n'y arrive pas. J'ai donc besoin de votre aide.

    J'ai dans ma base une table user et une table address en relation 1to1.

    J'ai donc dans ma table user une clé étrangère idaddress.

    Lorsque je crée mon formulaire pour modifier un utilisateur et une adresse, je met le formulaire adresse en embedForm.

    Lorsque je rentre des données dans la base, la modification de l'adresse fonctionne. Par contre quand j'ai un user et que je veux créer une nouvelle adresse et donc lui assigner, l'adresse est bien créée en base mais la relation n'est pas effectuée ( le champs idaddress de la table user ne se remplit pas).

    Je galère depuis deux jours la dessus.

    Voici une partie de mon schema.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
    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
    79
    80
    81
     
    user:
      columns:
        iduser:
          type: integer(4)
          primary: true
          notnull: true
          autoincrement: true
        firstname:
          type: string(100)
          notnull: true
        lastname:
          type: string(100)
          notnull: true
        email:
          type: string(255)
          notnull: true
        password:
          type: clob(65535)
          notnull: true
        passwordSalt:
          type: string(10)
          notnull: true
        creation:
          type: timestamp
          notnull: true
        membership:
          type: integer(4)
          notnull: true
        type:
          type: string(45)
          notnull: true
        avatar:
          type: string(255)
        phone:
          type: string(10)
        facebook:
          type: string(255)
        twitter:
          type: string(255)
        linkedin:
          type: string(255)
        address_idaddress:
          type: integer(4)
      relations:
        addressIdaddress:
          class: address
          local: address_idaddress
          foreign: idaddress
          foreignAlias: users
      indexes:
        fk_user_address1:
          fields: [address_idaddress]
      options:
        charset: utf8
        collate: utf8_unicode_ci
        type: MyISAM
     
    address:
      columns:
        idaddress:
          type: integer(4)
          primary: true
          notnull: true
          autoincrement: true
        address:
          type: string(255)
          notnull: true
        zipcode:
          type: integer(4)
          notnull: true
        city:
          type: string(100)
          notnull: true
        country:
          type: string(100)
          notnull: true
      options:
        charset: utf8
        collate: utf8_unicode_ci
        type: MyISAM
    Je précise que ma base a été créée avec mysql Workbench et le yml avec le plugin doctrine de ce logiciel. Y'a t'il une erreur ?

    Et voici le code du formulaire

    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
     
    class accountForm extends userForm {
     
        public function configure() {
            unset($this["passwordSalt"], $this["creation"], $this["membership"], $this["avatar"], $this["type"]);
     
            $addressForm = new addressForm($this->getObject()->addressIdaddress);
            unset ($addressForm["idaddress"]);
            $this->embedForm('address', $addressForm);
            //$this->embedRelation("addressIdaddress");
     
            $this->widgetSchema["password"] = new sfWidgetFormInputPassword(array(), array("value" => $this->getObject()->password));
            $this->widgetSchema["firstname"]->setLabel("Prénom");
            $this->widgetSchema["lastname"]->setLabel("Nom");
            $this->widgetSchema["email"]->setLabel("Adresse email");
            $this->widgetSchema["password"]->setLabel("Mot de passe");
     
            $this->widgetSchema["address_idaddress"] = new sfWidgetFormInputHidden(array(), array("value" => $this->getObject()->address_idaddress));
     
            $this->setValidator("facebook", new sfValidatorUrl(array("required" => FALSE)));
            $this->setValidator("twitter", new sfValidatorUrl(array("required" => FALSE)));
            $this->setValidator("linkedin", new sfValidatorUrl(array("required" => FALSE)));
        }
     
    }
    Voila j'espère avoir été assez clair. Merci de vos réponses

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Pour le form de création à lier par un embed.

    Il faut créer un nouvel objet du modèle sur adresse et le lier à ton user par son setter (setUser())

    Ensuite tu crées ton form avec son embed.

    A la récupération des données, il faut recréer la même structure du form (avec la création et liaison de l'objet du modèle pour la nouvelle adresse).

    La sauvegarde (ou pas) de la nouvelle adresse s'effectuant ensuite (quant tout le form est valide).

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 13
    Par défaut
    Bonjour,

    je rencontre le même soucis que cybadr. En reprenant son exemple et en suivant les conseils de Michel cela voudrait dire qu'on aurait quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    $address = new Address();
    $address->User= $this->getObject();
    $addressForm = new AdressForm($address);
    $this->embedForm('user_address', $addressForm );
    Est-ce exact ? En supposant que oui, c'est pour la suite que j'ai du mal :

    A la récupération des données, il faut recréer la même structure du form (avec la création et liaison de l'objet du modèle pour la nouvelle adresse).
    Qu'entends tu par là ? Pourrais-tu fournir plus de détails ?

    merci

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 13
    Par défaut
    Bon en fait après recherche c'est comme ceci qu'il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $addressForm = new AddressForm($this->getObject()->Address);
    $this->embedForm('user_address', $addressForm);
    De cette manière lorsque l'on va créer un user, on aura un formulaire imbriqué de l'adresse. Si l'utilisateur est nouveau, alors une nouvelle adresse est créée, sinon symfony charge la bonne adresse lié à l'utilisateur.

  5. #5
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Possible oui.

    Mais ton code est intimement lié avec la route utilisée ( getObject() ) et ce qu'elle récupère.

    Il manque un peu de contexte pour être exploitable...

    Et je pense qu'il est préférable de mettre le code d'embed dans le form plutôt que dans le contrôleur. Histoire de garder la notion d'objet.

Discussions similaires

  1. [ASP.NET 2.0] DataBinding et relation Many to one
    Par Mandotnet dans le forum ASP.NET
    Réponses: 1
    Dernier message: 18/01/2007, 13h48
  2. Relation Many-to-One dans une application JSF
    Par KooKoolen dans le forum JSF
    Réponses: 1
    Dernier message: 27/12/2006, 14h13
  3. [Hibernate]Mapping relation one-to-one
    Par K-Kaï dans le forum Hibernate
    Réponses: 9
    Dernier message: 23/06/2006, 16h02
  4. Réponses: 3
    Dernier message: 08/06/2006, 17h38
  5. Hibernate : suppression sur relation many to one
    Par taf dans le forum Hibernate
    Réponses: 1
    Dernier message: 23/05/2006, 13h08

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