Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/04/2011, 22h45   #1
Invité de passage
 
Inscription : mai 2008
Messages : 2
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 2
Points : 0
Points : 0
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 :
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 :
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
cybadr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 14h33   #2
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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).
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 11h49   #3
Candidat au titre de Membre du Club
 
Inscription : novembre 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 13
Points : 10
Points : 10
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 :
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 :

Citation:
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
gaara49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 12h28   #4
Candidat au titre de Membre du Club
 
Inscription : novembre 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 13
Points : 10
Points : 10
Bon en fait après recherche c'est comme ceci qu'il faut faire :

Code :
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.
gaara49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 10h08   #5
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h15.


 
 
 
 
Partenaires

Hébergement Web