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 :

Formulaire imbriqués avec relation n-n [1.x]


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 46
    Points : 34
    Points
    34
    Par défaut Formulaire imbriqués avec relation n-n
    Bonjour tout le monde,

    je suis entrain de réaliser un formulaire qui permet d'ajouter une instance (table app_instance) et lui associé une ou plusieurs base de données et qui permet de stocker les différents infos dans les 2 tables et aussi dans la table intermédiaire database_instance.

    Sachant que mes tables dans mon MCD sont représentées comme ça :

    app_instance==> 1,n <==database_instance ==> 1,n <== db_database

    Vous trouverez ci-dessous mon schéma.yml, sachant que je j'ai crée mes tables sous phpmyadmin et mon schéma a été généré automatiquement :

    AppInstance:
    connection: doctrine
    tableName: app_instance
    columns:
    id:
    type: integer(4)
    fixed: false
    unsigned: false
    primary: true
    autoincrement: true
    name:
    type: string(20)
    fixed: false
    unsigned: false
    primary: false
    notnull: true
    autoincrement: false
    relations:
    DatabaseInstance:
    local: id
    foreign: app_instance_id
    type: many

    DatabaseInstance:
    connection: doctrine
    tableName: database_instance
    columns:
    db_database_id:
    type: integer(4)
    fixed: false
    unsigned: false
    primary: true
    autoincrement: false
    app_instance_id:
    type: integer(4)
    fixed: false
    unsigned: false
    primary: true
    autoincrement: false
    relations:
    AppInstance:
    local: app_instance_id
    foreign: id
    type: one
    DbDatabase:
    local: db_database_id
    foreign: id
    type: one

    DbDatabase:
    connection: doctrine
    tableName: db_database
    columns:
    id:
    type: integer(4)
    fixed: false
    unsigned: false
    primary: true
    autoincrement: true
    name:
    type: string(20)
    fixed: false
    unsigned: false
    primary: false
    notnull: true
    autoincrement: false
    version:
    type: string(10)
    fixed: false
    unsigned: false
    primary: false
    notnull: true
    autoincrement: false
    relations:
    DatabaseInstance:
    local: id
    foreign: db_database_id
    type: many


    J'essaye d'utiliser les embededform et les embededRelation.
    Je vous remercie par avance de vos idées et suggestions

  2. #2
    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 : 61
    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


    Le schéma est illisible ainsi.

    Il y a un excellent sujet qui en parle sur la premier page du forum, avec toutes les informations pour réaliser ce type de montage.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    Je vous pris de m’excuser et merci pour l'indication, je suis nouveau sur le forum, donc voilà je pense que c’est plus clair maintenant. Du coup je récapitule, en fait je veux réaliser un formulaire imbriqué qui rassemble les 2 tables app_instance et db_database de relation n-n.

    Je précise que j’ai crée mes tables sous phpMyadmin donc mon schéma je l’ai généré automatiquement depuis ma base crée.

    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
     
    AppInstance:
      connection: doctrine
      tableName: app_instance
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        name:
          type: string(20)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        application_component_id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
      relations:
        DatabaseInstance:
          local: id
          foreign: app_instance_id
          type: many
     
    DatabaseInstance:
      connection: doctrine
      tableName: database_instance
      columns:
        db_database_id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: false
        app_instance_id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: false
      relations:
        AppInstance:
          local: app_instance_id
          foreign: id
          type: one
        DbDatabase:
          local: db_database_id
          foreign: id
          type: one
     
    DbDatabase:
      connection: doctrine
      tableName: db_database
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        name:
          type: string(20)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        version:
          type: string(10)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
      relations:
        DatabaseInstance:
          local: id
          foreign: db_database_id
          type: many

  4. #4
    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 : 61
    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
    Ton schéma nettoyé et configurer pour fonctionner en n-n. En effet, phpMyAdmin n'est pas capable de configurer correctement les objets Doctrines pour qu'ils travaillent en n-n.

    Le fichier schema.yml sert à trois choses :
    • Configurer les tables dans la base de données
    • Configurer les objets du modèle doctrine
    • Configurer les objets à ne pas générer pour symfony (option: symfony: form: false) qui ne servent à rien dans le cas d'une relation n-n


    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
     
    AppInstance:
      tableName: app_instance
      columns:
        name:
          type: string(20)
          notnull: true
        application_component_id: 
    	  type: integer(4)
      relations:
        DbDatabases:
    	  class: DbDatabase
          foreignAlias: AppInstances
          refClass: Suivi
     
    DatabaseInstance:
      tableName: database_instance
      options:
        symfony:
          form: false
          filter: false
      columns:
        db_database_id:
          type: integer (8)
          primary: true
        app_instance_id:
          type: integer (8)
          primary: true
      relations:
        AppInstance:
          foreignAlias: DatabaseInstances
        DbDatabase:
          foreignAlias: DatabaseInstances
     
    DbDatabase:
      tableName: db_database
      columns:
        name:
          type: string(20)
          notnull: true
        version:
          type: string(10)
          notnull: true
    Remarque que :
    • j'ai viré toutes les options par défaut.
    • J'ai viré la définition des clefs id, dans ce cas, doctrine crée automatiquement un id integer (8) auto-incrémenté.
    • J'ai préparé la table DatabaseInstance pour être le pivot de la relation n-n.
    • J'ai configuré la liaison (relation) directe entre les objets du modèle DbDatabase et AppInstance. A partir de là, pour récupérer depuis un objet enregistrement (doctrine_record) $AppInstance tous les DbDatabase, il suffira de faire dans le code : $AppInstance->getDbDatabases() qui retourne une collection d'enregistrement (doctrine_collection). A noter le "s" en fin du get qui indique que l'on va récupérer une collection.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    Je te remercie infiniment mimi, j'ai bien modifié mon schéma d'après la structure que tu as présenté, et donc là je teste sur 2 formulaire : DbDatabaseForm et AppInstanceForm
    Et donc quand j'affiche le formulaire "AppInstanceForm", normal il que les champs de la table app_instance, par contre dans le formulaire "DbDatabaseForm", j'ai une liste déroulante qui me permet de choisir une instance, ce qui me permet d'associer une database à une instance et ça marche bien puisque le résultat s'enregistre aussi dans la table intermédiaire, et moi je cherche à faire le contraire donc associer à une instance une database, c'est-a-dire pouvoir saisir ou choisir dans le formulaire "AppInstanceForm" une database.

    EST ce que pour faire cela je dois changer la structure de mon schéma ou ça peut être fait autrement

  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 : 61
    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
    Oups

    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
     
    AppInstance:
      tableName: app_instance
      columns:
        name:
          type: string(20)
          notnull: true
        application_component_id: 
    	  type: integer(4)
      relations:
        DbDatabases:
          class: DbDatabase
          foreignAlias: AppInstances
          refClass: Suivi
     
    DatabaseInstance:
      tableName: database_instance
      options:
        symfony:
          form: false
          filter: false
      columns:
        db_database_id:
          type: integer (8)
          primary: true
        app_instance_id:
          type: integer (8)
          primary: true
      relations:
        AppInstance:
          foreignAlias: DatabaseInstances
        DbDatabase:
          foreignAlias: DatabaseInstances
     
    DbDatabase:
      tableName: db_database
      columns:
        name:
          type: string(20)
          notnull: true
        version:
          type: string(10)
          notnull: true
      relations:
        AppInstances:
          class: AppInstance
          foreignAlias: DbDatabases
          refClass: Suivi

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    Je te remercie encore une fois pour ta réponse, d'après les tests que j'ai faites je me suis rendu compte que le fait de déclarer la relation "DbDatabases" ou "AppInstances" dans le schéma que ça soit dans la table app_instance ou db_database
    ==> donne toujours le même résultat c'est-à-dire ça permet de créer une relation n-n entre les deux tables et enregistrer les 2 clé dans la table de pivot,
    D'une part, ça permet :
    1)au niveau du formulaire AppInstanceForm d'avoir une liste déroulante pour choisir une Database
    2)au niveau du formulaire DbDatabaseForm d'avoir une liste déroulante pour choisir une Instance .
    Jusqu'au là c'est bien, et donc est ce que c'est possible d'aller plus loin encore avec les formulaires imbriqués de relation n-n ?
    En fait moi je cherche carrément à avoir un formulaire qui contient tous les champs des tables app_instance et db_databse, c'est-à-dire dans le formulaire AppInstanceForm pouvoir saisir le nom de la database à la main dans un champ texte et non pas choisir la database dans une liste déroulante

  8. #8
    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 : 61
    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
    Quant tu fais : symfony doctrine:build --all, symfony construit les tables, les objets du modèle, mais aussi les forms (formulaires)...

    Et tous le secret est dans les forms. Modifie ton objet formulaire et change le widget "choice" par in widget "input", tu auras alors une sone de saisie. Par contre, il va falloir jetter un oeil sur le validateur pour qu'il vérifie bien que le nom de la database saisi existe.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    D'accord je vois ce que tu veux dire, du coup pour changer mes widgets, est ce l'idéal c'est de faire les modif dans mon fichier AppInstanceForm ou modifier directement mon fichier BaseAppInstanceForm

  10. #10
    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 : 61
    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
    Règle numéro 1 :
    Jamais tu ne touche à un objet base, il est régénéré à chaque fois que tu fais un build !!!

  11. #11
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    Merci pour le conseil je plonge dessus

  12. #12
    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 : 61
    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
    Exception à la règle n°1
    lib/form/BaseForm.class.php
    ce fichier est la base de tous les objets form de l'application, il permet de modifier des méthode de sfFormSymfony ou de rajouter des méthodes pour tous les form du projet. Il peut être modifier et n'est généré que s'il n'existe pas.

  13. #13
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    C'est noté

  14. #14
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    Un Grand Merci à toi mimi, en fait la clé pour réussir ses formulaires imbriqués en symfony c’est de bien écrire son schéma.yml

  15. #15
    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 : 61
    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
    Oui.

    Mais pas que dans symfony, même si dans symfony, c'est plus flagrant

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/04/2013, 20h23
  2. [AC-2007] formulaire avec relations N N
    Par primo dans le forum IHM
    Réponses: 7
    Dernier message: 11/01/2010, 18h24
  3. [CS3] Formulaires imbriqués avec conditionnelles
    Par HAbroc dans le forum Dreamweaver
    Réponses: 1
    Dernier message: 12/09/2009, 19h03
  4. formulaire sur tables avec relations
    Par cath2123 dans le forum IHM
    Réponses: 1
    Dernier message: 13/04/2009, 02h15
  5. Réponses: 1
    Dernier message: 15/01/2007, 17h19

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