Bonjour,
Dans le cadre d'un projet symfony avec doctrine, j'utilise sfDoctrineGuardUser et définis donc mes utilisateurs sur 2 tables jointes : GessehEtudiant et sfGuardUser.
(le schéma de sfGuardUser est celui du plugin sans le moindre changement).
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 GessehEtudiant: actAs: Timestampable: created: { disabled: true } updated: { format: Y-m-d } columns: promo_id: { type: integer, notnull: true } classement: { type: integer, notnull: true } tel: { type: string(14), notnull: false } naissance: { type: date, notnull: false } anonyme: { type: boolean, default: false } utilisateur: { type: integer, notnull: true } relations: GessehPromo: { onDelete: CASCADE, local: promo_id, foreign: id } sfGuardUser: { onDelete: CASCADE, local: utilisateur, type: one, foreign: id }
Dans le backend, j'utilises l'admin generator :
et j'ai un peu modifié le save de sfGuardUser :
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 generator: class: sfDoctrineGenerator param: model_class: GessehEtudiant theme: admin non_verbose_templates: true with_show: false singular: ~ plural: ~ route_prefix: gesseh_etudiant with_doctrine_route: true actions_base_class: sfActions config: actions: ~ fields: utilisateur: { label: Utilisateur, help: Utilisateur correspondant } promo_id: { label: Promotion } sfGuardUser: { label: Étudiant, help: Informations du compte utilisateur correspondant } gesseh_promo: { label: Promotion } tel: { label: Téléphone } naissance: { label: Date de naissance } list: title: Liste des étudiants display: [=sfGuardUser, gesseh_promo, tel, naissance] sort: [promo_id, asc] max_per_page: 50 actions: _new: { label: Ajouter } autoUpdatePromo: { label: Passage à la promo supérieure } deleteAncien: { label: Maintenance (hors promo) } # importNew: { label: Importer } batch_actions: {} # horsPromo: { label: Sortir des promos } object_actions: _edit: { label: Modifier } table_method: retrieveEtudiant filter: display: [promo_id] form: class: GessehEtudiantForm display: [promo_id, sfGuardUser, tel, naissance, classement] fields: promo_id: { help: Hors Promo désactive automatiquement le compte utilisateur } classement: { label: Classement (choix), help: Ordre de classement pour les choix dans la promo } edit: title: Modifier %%sfGuardUser%% actions: _delete: { label: Supprimer } _list: { label: Retour à la liste } _save: { label: Enregistrer } new: title: Nouvel étudiant actions: _list: { label: Retour à la liste } _save: { label: Enregistrer } _save_and_add: { label: Ajouter un autre }
Or, si la procédure fonctionne parfaitement lorsqu'il s'agit d'éditer un utilisateur-étudiant, je me retrouve avec un "Fatal error: Maximum execution time of 30 seconds exceeded in ..." lors de la création d'un nouvel utilisateur-étudiant.
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 class sfGuardUser extends PluginsfGuardUser { /* Enregistrement personnalisé d'un utilisateur */ public function save (Doctrine_Connection $conn = null) { /* Paramètres prédéfinis pour l'enregistrement d'un étudiant */ if ($this->getId() != null) { if ($etudiant = Doctrine::getTable('GessehEtudiant')->findOneByUtilisateur($this->getId())) { if ($etudiant->getPromoId() == Doctrine::getTable('GessehPromo')->findOneByActive(false)->getId()) { $this->setIsActive(false); } else { $this->setIsActive(true); } if (!$this->hasGroup('etudiant')) { $this->addGroupByName('etudiant'); } } } if ($this->getPassword() == null) { $this->setPassword($this->generatePassword(8)); } return parent::save($conn); } /* Auto-génération d'un mot de passe */ private function generatePassword ($length) { $characters = array ('a','z','e','r','t','y','u','p','q','s','d','f','g','h','j','k','m','w','x','c','v','b','n','2','3','4','5','6','7','8','9','A','Z','E','R','T','Y','U','P','S','D','F','G','H','J','K','L','M','W','X','C','V','B','N'); $password = ''; for ($i = 0 ; $i < $length ; $i++) { $rand = array_rand($characters); $password .= $characters[$rand]; } return $password; } }
En creusant les logs, je me suis rendu compte que c'était la fonction save qui bouclait à l'infini.
Je ne comprends pas pourquoi d'autant que je suis persuadé d'avoir réussi à créer des utilisateurs il y a 10 jours au moment où j'ai procédé à la modification du save (pas re-vérifié depuis, je m'en suis rendu compte lors du test en "prod" juste avant de lancer l'appli réellement en production).
Partager