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 06/04/2011, 02h13   #1
Invité de passage
 
Homme
Étudiant
Inscription : avril 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 3
Points : 0
Points : 0
Par défaut aide formulaire symfony

Bonjour,
Dans symfony les formulaires sont souvent considérés comme un framework à part entière tellement ils peuvent être complexes.
Je dois avouer que j'ai beaucoup de mal à les appréhender...

Je sais que ce genre de post est très présent sur le forum mais je n'ai jamais réussi (pour le moment) à comprendre correctement et à appliquer à mon cas les réponses donnée.

Voilà mon problème :

Je travail sur un réseau social à la facebook et j'ai besoin qu'un utilisateur puisse envoyer un message privé à un autre utilisateur.

Voici la structure de la bdd :

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
 
User:
  actAs: { Timestampable: ~ }
  connection: doctrine
  tableName: user
  columns:
    iduser:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    firstname:
      type: string(45)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    lastname:
      type: string(45)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    email:
      type: string(45)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    login:
      type: string(45)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    password:
      type: string(45)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
Message:
  actAs: { Timestampable: ~ }
  connection: doctrine
  tableName: message
  columns:
    idmessage:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    sender:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    subject:
      type: string(45)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    content:
      type: string()
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
  relations:
    User:
      local: sender
      foreign: iduser
      type: one
    Receiver:
      local: idmessage
      foreign: idmessage
      type: many
Receiver:
  connection: doctrine
  tableName: receiver
  columns:
    idreceiver:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    idmessage:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    iduser:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
  relations:
    Message:
      local: idmessage
      foreign: idmessage
      type: one
    User:
      local: iduser
      foreign: iduser
      type: one
Donc j'ai créé un module "message", les formulaires de base fonctionnent très bien mais comme les destinataires d'un message sont stockés dans une table à part j'aimerai pouvoir rajouter un champ permettant d'en saisir plusieurs (je pense que pour l'exemple un seul suffira) et que une fois le formulaire est validé un message est créé ainsi qu'autant de destinataires que nécessaire.

J'espère avoir été assez clair, n'hésitez pas à me demander de plus amples informations/explications.

Merci d'avance de votre aide.
cthiebot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 09h59   #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
Manifestement ton schéma est récupéré d'une base existante. Il est fortement recommandé de créer le schéma directement et de générer la base de donnée avec plutôt que le contraire. En effet, le shema.yml n'est pas uniquement la description de la base mais surtout celle des objets du modèle permettant de la gérer.

Ton schéma revu à ma façon, une recherche dans le forum te donnera les explications nécessaire à comprendre les modifications.
Code yaml :
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
# shema.yml
User:
  actAs: { Timestampable: ~ }
  tableName: user
  columns:
    first_name:
      type: string(45)
      notnull: true
    last_name:
      type: string(45)
      notnull: true
    email:
      type: string(200)
      notnull: true
    login:
      type: string(45)
      notnull: true
    password:
      type: string(45)
      notnull: true
 
Message:
  actAs: { Timestampable: ~ }
  tableName: message
  columns:
    sender_id:
      type: integer
      notnull: true
    subject: string(45)
    content: cblob
  relations:
    Sender:
      class: User
      local: sender_id
      foreign: id
      foreignAlias: SendMessages
    Receivers:
      class: User
      refClass: Receiver
      foreignAlias: ReceiveMessages
 
Receiver:
  tableName: receiver
  columns:
    user_id:
      type: integer
      primary: true
    message_id:
      type: integer
      primary: false
  relations:
    Message:
      foreignAlias: receivers
    User:
      foreignAlias: receivers
Ce qui te donne deux tables (user et message) et ne liaison n-n entre elles sur receiver.

Je ne suis pas sur que le fait de stocker les receivers dans une liaison soit une bonne idée, un champ destA devrait suffir dans le message, de plus des champs destC et destCC seraient un plus intéressant.

A mon avis il faut dupliquer les messages reçu pour chaque destinataire (si non comment traiter les suppression partiel. Où alors créer une table de liaison n-n entre user et message pour qui à le message dans sa boite. Si le lien est effacer, on supprime cet enregistrement. Et si c'est le dernier n-n d'un message on supprime le message.


Pour ta saisie, le plus simple, dans ta structure actuel (qu'il faut corriger) serait d'utiliser les méthodes de symfony de gestion des liaisons multiples par plusieurs boite, c'est automatiquement généré si ton schéma est correcte.

Si non, il faut faire un form non relié à doctrine pour l'édition du message. Le retour et l'envoi des informations se faisant dans le contrôleur. Il faudra probablement écrire un validateur pour la vérification de l'adresse (des adresses) du(des) destinataire(s).
__________________
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 07/04/2011, 12h28   #3
Invité de passage
 
Homme
Étudiant
Inscription : avril 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 3
Points : 0
Points : 0
Merci pour cette réponse des plus complète!

Cependant, la date limite de fin de développement (immuable) approche à grands pas et je pense ne pas avoir le temps pour repartir sur de meilleures bases.
Ne me serait-il pas possible de m'en sortir avec un mergeForm, embedForm ou encore embedRelation?

Encore une fois merci!
cthiebot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 14h30   #4
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
Je ne sais pas ce que tu cherches réellement a faire, donc je ne peux donner une solution satisfaisante.

Mes embedForm (pas mergeForm) sont une des possibilités, mais est-ce la bonne ?

Avec une relation n-n bien définie, l'idéal est les doubles listes (sélectionné (lié) et non sélectionné). Mais ce n'est peut-être pas conforme à ton cahier des charges.

Un mauvais modèle peut être une handicap dans le développement.
__________________
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 07/04/2011, 15h15   #5
Invité de passage
 
Homme
Étudiant
Inscription : avril 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 3
Points : 0
Points : 0
Bon je vais récupérer la valeurs du champ destinataire à la validation du formulaire dans le action.class.php et remplir la table "à la main" ce sera plus simple pour ce projet vu le manque de temps.
Mais je m'assurerai la prochaine fois d'avoir un model de bdd et un schéma nickel avant de commencer le développement.

Encore un grand merci pour ton aide!
cthiebot 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 02h02.


 
 
 
 
Partenaires

Hébergement Web