Bonjour,

Avant de montrer les lignes de code une petite explication du contexte
J'utilise symfony 1.4 avec le plugin sfGuard
Un module de gestion des utilisateurs à été crée.

Dans le formulaire de gestion des utilisateurs deux champs sont modifiables is_admin et photo_ok qui modifie deux tables différentes ( agent et sfGuard)

Je dois géré les cas suivants :
  1. Un utilisateur n'est pas admin et le devient ( enregistrement dans la table sfGuardUser et sfGuardUserGroup)
  2. Un adminstrateur est déchu de ses droits ( effacement dans la table sfGuardUserGroupe mais reste dans sfGuardUser)
  3. Un utilisateur déja enregistré dans sfGuard devient admin ( déjà dans SfGuard mais pas SfGuardUserGroup)
  4. Un administrateur ne veut pas que sa photo soit visible ( déjà enregistré dans SfGuardUser)


Voici le code que j'ai fait
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
58
59
60
61
62
63
64
65
66
67
68
69
protected function save(Doctrine_Connection $conn = null)
	{
 
     	// test existance de l'utisateur dans sfguarduser 
 
		$query = Doctrine_Query::create()
				  ->select('*')
				  ->from('sfGuardUser')
				  ->where('username = ?', $this->getMatricule());
  		$user = $query->fetchOne();	
	
		if (!$user && $this->getIsAdmin() == TRUE)
		{	
			// Si l'utilisateur n existe pas dans sfGuardUseur on le creer
			$user = new sfGuardUser(); 
			$user->setUsername($this->getMatricule());
			$user->setAlgorithm("sha1");
			$user->setIsActive(true);
			$user->setIsSuperAdmin(false);
			$user->save();
			
			//puis on ajoute le groupe admin de l'utilisateur  dans sfGuardUseurGroup
			$groupe = new sfGuardUserGroup();
			$groupe->setUserId($user->id); 
			$groupe->setGroupId(1); 
			$groupe->save();
		}
		else 
		{	
	    	// Si l'utilisateur est deja dans la table sfGuardUseur
	   		 
			if ($this->getIsAdmin() == FALSE )
			{
// si la case is_admin est décrochée suppression de l'utilisateur dans le groupe admin
	    		$q = Doctrine_Query::create()
		    	->delete('sfGuardUserGroup u')
		    	->where('u.user_id = ?', $user->id);
				$q->execute();
				
			}
			if ($this->getIsAdmin() == TRUE )
			{
			
				// permet de gerer le cas ou un utilisateur admin  
				//veut changer le choix de le case photo  
				
				$query = Doctrine_Query::create()
				  ->select('*')
				  ->from('agent')
				  ->where('matricule = ?', $this->getMatricule());
  				$user = $query->fetchOne();	

			if($user->getPhotoOk() != $this->photo_ok)
					{
						$user->setPhotoOk($this->photo_ok);
						$user->save();
						exit();
					}
				
				// si l'utilisateur n'est pas dans le groupe admin mais deja present 
				//dans la table sfguard ajout de l'utilisateur dans le groupe admin
				$groupe = new sfGuardUserGroup();
				$groupe->setUserId($user->id); 
				$groupe->setGroupId(1); 
				$groupe->save();
			}
	    	return parent::save($conn);
		}
Le bout de code en rouge correspond au cas que je n'arrive pas à gérer.
Comme l'admin est déjà enregistré dans sfUser j'obtiens l'erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
SQLSTATE[23505]: Unique violation: 7 ERREUR: la valeur d'une clé dupliquée rompt la contrainte unique « sf_guard_user_group_pkey »
J'ai essayé de faire des updates mais l'erreur est identique ( me semble t-il car j'ai fait plusieurs tests )

Je bloque

En vous remerciant d'avance de vos réponses.