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
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 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
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
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()); } } } }
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 ...
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'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
Partager