Posted by Desi Raaj on January 9, 2012 at 12:11am
8 followers
Jump to:
| Project: | Drupal for Facebook |
| Version: | 7.x-3.x-dev |
| Component: | Contrib Submodule |
| Category: | support request |
| Priority: | normal |
| Assigned: | Unassigned |
| Status: | active |
Issue Summary
There is no invite friends block available, I have enabled all the neccesary modules and went through the documentation, as per documentation a block should be available after following the steps but none is available, Facebook Connect works just fine and so does the like button and so on. is there a certain path I can use in the menu to make "Invite friends" menu link?
Comments
#1
anyone has this working? I would appreciate any help :)
#2
I know what's wrong. The fb_friend module is not yet updated for Drupal 7. It uses hook_block instead of hook_block_info. I did some upgrading myself, and it didn't work completely, but I'll post the code when I get a chance-- it'll at least be a head-start.
Nathan
#3
Can't wait to see the code, even if you get it partially ready I've love to see it. I will be needing this feature soon.
#4
OK-- here it is. As I said, I still couldn't get it working, but I did split the hook_block() into hook_block_info() and hook_block_view(). Here is the resulting code.
/**
* Implementation of hook_block_info().
*
* 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.
*
*/
function fb_friend_block_info() {
$blocks = array();
$blocks['fb_friend_invite_page'] = array(
'info' => t('Invite Facebook friends to current page'),
'status' => 1,
'region' => '',
'cache' => DRUPAL_NO_CACHE,
'visibility' => BLOCK_VISIBILITY_LISTED,
'pages' => ''
);
$blocks['fb_friend_invite_app'] = array(
'info' => t('Invite Facebook friends to install the current app'),
'status' => 1,
'region' => '',
'cache' => DRUPAL_NO_CACHE,
'visibility' => BLOCK_VISIBILITY_LISTED,
'pages' => ''
);
$blocks['fb_friend_authorized'] = array(
'info' => t('Facebook friends who have authorized the current app'),
'status' => 1,
'region' => '',
'cache' => DRUPAL_NO_CACHE,
'visibility' => BLOCK_VISIBILITY_LISTED,
'pages' => ''
);
return $blocks;
}
function fb_friend_block_view($delta = '') {
switch ($delta) {
case 'fb_friend_invite_page':
$blocks['subject'] = 'Invite friends to visit this page';
$blocks['content'] = _fb_friend_block_content($delta);
break;
case 'fb_friend_invite_app':
$blocks['subject'] = 'Invite a friend to use Collegesaurus';
$blocks['content'] = _fb_friend_block_content($delta);
break;
case 'fb_friend_authorized':
$blocks['subject'] = 'Friends who use Collegesaurus';
$blocks['content'] = _fb_friend_block_content($delta);
break;
}
return $blocks;
}
function _fb_friend_block_content($delta) {
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_invite_page') {
$content = fb_friend_request_content(
array(
'module' => 'fb_friend_invite_page',
'delta' => 'fb_friend_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(), // Where recipient goes on accept.
));
return $content;
}
elseif ($delta == 'fb_friend_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_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 $content;
}
elseif ($delta == 'fb_friend_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_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 $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.'));
}
}
}
#5
Note to my previous post: I usually split hook_block_view out into a separate function (in this case,
_fb_friend_block_content($delta)) that has the actual "guts" of the blocks. So hook_block_view() only sets up the blocks and calls this other function.#6
So, does anyone else know how to build upon the code I posted, and why this didn't work? Clearly, even after splitting
hook_block()intohook_block_info()andhook_block_view(), it still doesn't enable working blocks inside a Drupal 7 system. There's something else going on within the Facebook Friends module that I am missing. Sorry not to be of more help!#7
@nateeanes
Disable and uninstall fb_friend.
Change the fb_friend.info file to reflect core = "7.x"
enable module.
That will make the blocks appear. Then you'll have to deal with the updating the database calls. Probably much more too.