Bonjour,

Je réalise une petite plateforme où des utilisateurs se connectent via login/mot de passe et gèrent un petit carnet de contacts. Comme j'utilise le plugin sfDoctrineGuard je pars sur un modèle ultra-simple pour mieux illustrer mon problème :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
Contact:
  actAs: { Timestampable: ~ }
  columns:
    client_id:  { type: integer, notnull: true }
    nom:         { type: string(255), notnull: true }
    prenom:      { type: string(255), notnull: true }
    mail:         { type: string(255), notnull: true }
    tel:          { type: string(255), notnull: true }
  relations:
    SfGuardUser: { onDelete: CASCADE, local: client_id, foreign: id, foreignAlias: SfGuardUser }
C'est tout ! Une seule table donc, avec une clé étrangère correspondant à l'id de l'utilisateur identifié via le plugin sfGuardUser.

Pour simplifier la création du carnet d'adresse je créé un module "contact" avec l'admin-generator. Afin que chaque utilisateur n'ait accès qu'à ses contacts, je surcharge la fonction buildQuery de l'action.class générée par l'admin-generator :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
class contactActions extends autoContactActions
{
    protected function buildQuery()
    {
      $query = parent::buildQuery();
      $query->addWhere('client_id = ?', array($this->getUser()->getGuardUser()->getId()));
      return $query;
    }
}
Ainsi chaque utilisateur ne voit que son carnet d'adresse depuis le module contact. J'ai également fait en sorte que les référence à client_id (l'id de sf_guard_user) disparaissent des listes et des formulaires. D'ou le generator.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
 
generator:
  class: sfDoctrineGenerator
  param:
    model_class:           Contact
    theme:                 admin
    non_verbose_templates: true
    with_show:             false
    singular:              ~
    plural:                ~
    route_prefix:          contact
    with_doctrine_route:   true
    actions_base_class:    sfActions
 
    config:
      actions: ~
      fields:  ~
      list:        
        title: Contacts
        display: [=nom, prenom, mail, tel, created_at, updated_at]
      filter:
        display: [nom, prenom, mail, tel]
      form:
        display: [nom, prenom, mail, tel]
      edit:    ~
      new:     ~
Les champs created_at et updated_at étant notnull, j'ai pu faire un unset dessus sans que ca pose problème. Par contre si je fais un unset sur client_id je me retrouve avec un client_id en clé étrangère qui est égale à zéro. Je suis donc resté la dessus sur mon contactForm :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
class ContactForm extends BaseContactForm
{
  public function configure()
  {
    unset($this['created_at'], $this['updated_at']);
  }
}
Le problème c'est que quand je créé un nouvel utilisateur, j'ai toujours une erreur parce que je n'ai pas renseigné la clé étrangère. Et je ne sais pas comment faire pour qu'elle soit réglée automatiquement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
# $form (ContactForm) Toggle details
 
    * $form['id'] (sfWidgetFormInputHidden)
    * $form['client_id'] (sfWidgetFormDoctrineChoice)
      Required.
    * $form['nom'] (sfWidgetFormInputText)
    * $form['prenom'] (sfWidgetFormInputText)
    * $form['mail'] (sfWidgetFormInputText)
    * $form['tel'] (sfWidgetFormInputText)
    * $form['_csrf_token'] (sfWidgetFormInputHidden)
(ci-dessus le message d'erreur avec 'required' associé à client_id)

Donc je ne sais pas trop quoi faire et j'appelle à l'aide. Quelqu'un sait-il comment je pourrais me dépêtrer ?