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 :

Filtrer les données proposées dans un formulaire


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Inscrit en
    octobre 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 109
    Points : 43
    Points
    43
    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

  2. #2
    Membre habitué Avatar de Maerlyn31
    Homme Profil pro
    Développeur Web
    Inscrit en
    mai 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mai 2011
    Messages : 71
    Points : 167
    Points
    167
    Par défaut
    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 !

  3. #3
    Membre du Club
    Inscrit en
    octobre 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 109
    Points : 43
    Points
    43
    Par défaut
    Salut à toi !

    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
    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.

  4. #4
    Membre habitué Avatar de Maerlyn31
    Homme Profil pro
    Développeur Web
    Inscrit en
    mai 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mai 2011
    Messages : 71
    Points : 167
    Points
    167
    Par défaut
    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 !

  5. #5
    Membre du Club
    Inscrit en
    octobre 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 109
    Points : 43
    Points
    43
    Par défaut
    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

  6. #6
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    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 !

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/03/2008, 15h54
  2. Réponses: 2
    Dernier message: 04/03/2008, 11h32
  3. [MySQL] récupérer les données mysql dans un formulaire
    Par cali62100 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/04/2007, 14h17
  4. Recuperer les données saisie dans un formulaire
    Par hunzi dans le forum XMLRAD
    Réponses: 3
    Dernier message: 29/08/2006, 15h22
  5. Filtrer sur les données vides dans un formulaire
    Par jevany dans le forum Access
    Réponses: 7
    Dernier message: 29/05/2006, 08h50

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