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 10/03/2011, 17h27   #1
Membre à l'essai
 
Inscription : mai 2003
Messages : 69
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 69
Points : 20
Points : 20
Par défaut Sous-formulaire non présent mais enregistrement quand même d'une foreign key dans la BDD

Bonjour à tous,

Je suis sur Symfony 1.4 et Doctrine.

J'ai un formulaire assez complexe qui fait appel à plusieurs sous formulaires.
Le formulaire général permet d'enregistrer un bien immobilier et ses caractéristiques.

Le problème se situe sur la notion de propriétaire, d'après les exigences du client, un bien peut avoir un ou 2 propriétaire(s).

J'ai donc un formulaire de base qui contient un sous-formulaire pour le 1er propriétaire et un bouton "Ajouter un 2ème propriétaire" qui fait un appel ajax pour rajouter à la page un nouveau sous-formulaire de type propriétaire.

L'ensemble fonctionne plutôt bien, sauf dans un cas, quand je saisie uniquement un seul propriétaire, je retrouve quand même dans la table bien immobilier la clé étrangère "proprietaire_id_2" qui est remplie, et une ligne vide dans la table propriétaire correspondant à ce 2ème propriétaire.
Alors que justement le but du bouton "ajouter un 2ème proprietaire" c'est de ne pas charger la base de proprietaire n°2 tous vides !

J'ai essayé de manipuler le schema.yml et les class.php mais sans succès, je ne vois vraiment pas comment faire...

Je sais pas si mon message est clair, n'hésitez pas à me demander des précisions ou des poritions de code si nécessaire.

Merci pour vos lumières !

Voici la partie de mon schema yml qui concerne ces tables "cedant" (=bien immobilier) et proprietaire :

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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
Cedant:
  actAs:
      Timestampable: ~
      Sluggable:
        fields:       [titre]
  columns:
    id:
      type: integer
      primary: true
      autoincrement: true
    titre:
      type: string(100)
      notnull: true
    reference:
      type: string(10)
    description:
      type: string(3000)
    modalite:
      type: string(254)
    logement:
      type: boolean
      default: 0
    prix:
      type: string(100)
    secteur_act_id:
      type: integer
    secteur_act_2_id:
      type: integer
    type_ent_id:
      type: integer
    origine_contact_id:
      type: integer
    antenne_id:
      type: integer
    secteur_geo_id:
      type: integer
    commune_id:
      type: integer
    visible_site_web:
      type: boolean
      default: true
    date_sortie:
      type: timestamp
    sortie_positive:
      type: boolean
      default: false
    type_cession_id:
      type: integer
    commentaire_cession:
      type: string(3000)
    proprietaire_id:
      type: integer
    proprietaire_2_id:
      type: integer
    photo:
      type: string(255)
    visible_photo:
      type: boolean
      default: 0
    user_id:
      type: integer
  relations:
    Antenne:
      local: antenne_id
      foreign: id
      onDelete: CASCADE
    SecteurGeo:
      local: secteur_geo_id
      foreign: id
      onDelete: CASCADE
    Activite1:
      class: SecteurAct
      local: secteur_act_id
      foreign: id
      onDelete: CASCADE
    Activite2:
      class: SecteurAct
      local: secteur_act_2_id
      foreign: id
      onDelete: CASCADE
    TypeEntreprise:
      local: type_ent_id
      foreign: id
      onDelete: CASCADE
    OrigineContact:
      local: origine_contact_id
      foreign: id
      onDelete: CASCADE
    Commune:
      local: commune_id
      foreign: id
      onDelete: CASCADE
    TypeCession:
      local: type_cession_id
      foreign: id
      onDelete: CASCADE
    Proprietaire1:
      class: Proprietaire
      local: proprietaire_id
      foreign: id
      foreignAlias: Proprietaire1
      type: one
      onDelete: CASCADE
    Proprietaire2:
      class: Proprietaire
      local: proprietaire_2_id
      foreign: id
      foreignAlias: Proprietaire2
      onDelete: CASCADE
 
 
