Вкратце, я хочу отметить кое-что в отношении следующего блока кода:
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-таблицу на предмет статуса разрешения, она может (и, вероятно, будет) читать неправильное значение, и вы получите ложноположительный результат.
У вас есть три варианта решения этой проблемы, о которых я могу подумать сразу же.
Продолжайте писать код stage1.php, как и вы.- нет ничего плохого в том, как вы получаете установку и сеанс для пользователя.Вы изменяете страницу 2, чтобы перенаправить пользователя через конечную точку OAuth, запрашивая разрешение на публикацию потока каждый раз, когда пользователь загружает страницу.Конечная точка OAuth не будет повторно запрашивать у пользователя установку и отправит их по пути.
Недостатки этого подхода в том, что каждый запрос на публикацию на стене друзей превращается в 3 запроса.
- Начальная загрузка страницы
- Перенаправление OAuth / загрузка
- Перенаправление из OAuth обратно в ваше приложение
Этот подход также требует, чтобыВы добавляете флаг к своему ключу next
в вашем loginURL, который вы можете искать, чтобы убедиться, что пользователь прошел через конечную точку OAuth, в противном случае вы получите бесконечную ошибку перенаправления.
Используйте 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);