You are here

function fb_init in Drupal for Facebook 6.3

Same name and namespace in other branches
  1. 5.2 fb.module \fb_init()
  2. 5 fb.module \fb_init()
  3. 6.2 fb.module \fb_init()
  4. 7.4 fb.module \fb_init()
  5. 7.3 fb.module \fb_init()

Implements hook_init().

Initializes facebook's javascript. Determines whether we are servicing a Facebook App request.

We invoke our hook, first to determine which application is being invoked (because we support more than one in the same Drupal instance). We invoke the hook again to let interested modules know the sdk is initialized.

File

./fb.module, line 141
This is the core required module of Drupal for Facebook.

Code

function fb_init() {

  // Globals provided for internal use and convenience to third-parties.
  global $_fb;
  global $_fb_app;

  // fb_settings.inc may have been included in settings.php.  If not, include it now.
  if (!function_exists('fb_settings')) {
    module_load_include('inc', 'fb', 'fb_settings');

    // trigger test in fb_devel.module
    $GLOBALS['fb_init_no_settings'] = TRUE;
  }

  // Javascript settings needed by fb.js.
  fb_js_settings('base_url', trim(url('', array(
    'absolute' => TRUE,
  )), '/'));
  fb_js_settings('ajax_event_url', url(FB_PATH_AJAX_EVENT, array(
    'absolute' => TRUE,
  )));
  fb_js_settings('is_anonymous', !user_is_logged_in());

  // Data structure to pass to FB.init();
  $fb_init_settings = array(
    'xfbml' => FALSE,
    'status' => FALSE,
    // We will call getLoginStatus() instead.
    'oauth' => variable_get(FB_VAR_JS_OAUTH, TRUE),
  );
  if (variable_get(FB_VAR_USE_COOKIE, TRUE)) {
    $fb_init_settings['cookie'] = TRUE;
  }

  // Figure out which app the current request is for.
  $_fb_app = fb_invoke(FB_OP_CURRENT_APP);
  if ($_fb_app) {

    // An App is configured.
    // Javascript settings needed by fb.js and/or other modules.
    fb_js_settings('label', $_fb_app->label);
    fb_js_settings('namespace', $_fb_app->canvas);
    fb_js_settings('page_type', fb_settings(FB_SETTINGS_TYPE));

    // canvas or connect.
    // Add perms to settings, for calling FB.login().
    $perms = array();
    drupal_alter('fb_required_perms', $perms);
    fb_js_settings('perms', implode(',', $perms));

    //$fb_init_settings['apiKey'] = $_fb_app->apikey;
    $fb_init_settings['appId'] = $_fb_app->id;

    // Add perms to settings, for calling FB.login().
    $perms = array();
    drupal_alter('fb_required_perms', $perms);
    fb_js_settings('perms', implode(',', $perms));

    // Initialize the PHP API.
    $_fb = fb_api_init($_fb_app);
    if ($_fb) {

      // @TODO: test if this is still true: Sometimes when canvas page is open in one tab, and user logs out of
      // facebook in another, the canvas page has bogus session info when
      // refreshed.  Here we attempt to detect and cleanup.
      // Give other modules a chance to initialize.
      fb_invoke(FB_OP_INITIALIZE, array(
        'fb_app' => $_fb_app,
        'fb' => $_fb,
      ));

      // See if the facebook user id is known
      if ($fbu = $_fb
        ->getUser()) {
        fb_invoke(FB_OP_APP_IS_AUTHORIZED, array(
          'fb_app' => $_fb_app,
          'fb' => $_fb,
          'fbu' => $fbu,
        ));
        fb_js_settings('fbu', $fbu);
      }
      if (!empty($_REQUEST['fb_reload'])) {

        // Tell javascript not to reload indefinately.
        fb_js_settings('fb_reloading', $_REQUEST['fb_reload']);
      }

      // When not using cookies, or third-party cookies disabled, we can pass all the auth details in javascript settings.
      if (variable_get(FB_VAR_JS_USE_SESSION, TRUE)) {
        if (!empty($_REQUEST['fb_login_status'])) {

          // Remember for duration of session whether test failed.
          $_SESSION['fb_get_login_status_test'] = $_REQUEST['fb_login_status'];
        }
        if ($fb_uid = $_fb
          ->getUser()) {
          if (!empty($_SESSION['fb_get_login_status_test']) && $_SESSION['fb_get_login_status_test'] == 'false') {
            $fb_token = $_fb
              ->getAccessToken();

            // This uses a data structure not documented by facebook.  May not continue to work.
            $js_sr = array(
              'accessToken' => $fb_token,
              'userID' => $fb_uid,
            );
            $fb_init_settings['authResponse'] = (object) $js_sr;
          }
        }
        else {
          fb_js_settings('get_login_status_test', TRUE);
        }
      }
    }
    else {
      unset($_fb_app);
      watchdog('fb', "Could not initialize Facebook API.", array(), WATCHDOG_ERROR);
    }
    if (isset($_REQUEST['destination'])) {
      $destination = $_REQUEST['destination'];
    }
    elseif (isset($_REQUEST['q'])) {
      $destination = $_REQUEST['q'];
    }
    else {
      $destination = '<front>';
    }
    if (fb_is_canvas()) {
      $destination = fb_scrub_urls($destination);

      // Needed?
    }

    // Stripping the fragment out to be tacked on during the javascript redirect
    if (strpos($destination, '#') !== FALSE) {
      list($destination, $fragment) = explode('#', $destination, 2);
      fb_js_settings('reload_url_fragment', $fragment);
    }
    fb_js_settings('reload_url', url($destination, array(
      'absolute' => TRUE,
      'fb_canvas' => fb_is_canvas(),
      'language' => (object) array(
        'prefix' => NULL,
        'language' => NULL,
      ),
    )));
  }
  if ($channel = variable_get(FB_VAR_JS_CHANNEL, TRUE)) {
    if (!is_string($channel)) {
      $channel = url('fb/channel', array(
        'absolute' => TRUE,
        'fb_url_alter' => FALSE,
      ));
    }
    $fb_init_settings['channelUrl'] = $channel;
  }
  fb_js_settings('fb_init_settings', $fb_init_settings);

  // Allow third-parties to act, even if we did not initialize $_fb.
  fb_invoke(FB_OP_POST_INIT, array(
    'fb_app' => $_fb_app,
    'fb' => $_fb,
  ));
  fb_js_settings('test_login_status', variable_get(FB_VAR_JS_TEST_LOGIN_STATUS, TRUE));
  fb_js_settings('get_login_status', variable_get(FB_VAR_JS_GET_LOGIN_STATUS, TRUE));
  fb_js_settings('controls', implode(',', fb_controls()));
  if (!fb_js_settings('js_sdk_url')) {
    if (isset($_SESSION['fb_locale']) && variable_get(FB_VAR_LANGUAGE_OVERRIDE, 'override')) {

      // @TODO - get locale from signed request.  It appears to contain it now.
      $fb_lang = $_SESSION['fb_locale'];
    }
    else {
      $user_language = user_preferred_language($GLOBALS['user']);
      $fb_lang = variable_get('fb_language_' . $user_language->language, 'en_US');
    }
    $js_sdk = fb_protocol() . "://connect.facebook.net/{$fb_lang}/all.js";
    fb_js_settings('js_sdk_url', variable_get(FB_VAR_JS_SDK, $js_sdk));
  }

  // Add our module's javascript.
  drupal_add_js(drupal_get_path('module', 'fb') . '/fb.js');

  // See also fb_footer(), where we initialize facebook's SDK.
}