'%d', 'apikey' => "'%s'", 'nid' => '%d', // DEPRECATED ) as $key => $type) { if (isset($data[$key])) { $where[] = "$key = $type"; $args[] = $data[$key]; } } // Status is a special query. Admin pages include disabled apps. if (isset($data['status'])) { $where[] = "status >= %d"; $args[] = $data['status']; } else { $where[] = "status > 0"; } if (count($args)) { $fb_app = db_fetch_object(db_query("SELECT * FROM {fb_app} fba WHERE " . implode(' AND ', $where), $args)); } if ($fb_app) { $return = $fb_app; } } elseif ($op == FB_OP_GET_ALL_APPS) { // Return all known applications, including disabled. $result = db_query("SELECT fba.* FROM {fb_app} fba"); while ($app = db_fetch_object($result)) { $return[] = $app; } } elseif ($op == FB_OP_POST_INIT) { // Include our admin hooks. if (fb_is_fb_admin_page()) { require drupal_get_path('module', 'fb_app') . '/fb_app.admin.inc'; } } } /** * Implementation of hook_menu(). */ function fb_app_menu() { $items = array(); // Allow facebook to notify on various events, like adding or removing an app. $items[FB_APP_PATH_EVENT] = array( 'access callback' => TRUE, 'page callback' => 'fb_app_event_cb', 'type' => MENU_CALLBACK, ); // Administration. $items[FB_PATH_ADMIN . '/fb_app_create'] = array( 'title' => 'Add Application', 'description' => 'Host an application on this server.', 'page callback' => 'drupal_get_form', 'page arguments' => array('fb_app_edit_form'), 'access arguments' => array(FB_PERM_ADMINISTER), 'file' => 'fb_app.admin.inc', 'type' => MENU_LOCAL_TASK, 'weight' => -1, ); $items[FB_PATH_ADMIN_APPS . '/%fb/fb_app'] = array( 'title' => 'Edit', 'description' => 'Add Facebook Application', 'page callback' => 'drupal_get_form', 'page arguments' => array('fb_app_edit_form', FB_PATH_ADMIN_APPS_ARGS), 'access arguments' => array(FB_PERM_ADMINISTER), 'file' => 'fb_app.admin.inc', 'weight' => -1, 'type' => MENU_LOCAL_TASK, ); return $items; } /** * Callback for FB_APP_PATH_EVENT. * * We don't act on the events directly. We pass the information along via * hook_fb. Other modules are thus notified of the event and can take action. */ function fb_app_event_cb($event_type) { fb_invoke(FB_APP_OP_EVENT, array( 'event_type' => $event_type, 'fb_app' => $GLOBALS['_fb_app'], 'fb' => $GLOBALS['_fb']), NULL ); // This page is called by facebook, not a user's browser. print('Thanks Facebook, for your fancy API!'); // Problems if we save session during Facebook Connect, because the event callback's share session with normal pages. session_save_session(FALSE); exit(); } function fb_app_get_about_url($fb_app) { if ($fb_app->id) return url("http://www.facebook.com/apps/application.php", array('query' => array('id' => $fb_app->id))); } // Not currently used, AFAIK. function theme_fb_app($fb_app) { // Get known properties $props_map = fb_invoke(FB_OP_LIST_PROPERTIES, array('fb_app' => $fb_app), array()); $data = array( t('Label') => $fb_app->label, t('API Key') => $fb_app->apikey, //t('Secret') => $fb_app->secret, ); foreach ($props_map as $name => $key) { if (isset($fb_app->$key)) $data[$name] = $fb_app->$key; } $output = theme('dl', $data); return $output; } /** * Implementation of hook_user. */ function fb_app_user($op, &$edit, &$account, $category = NULL) { $items = array(); if ($op == 'view') { $apps = fb_get_all_apps(); foreach ($apps as $fb_app) { // Learn this user's FB id $fbu = fb_get_fbu($account->uid, $fb_app); if ($fbu) { // The drupal user is a facebook user. Now, learn more from facebook. $fb = fb_api_init($fb_app, FB_FBU_ANY); if (fb_facebook_user($fb)) { try { $info = $fb->api_client->users_getInfo(array($fbu), array( 'about_me', 'affiliations', 'name', 'is_app_user', 'pic_big', 'profile_update_time', 'status', )); } catch (Exception $e) { fb_log_exception($e, "Failed to get Facebook user info for account $fbu"); } } if (isset($info) && count($info)) { // Is this working properly??? TODO! $output = theme('fb_app_user_info', $fb_app, $info[0]); $items[$fb_app->label] = array( 'title' => $fb_app->title, 'value' => $output, 'class' => 'fb_app'); } else fb_report_errors($fb); } } if (count($items)) return array(t('Facebook') => $items); } } function theme_fb_app_user_info($fb_app, $info) { if (isset($info['pic_big'])) $output = '

'; $fb_link = l($info['name'], 'http://www.facebook.com/profile.php', array( 'query' => 'id=' . $info['uid'])); if ($info['is_app_user']) $output .= '

' . t('!fb_link uses %title', array( '!fb_link' => $fb_link, '%title' => $fb_app->title)) . '

'; else $output .= '

'. t('!fb_link does not use %title', array( '!fb_link' => $fb_link, '%title' => $fb_app->title)) . '

'; return $output; } function fb_app_token_list($type = 'all') { if ($type == 'all' || $type == 'fb' || $type == 'fb_app') { $tokens['fb_app']['fb-app-label'] = t('Facebook application label'); $tokens['fb_app']['fb-app-url'] = t('Facebook application canvas page URL'); } return $tokens; } function fb_app_token_values($type = 'all', $object = NULL) { $values = array(); if ($type == 'fb_app' && $object) { $fb_app = $object; $values['fb-app-label'] = $fb_app->label; $values['fb-app-url'] = 'http://apps.facebook.com/'. $fb_app->canvas; } return $values; }