Bonjour à tous,

Voila, j'y suis, j'ai souvent utilisé votre forum pour me réconforter dans me choix de développement ... mais la je bloque sur l'enregistrement d'un formulaire à 3 niveaux: le form principal avec un embed qui lui-même possède un embed.
Petite mise en situation:
J'édite une fiche produit dans mon backend, mon produit possède un article (premier form embed) qui lui même possède un ou plusieurs tarifs.
J'ai suivi l'exemple des formulaires avancés pour concentrer mes tarifs dans une collection (http://symfony.com/legacy/doc/more-w...advanced-forms).
j'affiche par défaut 3 formulaires tarifs dans mon formulaire principal mais lors de l'enregistrement, celui-ci ne supprime pas les tarifs vide et les insères dans la base de données.
Je surcharge alors la méthode du formulaire principal saveEmbeddedForms pour supprimer avant l'enregistrement les tarifs vides mais j'ai l'erreur suivante :
Cannot remove form fields (read-only).

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
public function saveEmbeddedForms($con = null, $forms = null)
  {
    if (null === $con)
      $con = $this->getConnection();
 
    if (null === $forms)
      $forms = $this->getEmbeddedForms();
 
    $massificationArticle = $this->getValue('NewMassificationArticle');
    $tarifs = $massificationArticle['newTarifsFournisseur'];
    foreach ($forms['NewMassificationArticle']['newTarifsFournisseur'] as $name => $form)
    {
      if (!isset($tarifs[$name]))
        unset($forms['NewMassificationArticle']['newTarifsFournisseur'][$name]); //read-only : unset impossible
    }
 
    return parent::saveEmbeddedForms($con, $forms);
  }
j'ai alors déplacé cette fonction dans le formulaire de l'article (ce qui semble d'ailleurs plus logique) mais les tarifs sont toujours inexistant malgré la présence de valeur à l'édition et les formulaires sont tous supprimés. De ce fait c'est l'inverse qui se produit, à savoir qu'aucun tarifs n'est enregistré.

j'espère avoir bien expliqué ce problème qui me semble pourtant simple mais que je n'arrive pas à résoudre.
Si vous avez une piste je suis preneur. Merci par avance pour votre temps donné.

je communique une partie du schéma (au cas ou une erreur se serait glissée sans que je l'aperçoive).
PS : j'ai supprimé volontairement quelques colonnes car les tables sont volumineuse.

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
AdherentProduit:
  connection: doctrine
  tableName: adherent_produit
  actAs:
    Indexable:
      fields: [designation]
    Sluggable:
      unique: true
      fields: [designation]
      canUpdate: false
    Timestampable:
  columns:
    id: { type: integer(4), primary: true, autoincrement: true }
    id_gestcom: { type: integer(11), notnull: true }
    designation: { type: string(255), notnull: true }
    description: { type: string(4000) }
    visuel_produit: { type: string(255) }
    nomenclature_id: { type: integer(4), notnull: true }
    site_id: { type: integer(4), notnull: true }
    adherent_fournisseur_id: { type: integer(4), notnull: true }
    is_published: { type: boolean, notnull: true, default: 1 }
  relations:
    Nomenclature:
      local: nomenclature_id
      foreign: id
      foreignAlias: AdherentProduits
    AdherentFournisseur:
      local: adherent_fournisseur_id
      foreign: id
      foreignAlias: AdherentProduits
    Site:
      local: site_id
      foreign: id
      foreignAlias: AdherentProduits
  indexes:
    id_gestcom_index:
      fields:
        id_gestcom:
          sorting: ASC
        site_id: []
      type: unique
    id_slug_site_index:
      fields:
        slug: []
        site_id: []
      type: unique
 
MassificationArticle:
  connection: doctrine
  tableName: massification_article
  actAs:
    Timestampable:
  columns:
    id: { type: integer(4), primary: true, autoincrement: true }
    adherent_produit_id: { type: integer(4), notnull:true }
    statut_article_massification_id: { type:integer(4), notnull: true }
    uls_id: { type: integer(4) }
    uvc : { type: varchar(100) }
    quantite_uvc: { type: integer(8) }
    franco: { type: decimal(10), scale: 2, notnull:true }
    type_franco_id: { type:integer(4), notnull:true }
    prix_constate: { type: decimal(10), scale: 2, notnull:true, comment: "Prix unitaire généralement constaté" }
    gencode: { type: varchar(255), notnull: true }
    reference: { type: varchar(255), notnull: true }
    code_catalogue: { type: varchar(255), notnull: true }
    tva: { type: decimal(10), scale: 2 }
  relations:
    AdherentProduit:
      local: adherent_produit_id
      foreign: id
      foreignAlias: MassificationArticle
    StatutArticleMassification:
      local: statut_article_massification_id
      foreign: id
      foreignAlias: MassificationArticle
    Uls:
      local: uls_id
      foreign: id
      foreignAlias: MassificationArticle
    TypeFranco:
      local: type_franco_id
      foreign: id
      foreignAlias: MassificationArticle
 
TarifFournisseur:
  connection: doctrine
  tableName: tarif_fournisseur
  columns: 
    id: {type:integer(4), primary:true, autoincrement:true}
    massification_article_id: {type:integer(4), notnull:true}
    tarif: { type: decimal(10), scale: 2, notnull:true }
    quantite: { type: integer(8), notnull:true }
    tarif_promo: { type: decimal(10), scale: 2 }
  relations:
    MassificationArticle:
      local: massification_article_id
      foreign: id
      foreignAlias: TarifFournisseur