Ca fait longtemps (très longtemps) que je n’avais pas écrit sur ce blog.

J’ai eu l’occasion de passer à symfony 1.4 depuis et de voir les changements.
Le plus gros d’entre eux c’est bien sur de passer de l’ORM propel à l’ORM doctrine.

Il faut revoir pas mal de ses habitudes, mais il faut avouer que les relations et les formulaires imbriqués sont bien mieux gérés maintenant.
Enfin à condition de bien concevoir son schema.yml.

C’est là le principal problème, si le schéma est bien fait, symfony fait tout automatiquement. Sinon il faut tout le temps bricoler.
Ors, j’ai lut beaucoup de solutions qui merdaient d’une façon ou d’une autre avant de trouver celle qui répondait vraiment à mes besoins.

Voici donc un exemple de relation en many-to-many dans le schema.yml :

 

[php]Site:
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
      autoincrement: true
    url:
      type: varchar(255)
      notnull: true
    libelle:
      type: varchar(255)
      notnull: true
  relations:
    Lien:
      class: Site
      local: site_id
      foreign: lien_id
      refClass: LienSite
      onDelete: CASCADE
Lien:
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
      autoincrement: true
    url:
      type: varchar(255)
      notnull: true
      unique: true
    libelle:
      type: varchar(255)
      notnull: true
    description:
      type: string(128)
  relations:
    Site:
      class: Lien
      local: lien_id
      foreign: site_id
      refClass: LienSite
      onDelete: CASCADE
 
LienSite:
  tableName: site_has_lien
  columns:
    site_id:
      type: integer(4)
      primary: true
    lien_id:
      type: integer(4)
      primary: true
  indexes:
    fk_site_has_lien_lien1:
      fields: [lien_id]
    fk_site_has_lien_sites1:
      fields: [site_id]

 

 

Pour les deux tables concernées, on ajoute donc les relations vers l’autre table, en indiquant la table servant de référence entre les deux

 [php]relations:
    Site:                                            # le nom de la relation, il sera utilize lors
de l’appel du formulaire par l’admin generator par exemple. 
      class: Lien                              #La classe à laquelle se réfere votre relation, dans une relation many to many, c’est la même classe (Lien pour une relation dans la table lien etc…)
      local: lien_id                        # l’id qui represente la primary key de cette table dans la table référence
      foreign: site_id                  # l’id de l’autre table en relation représenté dans la table de reference
      refClass: LienSite              # la table de référence
      onDelete: CASCADE        # une contrainte classique pour éviter les problèmes ;)
 

Si on s’y prend comme cela, il n’y a ensuite plus rien à faire dans les formulaires, tout est géré automatiquement.
Le seul réglage dans mon cas est de rendre un champs unset dans un des deux cas, si je ne veux pas que le champs de lien s’affiche sur le formulaire des sites…

Vous aurez donc un widget « site_list » dans votre formulaire lien, et un widget « lien_list » dans votre formulaire site.