Proprietaire:
  actAs: [Timestampable]
  columns:
    id:
      type: integer
      primary: true
      autoincrement: true
    nom:
      type: string(100)
    prenom:
      type: string(100)
    sexe_id:
      type: integer
    date_naiss:
      type: timestamp
    adresse1:
      type: string(200)
    adresse2:
      type: string(200)
    commune_id:
      type: integer
    tel:
      type: string(15)
    portable:
      type: string(15)
    email:
      type: string(100)
    situation_matrimoniale_id:
      type: integer
    regime_marital_id:
      type: integer
    nb_enfant:
      type: integer
    age_enfant:
      type: string(200)
    nb_pers_charge:
      type: integer
    situation_prof_id:
      type: integer
    personne_hand:
      type: boolean
      default: 0
    benef_minima:
      type: boolean
      default: 0
    formation_txt:
      type: string(1000)
    formation_id:
      type: integer
    categ_socio_id:
      type: integer
  relations:
    Commune:
      local: commune_id
      foreign: id
      onDelete: CASCADE
    SituationMatrimoniale:
      local: situation_matrimoniale_id
      foreign: id
      onDelete: CASCADE
    RegimeMarital:
      local: regime_marital_id
      foreign: id
      onDelete: CASCADE
    SituationProf:
      local: situation_prof_id
      foreign: id
      onDelete: CASCADE
    CategSocio:
      local: categ_socio_id
      foreign: id
      onDelete: CASCADE
    Formation:
      local: formation_id
      foreign: id
      onDelete: CASCADE
    Sexe:
      local: sexe_id
      foreign: id
      onDelete: CASCADE
cli16 --*
cli16 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2011, 21h17   #2
Membre à l'essai
 
Inscription : mai 2003
Messages : 69
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 69
Points : 20
Points : 20
J'ai oublié de vous préciser que dans CedantForm.class.php je fais un embed relation uniquement s'il existe déjà un proprietaire2 pour l'enregistrement :
Code :
1
2
3
        if (count($this->object['Proprietaire2'])<>0) {
            $this->embedRelation('Proprietaire2');
        }
Dans le cas d'un nouvel enregistrement il n'y a donc pas d'ajout du sousformulaire proprietaire2.

Merci pour votre aide.
cli16 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 10h32   #3
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
J'ai jeté un oeil rapide sur ton schéma.

A priori il manque des foreignAlias dans tes relations qui vont rendre leur utilisation plus difficile dans ton programme. Le foreignAlias permet de définir le nom de la relation vue par la table de l'autre côté de la relation. Mais ceci n'interfère pas avec ton problème.

Tu es dans le cas d'un problème courant des form embeded de symfony et de la création du formulaire maître.

Avec la contrainte particulière d'une liaison [1-2], loin d'être courante...

Il faut savoir que symfony/doctrine gèrent mal l'ajout d'enregistrement embed lors de la création de l'enregistrement de base. La recommandation est ici de créer l'enregistrement de base et seulement une fois celui-ci enregistré, de créer par embed les autres.

Il y a un plugin qui gère les embed pour en créer, en supprimer,... tu le trouvera dans un des sujet épinglé de la salle plugin. Peut-être pourra-t-il t'aider, même si j'ai des doutes.
__________________
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 11/03/2011, 11h39   #4
Membre à l'essai
 
Inscription : mai 2003
Messages : 69
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 69
Points : 20
Points : 20
Merci Michel pour cette réponse.

Je m'étais déjà rendue compte que les embed form étaient mal gérés au create. J'ai donc mis en place des tests pour les 2 situations :
- au create j'affiche uniquement les champs de la table cedant
- au update j'ai les champs de la table cédant + les autres formulaires dont le propriétaire

Le souci du proprietaire n°2 c'est qu'à l'ouverture de l'update il n'est pas présent dans le formulaire (le embed proprietaire2 n'existe donc pas) et pourtant au save il me crée l'entrée dans la base dans la foreign key de cedant et dans la table proprio... c'est ça que je trouve assez bizarre.

J'avais peur d'avoir fait une erreur dans les relations du schema.yml.
cli16 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 17h04   #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
A priori le schema est bon.

Je regarderais plutôt du côté des validateurs.
__________________
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 18h43.


 
 
 
 
Partenaires

Hébergement Web