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 :
C'est tout ! Une seule table donc, avec une clé étrangère correspondant à l'id de l'utilisateur identifié via le plugin sfGuardUser.
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 }
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 :
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 class contactActions extends autoContactActions { protected function buildQuery() { $query = parent::buildQuery(); $query->addWhere('client_id = ?', array($this->getUser()->getGuardUser()->getId())); return $query; } }
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
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: ~
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 class ContactForm extends BaseContactForm { public function configure() { unset($this['created_at'], $this['updated_at']); } }
(ci-dessus le message d'erreur avec 'required' associé à client_id)
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)
Donc je ne sais pas trop quoi faire et j'appelle à l'aide. Quelqu'un sait-il comment je pourrais me dépêtrer ?
Partager