Bonjour,

Encore un problème avec les embedform !!!

Je m'explique :
J'ai 2 tables, TypeCarte et Niveau qui sont reliées par une "relation n:n" contenant un champs prix. En français, pour chaque type de carte, on peut attribuer un prix par niveau.

Le problème est qu'il m'est impossible d'enregistrer les prix à partir des embedForm contenus dans le formulaire de TypeCarte.
Bon je vous affiche le code ça vous parlera plus bande de geeks

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
TypeCarte:
  actAs: [Timestampable]
  columns:
    id:
      type: integer(11)
      primary: true
      autoincrement: true
    name:
      type: string(100)
      notnull: true
      unique: true
 
NiveauTypeCarte:
  columns:
    niveau_id:
      type: integer(11)
      primary: true
    typecarte_id:
      type: integer(11)
      primary: true
    prix:
      type: float
      unsigned: true
      notnull: true
  relations:
    Niveau:
      local: niveau_id
      foreign: id
      foreignAlias: NiveauTypeCartes
    TypeCarte:
      local: typecarte_id
      foreign: id
      foreignAlias: NiveauTypeCartes
 
Niveau:
  columns:
    id:
      type: integer(11)
      primary: true
      autoincrement: true
    name:
      type: string(100)
      notnull: true
      unique: true
  relations:
    TypeCartes:
      class: TypeCarte
      local: niveau_id
      foreign: typecarte_id
      foreignAlias: Niveaus
      refClass: NiveauTypeCarte
TypeCarteForm.class.php
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
class TypeCarteForm extends BaseTypeCarteForm
{
 
  protected $scheduledForDeletionPrix = array();
 
  public function configure()
  {
    $newNiveaus = new sfForm();
    $niveaus = Doctrine::getTable('Niveau')->createQuery('n')->execute();
    $count = 0;
    foreach ($niveaus as $niveau) {
      $niveauId = $niveau->getId();
      $niveauName = $niveau->getName();
      $niveau_form = new NiveauTypeCarteForm();
      if($this->getObject()->getNiveaus($niveauId)) {
	$newNiveaus->embedForm($niveauName, $niveau_form);
	$newNiveaus->widgetSchema[$niveauName]->setLabel($niveauName);
      }
      $count ++;
    }
    $this->embedForm('newNiveaus', $newNiveaus);
  }
 
  protected function doBind(array $values)
  {
    if (isset($values['NiveauTypeCartes']))
    {
      foreach ($values['NiveauTypeCartes'] as $i => $prixValues)
      {
        if (isset($telValues['delete']) && $prixValues['id'])
        {
          $this->scheduledForDeletionPrix[$i] = $telValues['id'];
 
        }
      }
    }    
    parent::doBind($values);
  }
 
  protected function doUpdateObject($values)
  {
    if (count($this->scheduledForDeletionPrix))
    {
      foreach ($this->scheduledForDeletionPrix as $index => $id)
      {
        unset($values['NiveauTypeCartes'][$index]);
        unset($this->object['NiveauTypeCartes'][$index]);
        Doctrine::getTable('NiveauTypeCarte')->findOneById($id)->delete();
      }
    }
    $this->getObject()->fromArray($values);
  }
 
  public function saveEmbeddedForms($con = null, $forms = null)
  {
    if (null === $con)
    {
      $con = $this->getConnection();
    }
 
    if (null === $forms)
    {
      $forms = $this->embeddedForms;
    }
    foreach ($forms as $form)
    {
      if ($form instanceof sfFormObject)
      {
        if ($form->getModelName()=='NiveauTypeCarte' && !in_array($form->getObject()->getId(), $this->scheduledForDeletionPrix)
	){
          $form->saveEmbeddedForms($con);
          $form->getObject()->save($con);
        }
      }
      else
      {
        $this->saveEmbeddedForms($con, $form->getEmbeddedForms());
      }
    }
  }	 
 
}
NiveauTypeCarteForm.class.php
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
class NiveauTypeCarteForm extends BaseNiveauTypeCarteForm
{
  public function configure()
  {
 
    unset($this['typecarte_id']);
 
    if(!$this->isNew()){
	$this->widgetSchema['delete'] = new sfWidgetFormInputCheckbox(array(
		'label' => 'Supprimer'
	));
	$this->validatorSchema['delete'] = new sfValidatorPass();
    }
 
  }
J'ai aussi essayé de mettre directement un embedRelation (qui fonctionne très bien sur les relations 1:n), l'affichage est parfait mais toujours impossible d'enregistrer, tout comme le plugin ahDoctrineEasyEmbeddedRelationsPlugin ...

J'espère qu'une âme charitable sera me démêler de cette situation, j'ai vu sur pas mal de forum ce problème mais malgré sa récurrence aucune solution ou info n'est donnée.

Merci d'avance