function fb_friend_block in Drupal for Facebook 7.3
Same name and namespace in other branches
- 6.3 contrib/fb_friend.module \fb_friend_block()
- 6.2 contrib/fb_friend.module \fb_friend_block()
Implementation of hook_block().
Blocks include
- Invite friends to install the application.
- Invite friends to visit the page currently being browsed.
- Show which friends are already users of the current application.
File
- contrib/
fb_friend.module, line 153 - This module implements several features specific to Facebook friend networks.
Code
function fb_friend_block($op = 'list', $delta = 0, $edit = array()) {
if ($op == 'list') {
$items = array();
// Blocks which use the current application.
$items[FB_FRIEND_DELTA_INVITE_PAGE] = array(
'info' => t('Invite Facebook friends to current page'),
);
$items[FB_FRIEND_DELTA_INVITE_APP] = array(
'info' => t('Invite Facebook friends to install the current app'),
);
$items[FB_FRIEND_DELTA_AUTHORIZED] = array(
'info' => t('Facebook friends who have authorized the current app'),
);
return $items;
}
elseif ($op == 'view') {
try {
// Calls to facebook can fail.
// None of our blocks are shown if user is not logged in.
$fbu = fb_facebook_user();
if (!$fbu) {
return;
}
// Our blocks use current application
global $_fb, $_fb_app;
if ($delta == FB_FRIEND_DELTA_INVITE_PAGE) {
$content = fb_friend_request_content(array(
'module' => 'fb_friend_invite_page',
'delta' => FB_FRIEND_DELTA_INVITE_PAGE,
), array(
'hook' => 'fb_friend_invite_page',
'invite' => TRUE,
'action_path' => request_path(),
// Where sender goes on submit or skip.
'accept_path' => request_path(),
));
return array(
'subject' => t('Invite friends to visit this page'),
'content' => drupal_render($content),
);
}
elseif ($delta == FB_FRIEND_DELTA_INVITE_APP) {
// Exclude users who have already installed.
$rs = fb_fql_query($_fb, "SELECT uid FROM user WHERE has_added_app=1 and uid IN (SELECT uid2 FROM friend WHERE uid1 = {$fbu})");
// FQL not SQL, no {curly_brackets}
$exclude_ids = array();
// Build an delimited list of users...
if ($rs) {
foreach ($rs as $data) {
$exclude_ids[] = $data["uid"];
}
}
$content = fb_friend_request_content(array(
'module' => 'fb_friend_invite_app',
'delta' => FB_FRIEND_DELTA_INVITE_APP,
'next' => request_path(),
), array(
'hook' => 'fb_friend_invite_app',
'invite' => TRUE,
'title' => variable_get('site_name', $GLOBALS['_fb_app']->title),
'exclude_ids' => $exclude_ids,
));
return array(
'subject' => t('Invite friends to this application'),
'content' => drupal_render($content),
);
}
elseif ($delta == FB_FRIEND_DELTA_INVITE_APP && FALSE) {
// Old way...
$app_url = url('<front>', array(
'absolute' => TRUE,
'fb_canvas' => fb_is_canvas(),
));
$page_url = url(request_path(), array(
'absolute' => TRUE,
'fb_canvas' => fb_is_canvas(),
));
$site_name = variable_get('site_name', t('application'));
// Build the alterable data structure.
// http://wiki.developers.facebook.com/index.php/Fb:request-form
$fbml = fb_form_requestform(array(
'type' => $site_name,
'content' => array(
'markup' => array(
'#value' => t('You may like this site - <a href="!url">!site</a>.', array(
'!url' => $app_url,
'!site' => $site_name,
)),
),
'choice' => array(
'#type' => 'fb_form_req_choice',
'#attributes' => array(
'url' => $app_url,
'label' => t('Accept'),
),
),
),
'invite' => TRUE,
'action' => $page_url,
'method' => 'POST',
));
// Exclude users who have already installed.
$rs = fb_fql_query($_fb, "SELECT uid FROM user WHERE has_added_app=1 and uid IN (SELECT uid2 FROM friend WHERE uid1 = {$fbu})");
// FQL not SQL, no {curly_brackets}
// @TODO - confirm new API returns same data structure in $rs!
$arFriends = '';
$exclude_ids = '';
// Build an delimited list of users...
if ($rs) {
$exclude_ids .= $rs[0]["uid"];
for ($i = 1; $i < count($rs); $i++) {
if ($exclude_ids != "") {
$exclude_ids .= ",";
}
$exclude_ids .= $rs[$i]["uid"];
}
}
$fbml['selector'] = fb_form_multi_selector(array(
'actiontext' => t('Invite friends'),
'exclude_ids' => $exclude_ids,
));
// Allow third-party to modify the form
drupal_alter('fb_friend_invite_app', $fbml);
if ($fbml) {
// Wrap in serverfbml.
$xfbml = array(
'#type' => 'fb_form_serverfbml',
'fbml' => $fbml,
);
}
// Allow third-party to modify wrapper
drupal_alter('fb_friend_invite_app_wrap', $xfbml);
$content = drupal_render($xfbml);
return array(
'subject' => t('Invite friends to use !site', array(
'!site' => $site_name,
)),
'content' => $content,
);
}
elseif ($delta == FB_FRIEND_DELTA_AUTHORIZED) {
if ($fbu = fb_facebook_user()) {
// Get list of friends who have authorized this app.
$rs = fb_fql_query($_fb, "SELECT uid FROM user WHERE has_added_app=1 AND uid IN (SELECT uid2 FROM friend WHERE uid1 = {$fbu})");
// FQL not SQL, no {curly_brackets}
// @TODO - confirm the data structure returned from new API still works with this code.
if (isset($rs) && is_array($rs)) {
foreach ($rs as $friend_data) {
$friend_fbu = $friend_data['uid'];
// TODO: make size and markup configurable
$content .= "<fb:profile-pic uid={$friend_fbu} size=square></fb:profile-pic>";
}
}
$subject = t('Friends who use !app', array(
'!app' => $GLOBALS['_fb_app']->label,
));
// TODO - fix title
return array(
'subject' => $subject,
'content' => $content,
);
}
}
} catch (Exception $e) {
// We reach this when Facebook Connect sessions are no longer valid.
// Javascript should detect this and refresh. Relatively harmless.
if (fb_verbose() === 'extreme') {
fb_log_exception($e, t('Failed to render fb_friend block.'));
}
}
}
}