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 27/06/2011, 19h51   #1
Candidat au titre de Membre du Club
 
Inscription : octobre 2009
Messages : 109
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 109
Points : 11
Points : 11
Par défaut Filtrer les données proposées dans un formulaire

Salut à tous,

J'aimerais mettre en place un filtre sur les données qui apparaissent à l'utilisateur dans un formulaire.

Mon application propose une liste d'entreprise, lorsqu'une d'entre elle est choisie, je sauvegarde son ID et son NOM en session afin de ne proposer que des données filtrées.

Le problème vient quand par exemple, on essaye de rajouter un élément a l'entreprise ( Site / Bâtiment ), le formulaire propose la totalité des clé étrangères.

Je vous donne un exemple :

Je sélectionne l'entreprise A , je peux consulter la liste des Bâtiments et Sites de cette entreprise. Mais quand je veux rajouter un bâtiment, le formulaire me propose de le relier aux sites de toutes les entreprises de la BD. Or j'aimerais qu'il filtre pour n'afficher que les Sites de l'entreprise courante.

Je suis allé voir dans les fichier BaseXXForm.class , j'ai l'impression que c'est ici que je dois manœuvrer. Le souci c'est que ces fichiers sont écrasés à chaque build-forms, donc je présume qu'il faut passer par les formulaires normaux ( pas ceux du dossier Base).

Si vous pouviez m'indiquer où je dois faire ma modif et comment.
Merci d'avance
Knarf64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 08h52   #2
Membre habitué
 
Avatar de Maerlyn31
 
Homme Baptiste Naudinat
Développeur Web
Inscription : mai 2011
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Naudinat
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2011
Messages : 70
Points : 146
Points : 146
Hello !

Alors tout d'abord je te confirme qu'il ne faut pas travailler sur les XXXBaseForm, mais bien sur des classes de formulaires qui héritent de XXXbaseForm (selon le cas, tu peux travailler directement sur lib/form/doctrine/XXXFormDoctrine ou bien carrément crééer un lib/form/doctrine/MonFormPersoForm.class.php qui héritera de ton XXXBaseForm).

Je n'arrive pas par contre à voir exactement ce que tu cherches à faire ... tu as un premier formulaire de sélection de l'entreprise, celui là fonctionne, et tu cherches maintenant à créer un nouveau form où l'on peut choisir parmis des batiments/sites relatifs à l'entreprise selectionnée ?
Donne nous aussi quelques extraits de ton schema.ym ça nous aidera à voir les relations entre tes objets, et on pourra voir ensemble au passage si c'est bien propre !
Maerlyn31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 14h15   #3
Candidat au titre de Membre du Club
 
Inscription : octobre 2009
Messages : 109
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 109
Points : 11
Points : 11
Salut à toi !

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
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
 
Entreprise:
  tableName: entreprise
  columns:
    nom:
      type: string(45)  
      notnull: true
    addresse:
      type: string(45)
    siret:
      type: string(45)
    raison_sociale:
      type: string(45)
    commentaire:
      type: string(45)
 
Site:
  tableName: site
  columns:
    nom:
      type: string(45)
      notnull: true
    mode_acces_reseau:
      type: string(45)
    addresse:
      type: string(45)
    commentaire:
      type: string(45)
      autoincrement: false
    entreprise_id:
      type: integer
      notnull: true
  relations:
    Entreprise:
      foreignAlias: Sites # One to Many
 
Batiment:
  tableName: batiment
  columns:
    nom:
      type: string(45)
      notnull: true
    etage:
      type: integer(4)
    commentaire:
      type: string(45)
    site_id:
      type: integer
      notnull: true
  relations:
    Site:
      foreignAlias: Batiments # One to Many
 
Service:
  tableName: service
  columns:
    nom:
      type: string(45)
      notnull: true
    commentaire:
      type: string(45)
  relations:
    Batiments:
      foreignAlias: Services
      class: Batiment
      refClass: BatimentService # Many To Many
    Personnels:
      foreignAlias: Services
      class: Personnel
      refClass: PersonnelService # Many To Many
 
BatimentService:
  tableName: batiment_has_service
  columns:
    service_id:
      type: integer
      primary: true
    batiment_id:
      type: integer
      primary: true
  relations:
    Batiment:
      foreignAlias: BatimentServices
    Service:
      foreignAlias: BatimentServices
 
Personnel:
  tableName: personnel
  columns:
    nom:
      type: string(45)
    prenom:
      type: string(45)
    fonction:
      type: string(45)
    mail:
      type: string(45)
    num:
      type: string(45)
    naissance:
      type: datetime
    is_masculin:
      type: integer(1)
 
 
PersonnelService:
  tableName: personnel_has_service
  columns:
    personnel_id:
      type: integer
      primary: true 
    service_id:
      type: integer
      primary: true 
  relations:
    Personnel:
      foreignAlias: PersonnelServices
    Service:
      foreignAlias: PersonnelServices
 
