Symfony 1.4: Personnalisez les données avec sfDoctrineGuardPlugin

Benjamin Longearet 20 février 2010 9
Symfony 1.4: Personnalisez les données avec sfDoctrineGuardPlugin

Pour commencer!

Ces manipulations fonctionnent avec Doctrine et sous les versions Symfony supérieur ou égal à la version 1.2.

L’installation du plugin sfDoctrineGuardPlugin est nécessaire, pour installer ce plugin, la documentation du site symfony est très complète, si vous souhaitez une traduction, faite le moi savoir!


Le schema et les données pré-renseignées

Pour pouvoir personnalisez sfDoctrineGuardPlugin, nous avons besoin d’ajouter au moins un nouveau modele, qui à une relation avec le model sfGuardUser déjà existant avec l’installation de sfDoctrineGuardPlugin. Pour le faire, on va éditer le fichier config/doctrine/schema.yml. Vous allez copier/coller le code YAML ci-dessous.

Pour ce tuto, on va créer un modèle Profile et créer une relation avec sfGuardUser. Par défaut, le plugin sfDoctrineGuardPlugin contient dans le modèle sfGuardUser uniquement les informations relatives au processus d’identification (si vous êtes curieux, vous pouvez consulter le YAML du plugin dans le fichier plugin/sfDoctrineGuardPlugin/config/doctrine/schema.yml). Pour faciliter la gestion des utilisateurs (mail, nom, prenom, etc.) il est donc conseillé de venir greffer ce modèle Profile sur le modèle sfGuardUser en les reliant.

Profile:
columns:
sf_guard_user_id: integer(4)
nom: string(255)
prenom: string(255)
email: string(255)
telephone: string(10)
relations:
sfGuardUser:
class: sfGuardUser
foreignType: one

Maintenant que nous avons définit la relation un-pour-un entre Profile et sfGuardUser, les instructions suivantes sont réalisables.

$user = new sfGuardUser();
$user->Profile->prenom = 'Jonathan';

Et vous pouvez aussi avoir accès à ces données dans le sens inverse, Doctrine crée automatiquement des relations entre les modèles qui sont bidirectionnels.

$profile = Doctrine_Query::create()
   ->from('Profile p')
   ->innerJoin('p.User u')
   ->where('p.id = ?', 1)
   ->fetchOne();
$user = $profile->User;

Maintenant que nous avons créé le modèle ainsi que les relations, nous allons renseigner le fichier des fixtures de symfony. Copiez/coller le code YML suivant dans le fichier data/fixtures/fixtures.yml.

sfGuardUser:
goldorak:
username: goldo
password: test
is_active: true
is_super_admin: true
Profile:
nom: Goldorak
prenom: Jean-édouard
email: goldo@vol.com
telephone: '9987235467'

Voilà, on peut ensuite re-build le projet avec la commande suivante :

symfony doctrine:build --all --and-load --no-confirmation

Maintenant vous pouvez vous rendre sur votre navigateur chéwi et regarder le résultat. Ouvrez http://votredomaine/backend_dev.php/sf_guard_user et vous pourrez voir l’utilisateur créé.

 


La personnalisation

Après de dur labeur et beaucoup de manipulations, on va enfin pouvoir faire “mumuse” avec la puissance de symfony. On a créé un modèle Profile, qui est relié au modèle sfGuardUser. OK… Mais comment modifier les informations du profile en même temps que celle de sfGuardUser?

C’est un jeu d’enfant …  Nous avons juste besoins de tuner quelques lignes de code pour le faire!

Nous allons tous d’abord récupérer le fichier sfGuardUserAdminForm.class.php présent dans le plugin et le coller dans notre dossier lib.

Copier le fichier :

plugins/sfDoctrineGuardPlugin/lib/form/doctrine/sfGuardUserAdminForm.class.php

Dans le dossier :

lib/form/doctrine/

Maintenant, ouvrez le fichier dupliqué lib/form/doctrine/sfGuardUserAdminForm.class.php et copiez/coller le code suivant à la place de la méthode configure() vide présente dans le fichier.

