Dans cette publication, nous allons voir comment mettre en place un système d’identification basé sur le plugin sfDoctrineGuard. Pour que cela fonctionne, il vous faut également l’excellente librairie jquery. Dans cette article, je n’aborde pas l’installation du plugin, ni l’installation et le chargement de jquery.
Nous allons commencer par générer un nouveau module « user » dans notre projet avec la commande ci-dessous:
./symfony generate:module frontend user
Nous allons dès maintenant modifier notre module « user » pour y mettre notre propre code. Pour cela nous allons inclure la classe « BasesfGuardAuthActions » dans notre classe et changer l’extends:
require_once(sfConfig::get('sf_plugins_dir').'/sfDoctrineGuardPlugin/modules /sfGuardAuth/lib/BasesfGuardAuthActions.class.php'); class userActions extends BasesfGuardAuthActions { ... }
J’avais un problème a résoudre lors de l’affichage de la page signin lors de l’appel d’une page protégée. J’ai choisi d’y mettre uniquement une information utilisateur lui indiquant de s’identifier avec le formulaire. J’ai créé le fichier signinSuccess.php dans le dossier templates.
Nous allons maintenant monter le formulaire d’identification dans un component.
class userComponents extends sfComponents { public function executeSignin(sfWebRequest $request) { $class = sfConfig::get('app_sf_guard_plugin_signin_form', 'sfGuardFormSignin'); $this->form = new $class(); } }
template: _signin.php
<div id="form_message"> </div> <form id="guard" action="<?php echo url_for('@sf_guard_signin') ?>" method="post"> <?php echo $form->renderHiddenFields(); ?> <label>Utilisateur:</label> <?php echo $form['username']->render(); ?> <label>Mot de passe:</label> <?php echo $form['password']->render(); ?> <?php echo $form['remember']->render(array('id' => 'remember')); ?> Se souvenir de moi <input type="submit" value="S'identifier" /> <a href="<?php echo url_for('@sf_guard_password') ?>">Mot de passe oublié ?</a> </form> <script type="text/javascript"> $('#guard').submit(function() { $.post("<?php echo url_for('@sf_guard_signin'); ?>", $('#guard').serialize(), function(response) { switch(response.status) { case 'success': $('#form_message').html(response.message); $(location).attr('href',response.url); break; case 'failure': $('#form_message').html(response.message); $('#form_message').show(); break; } }, 'json'); return false; }); </script>
Nous allons rajouter un peu de css pour cacher notre zone « form_message »:
#form_message { display: none; font-weight: bold; color: red; }
Prochaine phase, désactiver les routes et y mettre nos propres paramètres. Nous allons pour cela toucher 3 fichiers:
app.yml
all: sf_guard_plugin: routes_register: false
routing.yml
sf_guard_signin: url: /login param: { module: user, action: signin } sf_guard_signout: url: /logout param: { module: user, action: signout } sf_guard_password: url: /password param: { module: user, action: password }
settings.yml
all: .actions: login_module: user login_action: signin secure_module: user secure_action: secure
La dernière phase de cette réalisation est l’implémentation de notre fonction signin. Voici le code utilisé pour un dialogue ajax:
class userActions extends BasesfGuardAuthActions { public function executeSignin($request) { $user = $this->getUser(); if ($user->isAuthenticated()) { return $this->redirect('@homepage'); } if($request->isMethod('post') && $request->isXmlHttpRequest()) { $class = sfConfig::get('app_sf_guard_plugin_signin_form', 'sfGuardFormSignin'); $form = new $class(); $form->bind($request->getParameter($form->getName())); if ($form->isValid()) { $values = $form->getValues(); $user->signin($values['user'], array_key_exists('remember', $values) ? $values['remember'] : false); $signinUrl = sfConfig::get('app_sf_guard_plugin_success_signin_url', $user->getReferer($request->getReferer())); return $this->renderText(json_encode(array('status' => 'success', 'url' => $signinUrl))); } else { return $this->renderText(json_encode(array('status' => 'failure','message' => 'Identification incorrecte'))); } } $this->getResponse()->setStatusCode(401); } }
Il nous reste plus qu’à insérer notre component dans notre layout ou notre template:
<?php if (!$sf_user->isAuthenticated()): ?> <?php include_component('user', 'signin'); ?> <?php endif; ?>
L’implémentation est terminée. J’espère que ce petit article vous permettra de mettre en place un formulaire à la web 2.0 😉