この記事は公開から1年以上経過しており、内容が古くなっている可能性があります。
この記事は、『レーティング機能と「いいね!」を連動させる【Facebook】:STEP3』の続きの記事です。
すでにボタンが押されている場合はボタンを押せなくするプログラムを作成。
STEP3の「3-2. 「いいね!」ボタンの設置と、それを監視するスクリプトの追加」で作成したサンプルコードに手を加えます。
サンプルコード(step4.php)
<?php
session_start();
$fb_app_id = "App IDをここに入力";
$fb_app_secret = "App Secretをここに入力";
//現在開いているページのURL
$fb_my_url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$fb_my_url_split = explode("?", $fb_my_url);
$fb_my_url = $fb_my_url_split[0];
$fb_code = $_GET["code"];
$fb_user_id = $_SESSION["fb_user_id"];
if(empty($fb_code) && empty($fb_user_id)) {
$fb_get_userdata = "0";
}elseif(!empty($fb_user_id)){
$fb_get_userdata = "1";
}elseif(!empty($fb_code)){
// Facebook側からトークンを取得
$fb_token_url = "https://graph.facebook.com/oauth/access_token?"
."client_id=".$fb_app_id
."&redirect_uri=".urlencode($fb_my_url)
."&client_secret=".$fb_app_secret
."&code=".$fb_code;
$fb_access_token = file_get_contents($fb_token_url);
// トークンを使用して、graph APIから名前を取得
$fb_graph_url = "https://graph.facebook.com/me?".$fb_access_token;
$fb_user = json_decode(file_get_contents($fb_graph_url));
if(empty($fb_user)){
$fb_get_userdata = "0";
}else{
$fb_get_userdata = "1";
$fb_user_id = $fb_user->id;
$_SESSION["fb_user_id"] = $fb_user_id;
}
}
//これまでのレーティングデータを取得する
$fb_checked_vote = "";
$fb_count_vote = 0;
$fb_like_vote = 0;
$fb_checked_flag = 0;
if(file_exists("csv/rating.csv")){
$fp = fopen("csv/rating.csv", "r");
while ($data = fgets($fp)) {
$data = rtrim($data);
$data_split = explode(",", $data);
if($data_split[1] == $fb_my_url){
$fb_count_vote++;
if($data_split[2] == "1"){
$fb_like_vote++;
}
if($data_split[0] == $fb_user_id){
if($data_split[2] == "1"){
$fb_checked_vote = "いいね!";
}else{
$fb_checked_vote = "だめだね!";
}
}
}
}
fclose($fp);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>レーティング機能と「いいね!」を連動させる【Facebook】</title>
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript">
if (window.attachEvent) { //IE用
window.attachEvent("onload", watchRating);
}else{
window.addEventListener("load", watchRating, false);
}
function watchRating(){
if($("#rating_button") != ""){
timerID = setInterval(function () {
if ($('.fb_edge_comment_widget.fb_iframe_widget:visible').length) {
ratingSave('1');
clearInterval(timerID);
};
}, 200);
}
}
function ratingSave(select_vote){
var php_url = "rating_save.php";
var fb_my_url = "<?php echo $fb_my_url; ?>";
var fb_user_id = "<?php echo $fb_user_id; ?>";
if(select_vote == "1"){
$('#rating_button').html("「いいね!」に投票されました。");
}else if(select_vote == "0"){
$('#rating_button').html("「だめだね!」に投票されました。");
}
$.post(
php_url,
{"select_vote":select_vote, "fb_my_url":fb_my_url, "fb_user_id":fb_user_id},
function(message, status) {
if ('error' != status){
message_split = message.split("/");
$('#like_vote_id').html(message_split[0]);
$('#count_vote_id').html(message_split[1]);
}
},
"html"
);
}
</script>
</head>
<body>
<?php
//ユーザ基本データが取得できた場合。
if($fb_get_userdata == "1"):
//まだボタンが押されていない場合
if(empty($fb_checked_vote)):
?>
<div id="rating_button">
<p>以下のリンクをどちらかクリックしてください。(<b>※いいね!を押すとFacebookに反映されます。</b>)</p>
<p><div id="fb-root"></div>
<script src="http://connect.facebook.net/ja_JP/all.js#appId=225227424196030&xfbml=1"></script>
<fb:like href="<?php echo $fb_my_url; ?>" send="false" layout="button_count" width="100" show_faces="false" font=""></fb:like>
<a href="javascript:void(0);" onclick="ratingSave('0')">だめだね!</a></p>
</div>
<?php
//すでにボタンが押されている場合
else:
?>
<div>
<?php echo $fb_checked_vote; ?>に投票済みです。
</div>
<?php endif; ?>
<?php
//取得できなかった場合。
else:
//アプリ許可用のURL
$fb_dialog_url = "http://www.facebook.com/dialog/oauth?"
."client_id=".$fb_app_id
."&redirect_uri=".urlencode($fb_my_url);
?>
<p>レーティングに参加するにはFacebookのアカウントが必要です。<br />
またFacebook用アプリの「(アプリ名)」を許可する必要があります。</p>
<p style="margin:5px 0px;"><a href="http://www.facebook.com/index.php" target="_blank">Facebookアカウントを取得する</a> | <a href="<?php echo $fb_dialog_url; ?>">アプリを許可する</a></p>
<?php endif; ?>
<p><span id="count_vote_id"><?php echo $fb_count_vote; ?></span>人中、<span id="like_vote_id"><?php echo $fb_like_vote; ?></span>人がいいね!と言っています。</p>
</body>
</html>
■変更部分
58~64行目:csvデータ取得中にて、FacebookIDとページのURLが一致したものがあれば、どのボタンを押したかを取得する。
133~154行目:ボタンを押したデータがcsvから取得できなければ、ボタンを表示。できればボタンを非表示にし、どのボタンを押したかを表示する。
以上です。
すべて読まれた方はおつかれさまでした^^
長くなってすみません。
■追記補足
今回のサンプルでは、レーティングの数字において、ボタンを押したユーザの合計数も「いいね!」の合計数もこちら側が保持しているcsvデータを元に計算しています。
しかしFacebookをお使いの方はご存知かと思いますが、「いいね!」というのはFacebookにて取り消すことが出来ます。
ということはFacebookが保持している「いいね!」が押された回数と、csvデータから算出した数には誤差が起こりえますが、ここではあえてcsvデータの数字を使うことにしました。
もしFacebookが保持している「いいね!」の数を取得したい場合はFQLでデータ取得し、ボタンを押したユーザの合計数などを計算してください。
FQLでのデータ取得方法はこちらのページをご参照ください。
このサンプルでは、すでにボタンが押されているかどうかを、FacebookIDから判断させるプログラムにしましたが、STEP1にも書いたとおり、他にも色々と手段はあります。
Facebookアプリを許可させるのが煩わしい場合は、メールアドレスなどを入力させるなどの方法でも大丈夫かと思います。
また、csvでデータを管理する方法も、データベースが使えるサーバの場合はそちらで管理するほうが何かと便利かと思います。
csvでも構わないという場合は、データ管理だけにはご注意ください(csvファイルにアクセスできないよう制限をかけておくなど)。
最後にSTEP1~STEP4までに記述したサンプルコードをアップしました。
今更ではありますが「ブログじゃ読みづらい!」って方はこちらからダウンロードしてください。

コメント