sfGuard fait parti des plugins Symfony les plus utiles. Il ajoute à notre framework un système de gestion avancé des utilisateurs, groupes et permissions. Il inclut en standard un back office complet ainsi qu’un formulaire de connexion mais pas pour de la création de compte en front.
Alors qu’il fût assez fastidieux de le réaliser avec la version 1.0 de Symfony, le nouveau système de création de formulaires introduit dans la version 1.1 nous facilite bien la tache.
Je ne reviendrais pas sur l’installation du plugin qui est très bien détaillée dans sa documentation.
Commençons par générer les formulaires associés à nos tables grâce à Propel : php symfony propel:build-forms
. Attaquons-nous maintenant à la classe de notre formulaire d’enregistrement. Créez un fichier nommé sfGuardRegisterForm.class.php dans le répertoire lib/form/ qui contient ce code :
<?php
class sfGuardRegisterForm extends sfGuardUserForm
{
public function configure()
{
parent::configure();
/* Ici on ajoute une validation
pour le mot de passe afin qu'il soit long
d'au moins 6 caractères et d'au plus 128. */
$this->validatorSchema['password'] = new sfValidatorString(
array('min_length' => 6, 'max_length' => 128)
);
}
}
Comme vous pouvez le lire, on se contente de créer une classe qui hérite de sfGuardUserForm
fournie avec le plugin et d’y ajouter une validation supplémentaire pour le mot de passe (par défaut il peut être vide). C’est également dans cette méthode configure
que se déroulera la validation de vos champs personnalisés sur lesquels nous reviendrons plus bas.
Effacez la cache avec la commande php symfony cc
. C’est déjà presque fini !
Créons un répertoire sfGuardAuth dans le répertoire modules de votre application puis deux sous répertoires dans sfGuardAuth nommés actions et templates. Ce pseudo-module nous permettre de surcharger le module sfGuardAuth du plugin afin de lui ajouter une action et une vue qui permettront à vos visiteurs de s’enregistrer sur votre site.
Créez un fichier actions.class.php dans le répertoire actions qui contient :
<?php
/* On doit inclure manuellement
l'action du plugin car l'autoloading ne fonctionne pas dans ce cas. */
require_once(sfConfig::get('sf_plugins_dir').
'/sfGuardPlugin/modules/sfGuardAuth/lib/BasesfGuardAuthActions.class.php');
/* Notre action dérive de celle fournie par le module
afin d'hériter de ses actions propres. */
class sfGuardAuthActions extends BasesfGuardAuthActions
{
public function executeRegister($request) {
/* Passe le formulaire à la vue. */
$this->form = new sfGuardRegisterForm();
/* Si l'action est appelé via la méthode POST... */
if ($request->isMethod('post')) {
$this->form->bind(
$request->getParameter('sf_guard_user')
);
/* ...et que les données sont valides */
if ($this->form->isValid()) {
/* On crée l'utilisateur */
$sf_guard_user = $this->form->save();
$this->getUser()->setFlash('message',
'Vous êtes enregistré,
<a href="/login">connectez-vous</a> !');
$this->redirect('@homepage');
}
/* Sinon le formulaire ainsi que l'erreur sera ré-affiché */
}
}
}
Quand l’utilisateur est créé on redirige le visiteur vers la page d’accueil et on l’avertit grâce à un attribut flash.
Passons à la vue qui se nommera registerSuccess.php et qui se trouvera dans le répertoire templates :
<form action="<?php echo url_for('sfGuardAuth/register') ?>" method="POST">
<table>
<?php echo $form ?>
<tr>
<td colspan="2">
<input type="submit" />
</td>
</tr>
</table>
</form>
Très bien, notre formulaire fonctionne. Mais le plus fort arrive !
Vous avez ajouter des champs personnalisés au profil de votre utilisateur dans la table sf_guard_user_profile
(cf. la documentation de sfGuard) ? Régénérez les formulaires associés à vos tables avec la commande php symfony propel:build-forms
, effacez la cache à grand coup de php symfony cc
, rechargez la page /sfGuardAuth/register et admirez : nos champs sont automatiquement reconnus et affichés. Vous pourrez leur ajouter des étapes de validation dans notre première classe sfGuardRegisterForm
ou dans sfGuardUserProfileForm
si vous voulez qu’elles s’appliquent à tous les formulaires héritant de cette classe (page de modification du profil, ….).
On attend avec impatience la sortie officielle de la release 1.2 🙂
found your site on del.icio.us today and really liked it.. i bookmarked it and will be back to check it out some more later ..
Bravo et merci pour ce post éclairant.
J'ai 2 questions :
1/ Comment paramétrer la route de ce formulaire dans mon module et importer la class sfGuardAuth ?
en mettant options: { model: sfGuardAuth, type: object }
j'ai l'erreur suivante : Class 'sfGuardAuth' not found
2/ Est-il possible de surcharger également les class form du plugin ?
J'ai essayé avec sfGuardLoginForm.class.php SANS SUCCES en recopiant/personnalisant le fichier sfGuardLoginForm.class.php dans le répertoire libform . J'ai donc été obligé de travailler dans le répertoire du plugin pluginssfGuardPluginlibform . Modifié le code à l'intérieur d'un plugin sachant que son code est susceptible d'évoluer avec les releases ne me semple pas la bonne solution, il doit y avoir une astuce…
J'ai pas réussit à afficher les colones de ma table profil avec cette méthode.
Une autre solution : dans le configure de votre profilForm.class.php mettre ceci :
$userForm = new sfGuardUserForm($this->object->getsfGuardUser());
$this->embedForm('User', $userForm);
Là ça nous affiche bien les champs de 2 tableq.
ptit pb : auncune classe sfGuardRegisterForm n'existe
Tres simple en fait, suffit de surcharger dans le plugin et non au dehors :
class sfGuardUserForm extends PluginsfGuardUserForm
{
public function configure()
{
unset(
$this['algorithm'],
$this['salt'],
$this['is_active'],
$this['is_super_admin'],
$this['last_login'],
$this['created_at'] ,
$this['updated_at']
);
}
}
Le reste comme dhab..