MISE À JOUR 21/11/2012 @ALL : J'ai mis à jour l'exemple afin qu'il fonctionne mieux et qu'il prenne en compte les remarques de Chris Jacob et les meilleures pratiques de FB, jetez un œil à l'exemple fonctionnel. aquí
Bonjour. Comme promis, voici ma réponse en utilisant uniquement javascript :
Le contenu du BODY de la page :
<div id="fb-root"></div>
<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
FB.init({
appId : 'YOUR APP ID',
status : true,
cookie : true,
xfbml : true
});
</script>
<div id="container_notlike">
YOU DONT LIKE
</div>
<div id="container_like">
YOU LIKE
</div>
Le CSS :
body {
width:520px;
margin:0; padding:0; border:0;
font-family: verdana;
background:url(repeat.png) repeat;
margin-bottom:10px;
}
p, h1 {width:450px; margin-left:50px; color:#FFF;}
p {font-size:11px;}
#container_notlike, #container_like {
display:none
}
Et enfin le javascript :
$(document).ready(function(){
FB.login(function(response) {
if (response.session) {
var user_id = response.session.uid;
var page_id = "40796308305"; //coca cola
var fql_query = "SELECT uid FROM page_fan WHERE page_id = "+page_id+"and uid="+user_id;
var the_query = FB.Data.query(fql_query);
the_query.wait(function(rows) {
if (rows.length == 1 && rows[0].uid == user_id) {
$("#container_like").show();
//here you could also do some ajax and get the content for a "liker" instead of simply showing a hidden div in the page.
} else {
$("#container_notlike").show();
//and here you could get the content for a non liker in ajax...
}
});
} else {
// user is not logged in
}
});
});
Alors, qu'est-ce que ça fait ?
Tout d'abord, il se connecte à FB (si vous avez déjà l'USER ID, et que vous êtes sûr que votre utilisateur est déjà connecté à Facebook, vous pouvez contourner le processus de connexion et remplacer response.session.uid
avec VOTRE_USER_ID (de votre application rails par exemple)
Après cela, il effectue une requête FQL sur le site de la page_fan
et la signification est que si l'utilisateur est un fan de la page, il retourne l'id de l'utilisateur et sinon il retourne un tableau vide, après cela et en fonction des résultats, il montre un div ou l'autre.
Il existe également une démo fonctionnelle ici : http://jsfiddle.net/dwarfy/X4bn6/
Il utilise la page de Coca-Cola comme exemple, essayez-le et aimez/n'aimez pas. la page coca cola et le relancer ...
Enfin, quelques documents connexes :
Table FQL page_fan
FBJS FB.Data.query
N'hésitez pas à nous contacter si vous avez des questions
Cheers
MISE À JOUR 2
Comme indiqué par quelqu'un, jQuery est nécessaire pour que la version javascript fonctionne MAIS vous pouvez facilement le supprimer (il n'est utilisé que pour le document.ready et show/hide).
Pour le document.ready, vous pourriez envelopper votre code dans une fonction et utiliser body onload="your_function"
ou quelque chose de plus compliqué comme ici : Javascript - Comment détecter si le document est chargé (IE 7/Firefox 3) afin que nous remplacions le document prêt.
Et pour l'affichage et la dissimulation, vous pouvez utiliser quelque chose comme : document.getElementById("container_like").style.display = "none" or "block"
et pour des techniques plus fiables de croisement de navigateurs, voir ici : http://www.webmasterworld.com/forum91/441.htm
Mais jQuery est si facile :)
UPDATE
Par rapport au commentaire que j'ai posté ici, voici du code ruby pour décoder le "signed_request" que facebook POST à votre URL CANVAS quand il la récupère pour l'afficher dans facebook.
Dans votre contrôleur d'action :
decoded_request = Canvas.parse_signed_request(params[:signed_request])
Et ensuite il s'agit de vérifier la requête décodée et d'afficher une page ou une autre (Je ne suis pas sûr de cela, je ne suis pas à l'aise avec ruby)
decoded_request['page']['liked']
Et voici la classe Canvas correspondante (à partir de bibliothèque ruby fbgraph ) :
class Canvas
class << self
def parse_signed_request(secret_id,request)
encoded_sig, payload = request.split('.', 2)
sig = ""
urldecode64(encoded_sig).each_byte { |b|
sig << "%02x" % b
}
data = JSON.parse(urldecode64(payload))
if data['algorithm'].to_s.upcase != 'HMAC-SHA256'
raise "Bad signature algorithm: %s" % data['algorithm']
end
expected_sig = OpenSSL::HMAC.hexdigest('sha256', secret_id, payload)
if expected_sig != sig
raise "Bad signature"
end
data
end
private
def urldecode64(str)
encoded_str = str.gsub('-','+').gsub('_','/')
encoded_str += '=' while !(encoded_str.size % 4).zero?
Base64.decode64(encoded_str)
end
end
end