Bonjour,
Je suis en train de développer une petite appli de gestion des compétences pour des organismes de formation.
Une compétence (capacite dans le schéma ci-dessous) pour être sélectionnée pour plusieurs territoires (lieu) et bien sûr un lieu peut être lié à plusieurs compétences. Il me semble donc que nous sommes dans une relation many to many. Or donc après moult recherches, j'en suis arrivé au schéma suivant :
Maintenant, lorsque j'arrive sur le editSuccess pour modifier une compétence, les champs ne sont pas générés automatiquement. J'ai lu quelque part sur un forum que ce devrait être le cas. L'information est-elle erronée ? Dans le baseCapaciteForm je n'ai aucun widget qui fasse référence à cette relation. Le problème viendrait-il d'une mauvaise écriture du schéma ?
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 capacite: actAs: { Timestampable: ~ } columns: text: { type: string(4000), notnull: true } deleted: { type: boolean, notnull: true, default: false } id_formateur: { type: integer, notnull: true } id_ech_exp: { type: integer, notnull: true } id_domaine: { type: integer, notnull: true } relations: formateur: { onDelete: CASCADE, local: id_formateur, foreign: id, foreignAlias: formateursCapacites } echelle_experience: { onDelete: CASCADE, local: id_ech_exp, foreign: id, foreignAlias: expCapacites } sous_domaine: { onDelete: CASCADE, local: id_domaine, foreign: id, foreignAlias: domainesCapacites } lieux: foreignAlias: CapacitesZoneGeoAccept class: Lieu refClass: ZoneGeoAccept local: id_capacite foreign: id_lieu lieu: columns: nom: { type: string(255), notnull: true } type: { type: enum, length: 3, values: ['aca','dep','gre'], notnull: true } zone_geo_accept: columns: id_capacite: { type: integer, primary: true, notnull: true } id_lieu: { type: integer, primary: true, notnull: true } relations: capacite: { onDelete: CASCADE, local: id_capacite, foreign: id, foreignAlias: zonesGeoAcceptees } lieu: { onDelete: CASCADE, local: id_lieu, foreign: id, foreignAlias: zonesGeoAcceptees }
Donc j'ai commencé à contruire ça moi-même, et j'y suis bien parvenu côté vue :
capaciteForm.php :
J'ai bien sûr rajouté le bon renderRow dans le partial _form.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 $this->setWidget( 'zonesGeoAccept' , new sfWidgetFormDoctrineChoice(array( 'model' => 'Lieu', 'add_empty' => false, 'multiple' => true, 'expanded' => true ))); $this->widgetSchema->setLabels( array( 'text' => 'Compétence', 'id_formateur' => 'Formateur', 'id_ech_exp' => 'Expérience', 'id_domaine' => 'Sous-domaine', 'zonesGeoAccept' => 'Mobilité' )); $this->widgetSchema['text']->setAttribute('cols',60); $this->widgetSchema['domaine']->setDefault( $this->getObject()->getSousDomaine()->getIdDomaine() ); $zones_records = $this->getObject()->getZonesGeoAcceptees(); foreach($zones_records as $key=>$value) { $default_zones[]=$value->getIdLieu(); } $this->widgetSchema['zonesGeoAccept']->setDefault( $default_zones ); $this->setValidator('domaine', new sfValidatorDoctrineChoice(array( 'model' => 'Domaine' ))); $this->setValidator('zonesGeoAccept', new sfValidatorDoctrineChoice(array( 'model' => 'Lieu', 'multiple' => true )));
Mon problème c'est comment sauvegarder les modifications relatives à cette relation... Faut-il faire quelque chose dans le fichier actions.class.php au niveau du processForm ? Faut-il réécrire la méthode save() du modèle ?
Partager