手短に、次のコード ブロックに関して指摘したいことがあります。
foreach ($friends as $key=>$value) {
echo 'You have ' . count($value) . ' friends<br />';
foreach ($value as $fkey=>$fvalue) {
echo 'friend id = ' . $fvalue[id] . ' - friend name = ' . $fvalue[name] . ' - <a href="/stage2.php?id=' . $fvalue[id] . '">post message</a><br />';
}
}
あなたの最初の foreach ループは本当に誤解を招きやすく、良い習慣ではありません。Graph API は、データの表示方法にあまり一貫性がありませんが、foreach を実行する理由は、data
返される JSON オブジェクトのキーを処理するためです。data
通常、そのキーは他のキー ( など) と一緒に存在するため、これは一般的に悪い考えpaging
です。代わりに、 が空でないことを確認してから、次のように配列$friends['data']
を再割り当てします。$friends
$friends = $friends['data'];
例:
if (!empty($friends['data']))
{
$friends = $friends['data'];
}
else
{
$friends = array();
}
今、あなたの質問のために。
許可を過度に要求したくないとおっしゃいました。これは素晴らしいことですが、問題は、Facebook では、どの権限を持っているか、持っていないかを簡単に確認できないことです。ユーザーが特定の権限セットを持っているかどうかを確認できる FQL テーブルがありますが、このテーブルは緊急に更新されません。ユーザーから追加のアクセス許可を取得した場合 (またはユーザーがアクセス許可を撤回した場合) に、この FQL テーブルでアクセス許可のステータスを確認すると、誤った値が読み取られる可能性があり (おそらくそうなる可能性があります)、誤検知が発生します。
これに対処するための 3 つのオプションがあります。
そのまま、stage1.php コードを続行します。インストールとユーザーのセッションを取得する方法に問題はありません。ページ 2 を変更して、ユーザーがページをロードするたびに publish-stream アクセス許可を要求する OAuth エンドポイントを介してユーザーをリダイレクトします。OAuth エンドポイントは、ユーザーにインストールを再プロンプトすることはなく、途中で送信します。
このアプローチの短所は、友達のウォールに投稿するためのすべてのリクエストが 3 つのリクエストに変わることです。
- 最初のページ読み込み
- OAuth リダイレクト / ロード
- OAuth からアプリケーションへのリダイレクト
このアプローチでは、ユーザーが OAuth エンドポイントを通過したことを確認するために探すことができる、loginURL のキーにフラグを追加する必要もありnext
ます。そうしないと、無限リダイレクト エラーが発生します。
FB Javascript SDKを利用して、ユーザーの現在の権限セットを確認します。これを行うには、FB.getLoginStatusメソッドを利用します。
例:
<div id="fb-root"></div>
<script src="http://code.jquery.com/jquery-1.5.2.min.js"
type="text/javascript" charset="utf-8">
</script>
<script src="http://connect.facebook.net/en_US/all.js"
type="text/javascript" charset="utf-8">
</script>
<script type="text/javascript">
(function($)
{
FB.init({
appId: '<?= FB_APP_ID; ?>',
cookie: true,
status: true,
xfbml: true
});
$('a').click(function(event)
{
var self = this;
event.preventDefault();
FB.getLoginStatus(function(session)
{
if (session.perms.match(/\"publish_stream\"/))
{
/* This user has publish stream, so we don't need
* to ask again
**/
window.location = $(self).attr('href');
}
else
{
/* This user does not have publish stream, so we need
* to ask.
**/
FB.login(function(response)
{
if (response && response.perms.match(/publish_stream/))
{
/* We now have publish stream access! */
window.location = $(self).attr('href');
}
}, {
perms: 'publish_stream'
});
}
})
return false;
})
})(jQuery);
拡張アクセス許可を使用せず、Javascript SDK を (再度) 使用し、ウォールに公開したい各ユーザーの公開ダイアログをユーザーに提供します。これも比較的簡単に行うことができます。
例:
ユーザーへのリンクが与えられた場合:
<a href="#" data-id="123">Friend 1</a>
<a href="#" data-id="456">Friend 2</a>
<a href="#" data-id="789">Friend 3</a>
次のようなことができます。
<div id="fb-root"></div>
<script src="http://code.jquery.com/jquery-1.5.2.min.js"
type="text/javascript" charset="utf-8">
</script>
<script src="http://connect.facebook.net/en_US/all.js"
type="text/javascript" charset="utf-8">
</script>
<script type="text/javascript">
(function($)
{
$('a').click(function(event)
{
var user_id = $(this).data('id');
FB.ui({
method: 'feed',
message: 'Hello!',
to: user_id
}, function(response)
{
//this gets called whether it was successful, or not.
})
});
})(jQuery);