You are here

function fb_friend_block in Drupal for Facebook 7.3

Same name and namespace in other branches
  1. 6.3 contrib/fb_friend.module \fb_friend_block()
  2. 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.'));
      }
    }
  }
}