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 :

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 }
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 ?

Donc j'ai commencé à contruire ça moi-même, et j'y suis bien parvenu côté vue :

capaciteForm.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
      )));
J'ai bien sûr rajouté le bon renderRow dans le partial _form.php.

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 ?