Bureau:
  connection: doctrine
  tableName: bureau
  columns:
    num:
      type: string(10)
    etage:
      type: string(45)
    commentaire:
      type: string(45)
  relations:
    Personnels:
      foreignAlias: Bureaus 
      class: Personnel
      refClass: PersonnelBureau # Many To Many
 
PersonnelBureau:
  tableName: personnel_has_bureau
  columns:
    personnel_id:
      type: integer
      primary: true
    bureau_id:
      type: integer
      primary: true
  relations:
    Personnel:
      foreignAlias: PersonnelBureaus
    Bureau: 
      foreignAlias: PersonnelBureaus
 
BureauOrdinateur:
  tableName: bureau_has_ordinateur
  columns:
    bureau_id:
      type: integer
      primary: true
    ordinateur_id:
      type: integer
      primary: true
  relations:
    Ordinateur:
      foreignAlias: BureauOrdinateurs
    Bureau: 
      foreignAlias: BureauOrdinateurs
 
PersonnelOrdinateur:
  tableName: personnel_has_ordinateur
  columns:
    personnel_id:
      type: integer
      primary: true
    ordinateur_id:
      type: integer
      primary: true
  relations:
    Ordinateur:
      foreignAlias: PersonnelOrdinateurs
    Personnel: 
      foreignAlias: PersonnelOrdinateurs

Bon alors pour expliquer correctement : les données proposées dans l'ajout d'un site ou d'un bâtiment sont celles de la BD , mais complète. J'aimerais que le formulaire ne propose que les données relatives à l'entreprise courante.

Exemple bien concret :

J'ai sélectionné dans l'application une entreprise A , qui possède un service A sur le site A et 3 employés (A, B et C ).

En ajoutant un service au site A, le formulaire me propose de renseigner (entre autre): le site ( A donc ) et les employés, sauf qu'il me propose les employés suivant : A , B , C , D , E , F. Or je ne veux voir que les employés déjà présents dans l'entreprise ( D, E, F venant d'une entreprise X ) .

Pour résumé je veux filtrer les données proposées par le formulaire en fonction de l'entreprise courante ( et du site , mais on verra après ) qui est enregistrée en session lorsque sélectionnée.

J'espère avoir pu éclairci ma demande.
Merci du coup de main.
Knarf64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 15h22   #4
Membre habitué
 
Avatar de Maerlyn31
 
Homme Baptiste Naudinat
Développeur Web
Inscription : mai 2011
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Naudinat
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2011
Messages : 70
Points : 146
Points : 146
Hmmm ....

Alors déjà, ton schema a l'air valide (à part une entité Ordinateur qui se balade toute seule, mais bon je suppose qu'elle doit trainer quelque part ^^).

Pour ce qui est de ton besoin de lier les employés directement à un service et a une entreprise, je ne sais pas si c'est le plus adapté ...

Dans tous les cas, ce que tu cherche a faire est un widget de choix multiples (soit une liste déroulante, soit une liste de checkbox, ou encore une liste de bouttons radios, en terme Symfony c'est pareil).
Il te faudra donc, dans ta classe de formulaire, définir (ou surcharger, si il est déjà défini à priori c'est le cas) un widget sfWidgetFormChoice, et lui donner en argument un array qui t'es renvoyé par Doctrine.
Pour définir ce widget, tu peux par exemple t'inspirer de ce tuto : le but est de créer une requête Doctrine et de l'appeler dans ton widget.

Tout le problème est cependant d'écrire la requête Doctrine qui va bien. Vu ton schema.yml, il doit y avoir moyen de passer par des leftJoin pour obtenir ce que tu souhaites, mais il est peut-être aussi plus simple de créer une relation entre Personnel et Entreprise (sémantiquement ça m'a l'air sensé en tout cas).

Bon courage !
Maerlyn31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 16h26   #5
Candidat au titre de Membre du Club
 
Inscription : octobre 2009
Messages : 109
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 109
Points : 11
Points : 11
Merci bien pour l'info, le tuto est parfaitement ce que je souhaite.
Concernant la requête je l'ai déjà plus ou moins sous le coude.

Je pars la dessus et je posterai le code qui marche, même si le tuto a l'air vraiment suffisant c'est toujours ca de plus sur le web.

Merci Maerlyn31
Knarf64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 14h48   #6
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
Vu le modèle, il n'est pas possible avec les informations actuelles de mettre un lien directe entre personnel et entreprise.

Reste qu'effectivement, il ne serait pas faux, sémantiquement, de mettre un lien entre entreprise et personnel avec un entreprise_id dans personnel.

Ce qui permettrais d'avoir un raccourcis dans les requêtes et un côté sémantique plus fiable.
__________________
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 02h04.


 
 
 
 
Partenaires

Hébergement Web