symfony gestion des utilisateurs
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 :
- Un utilisateur n'est pas admin et le devient ( enregistrement dans la table sfGuardUser et sfGuardUserGroup)
- Un adminstrateur est déchu de ses droits ( effacement dans la table sfGuardUserGroupe mais reste dans sfGuardUser)
- Un utilisateur déja enregistré dans sfGuard devient admin ( déjà dans SfGuard mais pas SfGuardUserGroup)
- Un administrateur ne veut pas que sa photo soit visible ( déjà enregistré dans SfGuardUser)
Voici le code que j'ai fait
Code:
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:
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 :aie:
En vous remerciant d'avance de vos réponses.