Ce tutoriel va vous expliquer comment créer une application très simple Facebook Connect, en gérant le fait d’être loggué sur Facebook ou pas, qui va nous permettre de faire des appels sur l’API Graph et utilisant le Javascript SDK.
Je passe très rapidement sur la création de l’application symfony. Il y a déjà des tas de tutoriaux pour cela, je vous conseille de reprendre les tutoriaux, en particulier celui de Jobeet.
On crée donc l’application (sans ORM dans mon cas):
mkdir -p sfbook/lib/vendor
curl http://www.symfony-project.org/get/symfony-1.4.8.tgz | tar -xzv -C !-1:2 -f -
SFBOOK=$(pwd)/sfbook; cd $SFBOOK; ./lib/vendor/symfony-1.4.8/data/bin/symfony generate:project sfbook --orm=none
Puis on récupère le php-sdk Facebook et on l’on active facebook dans l’autoloader:
cat > $SFBOOK/config/autoload.yml << EOF
autoload:
facebook:
name: facebook
path: %SF_LIB_DIR%/vendor/php-sdk/src
recursive: off
EOF
On crée une application, ‘frontend’ et deux modules dans celle ci ‘default’ et ‘home’. Le premier module servira pour se logger, le 2nd pour l’application en elle même et dans notre exemple, on récupèrera juste la liste de ses amis.
php symfony generate:module frontend home
php symfony generate:module frontend default
Le module « home » ne sera accessible qu’aux utilisateurs authentifiés sur facebook. On le protège donc:
cat >> apps/frontend/modules/home/config/security.yml << EOF
all:
is_secure: true
EOF
Et on oublie pas de modifier apps/frontend/config/settings.yml en rajoutant dans la section all: l’action suivantes:
login_module: default
login_action: login
A ce moment, on crée l’application sur facebook. On définit uniquement le Site URL (Onglet Website) pour accéder à notre application symfony et on note nos application Id, api key et application secret.
Comment ça va marcher ? On va mettre dans le layout général le code « connect »: Un script javascript facebook va être chargé et nous redirigera directement sur la page de login si jamais la session facebook venait à être fermée par l’utilisateur. Le template default/login contiendra le bouton facebook connect, et le template home/index qui ne s’affichera que si la session
On ajoute dans apps/frontend/template/layout.php le code suivant dans le
:<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
FB.init({appId: '[APP_ID]', status: true, cookie: true, xfbml: true});
FB.Event.subscribe('auth.sessionChange', function(response) {
if (response.session) {
window.location = '<?php echo url_for('home/index'); ?>';
} else {
window.location = '<?php echo url_for('default/login'); ?>';
}
});
</script>
Le module « default » n’aura que l’action « login ». Cette action s’occupe d’authentifier l’utilisateur. Si l’utilisateur est loggué sur facebook, alors on le redirige vers home/index. Voilà le code de apps/frontend/default/actions/actions.class.php:
class defaultActions extends sfActions
{
public function executeLogin(sfWebRequest $request)
{
$facebook = new Facebook(array('appId' => '[APP_ID]',
'secret' => '[APP_SECRET]',
'cookie' => TRUE ));
$session = $facebook->getSession();
if(NULL !== $session)
{
$me = $facebook->api('/me', 'GET', array('access_token' => $session['access_token']));
// On verifie qu'on existe.
if(NULL !== $me)
{
$this->getContext()->getUser()->setAuthenticated(true);
$this->redirect('home/index');
}
}
$this->getContext()->getUser()->setAuthenticated(false);
return sfView::SUCCESS;
}
}
Le template et default/login contiendra uniquement le bouton facebook connect:
<h1>Welcome !</h1>
<fb:login-button></fb:login-button>
</div>
Dans home, on va mettre un peu ce que l’on veut. Pour le coup, on va par exemple récupérer et afficher ses amis facebook:
class homeActions extends sfActions
{
public function preExecute()
{
$this->facebook = new Facebook(array('appId' => '[APP_ID]',
'secret' => '[APP_SECRET]',
'cookie' => TRUE ));
$this->session = $this->facebook->getSession();
}
public function executeIndex(sfWebRequest $request)
{
$this->friends = $this->facebook->api('/me/friends',
'GET',
array('access_token' => $this->session['access_token']));
return sfView::SUCCESS;
}
}
Le template associé est très simple:
<br />
<?php foreach($friends['data'] as $friend) : ?>
<?php echo $friend['name'] . "<br />"; ?>
<?php endforeach; ?>
Et voilà. Si en visitant le site on est déjà loggué facebook, mais que l’utilisateur n’a jamais utilisé l’application, on aura le droit à l’écran de login pour installer l’application. Ensuite, l’application affichera directement home/index.
On pourra même rajouter un bouton « logout » dans le layout global:
<input type='button' onclick='FB.logout(function(response) {});' value='logout' />
<?php endif ; ?>