public function configure() {
   parent::configure();
   $profileForm = new ProfileForm($this->object->Profile);
   unset($profileForm['id'], $profileForm['sf_guard_user_id']);
   $this->embedForm('Profile', $profileForm);
}

La dernière chose à faire est de personnaliser le fichier generator.yml de notre module. Ouvrez le fichier apps/backend/modules/LE_MODULE/config/generator.yml et complétez le (vous avez une table des commandes possibles pour le generator.yml) comme le fichier ci-dessus le montre.

generator:
class: sfDoctrineGenerator
param:
config:
form:
class: sfGuardUserAdminForm
display:
"NONE": [username, password, password_again, Profile]
"Permissions et groupes": [is_active, is_super_admin, groups_list, permissions_list]

Et voilà le travail!

 

Bon dev’ :D

Geekos.fr vous recommande les articles suivants

9 Commentaires »

  1. calibhaan 13 avril 2010 au 17 h 48 min - Reply

    Merci pour le petit tuto.
    Ça m’a permis de comprendre pas mal de chose…
    Par contre, apparemment ce qui n’est pas possible c’est de lier 3 objet de suite par ce système.

    par exemple le profil est lié au User, mais aussi à Pays.

    User->Profil<-Pays

  2. Benjamin Longearet 15 avril 2010 au 9 h 58 min - Reply

    Je testerai dès que j’ai un peu de temps, mais théoriquement il n’y a pas de problème.
    Profil est lié à User
    Pays est lié à Profil

    Ce n’est pas profil qui est lié à User et Pays, et même, dans ce cas là User et Pays possèderaient une Clé étrangère pointant vers un enregistrement de Profil!

    Tient moi au courant!

  3. aurelien 8 août 2010 au 0 h 53 min - Reply

    tu ne devrais pas mettre Interger(4) dans le code que tu ajoute au schéma mais Integer tout simplement.

    Il y a un comflit de type au niveau de la clef etrangere avec le plugin sfDoctrineGuardPlugin.

  4. worko 11 novembre 2010 au 11 h 33 min - Reply

    Salut,
    Merci pour cet excellent exemple
    tout à trés bien fonctionné sauf que lors de l’insertion (ou la modification) d’un nouveau membre l’insertion ou la modification ne fonctionne pas le formulaire ne mentionne que
    “The item has not been saved due to some errors.”
    avec aucune erreure dans le log
    la seule particularité c’est que dans mes champs profils, j’ai deux clés étrangère
    merci de me sauvé la vie stp
    Bon code

  5. Benjamin Longearet 14 novembre 2010 au 8 h 40 min - Reply

    Il faudrait que tu m’en dise un peu plus sur ton code!
    Ton fichier YML par exemple. Puis en environnement de dév, normalement il te met les champs manquant!
    Sinon il faut aussi regarder au niveau des validateurs.

    Vraiment je ne peut pas trop t’aider sans ton code.
    Tu peux me mailer sur mon portfolio si tu préfère.

    Bon dév!

  6. denise 14 février 2011 au 2 h 20 min - Reply

    dans mon backend/modules je n’ai pas de dossier config . j’ai donc creer le dossier et le fichier generator.yml. mais cela ne fonctionne pas .

  7. Benjamin Longearet 9 août 2010 au 10 h 01 min - Reply

    Pourtant, le plugin sfDoctrineGuardPlugin utilise un integer(4).
    Mais tu as raison, pour être plus général, on peut utiliser un integer.

  8. Benjamin Longearet 14 février 2011 au 7 h 40 min - Reply

    Bonjour,

    Le dossier config et le fichier generator.yml sont propres à chacun des modules!
    Ils ne se trouvent donc pas dans backend/modules directement, mais dans backend/modules/LE_MODULE/config/generator.yml

    J’ai mis à jour le billet où il y avait l’erreur, désolé.

    Bonne journée!

Laissez un message »