? facebook-platform Index: README.txt =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/README.txt,v retrieving revision 1.10 diff -u -u -p -r1.10 README.txt --- README.txt 16 Jul 2008 21:06:05 -0000 1.10 +++ README.txt 29 Jul 2008 18:39:49 -0000 @@ -19,7 +19,7 @@ To install: - Download the facebook-platform PHP code from developer.facebook.com. Extract it into the 'modules/fb' directory, so you have - modules/fb/facebook-application/ + modules/fb/facebook-platform/ wget http://developers.facebook.com/clientlibs/facebook-platform.tar.gz tar xvzf facebook-platform.tar.gz @@ -30,13 +30,15 @@ tar xvzf facebook-platform.tar.gz you may encounter uncaught exceptions using the PHP5 API. - Edit your settings.php file (sites/default/settings.php, depending - on your install) to include settings.inc (in this directory). For + on your install) to include fb_settings.inc (in this directory). For example: require_once "profiles/custom/modules/fb/fb_settings.inc"; (Or whatever path is appropriate, could be - "sites/all/modules/fb/fb_settings.inc") + "sites/all/module/fb/fb_settings.inc"). + Include fb_settings.inc at the *end* of your settings.php file to + avoid overwriting optional $conf array manual overrides. - Enable the Facebook modules via the drupal admin pages, as usual. You must enable at least fb.module and fb_app.module. You will Index: fb.info =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb.info,v retrieving revision 1.1 diff -u -u -p -r1.1 fb.info --- fb.info 26 Sep 2007 17:08:21 -0000 1.1 +++ fb.info 29 Jul 2008 18:39:49 -0000 @@ -1,3 +1,4 @@ name = Facebook API description = Imports and uses the Facebook API. package = Facebook +core = 6.x Index: fb.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb.install,v retrieving revision 1.2 diff -u -u -p -r1.2 fb.install --- fb.install 7 Apr 2008 20:56:49 -0000 1.2 +++ fb.install 29 Jul 2008 18:39:50 -0000 @@ -5,20 +5,19 @@ function _fb_install_set_weight() { } function fb_install() { + //drupal_install_schema('fb'); _fb_install_set_weight(); } -function fb_update_1() { - _fb_install_set_weight(); + +function fb_uninstall() { + //drupal_uninstall_schema('fb'); + _fb_install_set_weight(); } -/** - * The callback URL has changed and this requires manual updates to App settings. - */ -function fb_update_2() { - $message = t('Warning! The Drupal for Facebook modules have changed. Manual intervention is required! See !url1 or !url2.', - array('!url1' => l('http://apps.facebook.com/drupalforfacebook/node/1055', 'http://apps.facebook.com/drupalforfacebook/node/1055'), - '!url2' => l('http://drupalforfacebook.org/node/1055','http://drupalforfacebook.org/node/1055'))); - drupal_set_message($message); - watchdog('fb', $message); +/* +function fb_schema() { + //this cannot return nothing, or common.inc reports error + $schema = array(); + return $schema; } -?> \ No newline at end of file +*/ \ No newline at end of file Index: fb.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb.module,v retrieving revision 1.23 diff -u -u -p -r1.23 fb.module --- fb.module 25 Jul 2008 19:12:43 -0000 1.23 +++ fb.module 29 Jul 2008 18:39:50 -0000 @@ -42,6 +42,9 @@ define('FB_USE_PHP4_API', variable_get(' */ function fb_init() { global $fb, $fb_app, $fb_app_node; // Set by this function. + + //watchdog('debug', "fb_init called.           " . dprint_r(debug_backtrace(), 1)); + // Session sanity check. This is relevant on iframe pages when user once // had the app added, but has since removed it. This is a bit of a hack @@ -73,7 +76,7 @@ function fb_init() { array('!drupal_for_facebook' => l(t('Drupal for Facebook'), 'http://drupal.org/project/fb'), // This link should work with clean URLs // disabled. - '!readme' => 'README.txt')), 'error'); + '!readme' => 'README.txt')), 'error'); } @@ -217,9 +220,9 @@ function fb_api_init($fb_app, $fbu) { // get_loggedin_user does not really test it. if ($fbu_orig != FB_FBU_CURRENT && !$fb->get_loggedin_user()) { // An FBU other than CURRENT was specified, but we failed to log in. - watchdog('fb', t('Failed to log into facebook app %app as user %user', - array('%app' => $fb_app->title, - '%user' => $fbu_orig)), WATCHDOG_ERROR); + watchdog('fb', 'Failed to log into facebook app %app as user %user', + array('%app' => $fb_app->title, + '%user' => $fbu_orig), WATCHDOG_ERROR); } } @@ -418,15 +421,15 @@ function fb_user_load($fbu = NULL) { if (!$account) $account = user_load(array('uid' => variable_get('fb_facebook_user', 2))); if (!$account) - watchdog('fb', t('Failed to load user from facebook fbu=%fbu', - array('%fbu' => $fbu)), 'error'); + watchdog('fb', 'Failed to load user from facebook fbu=%fbu', + array('%fbu' => $fbu), 'error'); $account->fbu = $fbu; return $account; } } -function fb_form_alter($form_id, &$form) { +function fb_form_alter(&$form, &$form_state, $form_id) { // Because facebook users don't have email, it can't be required on user form if ($form_id == 'user_register') { if (user_access('administer users')) { @@ -441,26 +444,21 @@ function fb_form_alter($form_id, &$form) } -function fb_menu($may_cache) { +function fb_menu() { $items = array(); - if (!$may_cache) { - // Initialization moved to fb_init(), nothing to do here. - } - else { // When forms are submitted directly to us, we cache the results, // and show them later via this callback - $items[] = array('path' => 'fb/form_cache', - 'callback' => '_fb_form_cache_cb', + $items['fb/form_cache'] = array( + 'page callback' => '_fb_form_cache_cb', 'type' => MENU_CALLBACK, - 'access' => TRUE); + 'access callback' => TRUE); // A page to help determine infinite session keys - $items[] = array('path' => 'fb/session', - 'callback' => '_fb_session_cb', + $items['fb/session'] = array( + 'page callback' => '_fb_session_cb', 'type' => MENU_CALLBACK, - 'access' => TRUE); // TODO: restrict access? - } + 'access callback' => TRUE); // TODO: restrict access? return $items; } @@ -692,4 +690,4 @@ function fb_verbose() { return variable_get('fb_verbose', NULL); } -?> \ No newline at end of file +?> Index: fb_app.info =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb_app.info,v retrieving revision 1.1 diff -u -u -p -r1.1 fb_app.info --- fb_app.info 26 Sep 2007 17:08:21 -0000 1.1 +++ fb_app.info 29 Jul 2008 18:39:50 -0000 @@ -1,5 +1,6 @@ name = Facebook Application description = Create one or more facebook applications. package = Facebook -dependencies = fb +dependencies[] = fb +core = 6.x Index: fb_app.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb_app.install,v retrieving revision 1.4 diff -u -u -p -r1.4 fb_app.install --- fb_app.install 2 Jul 2008 23:59:27 -0000 1.4 +++ fb_app.install 29 Jul 2008 18:39:50 -0000 @@ -6,59 +6,63 @@ */ // TODO: some of these tables should be created by othe module install files. -Function fb_app_install() { - switch ($GLOBALS['db_type']) { - case 'mysql': - case 'mysqli': - db_query(" -CREATE TABLE IF NOT EXISTS {fb_app} ( -nid int(11) unsigned NOT NULL, -label varchar(128) NOT NULL, -apikey varchar(128) NOT NULL, -id varchar(128) NOT NULL, -secret varchar(128) NOT NULL, -canvas varchar(128) NOT NULL, -require_login int(4) NOT NULL, -create_account int(4) NOT NULL, -unique_account int(4) NOT NULL, -data longtext, -PRIMARY KEY (nid), -UNIQUE KEY (apikey) -) /*!40100 DEFAULT CHARACTER SET UTF8 */; -"); - db_query(" -CREATE TABLE IF NOT EXISTS {fb_app_block} ( -nid int(11) unsigned NOT NULL, -delta varchar(32) NOT NULL, -format int(11) DEFAULT 0, -body longtext NOT NULL, -PRIMARY KEY (nid, delta) -) /*!40100 DEFAULT CHARACTER SET UTF8 */; -"); +/** + * hook_install() + */ +function fb_app_install() { + // Create tables. + drupal_install_schema('fb_app'); + + drupal_set_message(t('Facebook Application module installed. Please grant yourself permissions and then browse to Create Content => Facebook Application to get started.', array('!perm' => url('admin/user/permissions'), '!create' => url('node/add/fb-app')))); +} - // This table schema has to match the cache_filter table. - db_query(" -CREATE TABLE {fb_cache_filter} ( -cid varchar(255) NOT NULL default '', -data longblob, -expire int NOT NULL default '0', -created int NOT NULL default '0', -headers text, -PRIMARY KEY (cid), -INDEX expire (expire) -) /*!40100 DEFAULT CHARACTER SET UTF8 */; +/** + * hook_uninstall() + */ +function fb_app_uninstall() { + // Remove tables. + drupal_uninstall_schema('fb_app'); +} -"); - } - - drupal_set_message(t('Facebook Application module installed. Please grant yourself permissions and then browse to Create Content => Facebook Application to get started.', array('!perm' => url('admin/user/access'), '!create' => url('node/add/fb-app')))); - +function fb_app_schema() { + $schema['fb_app'] = array( + 'description' => 'Main FB_APP table', + 'fields' => array( + 'nid' => array('type' => 'int', 'length' => 11, 'unsigned' => TRUE, 'not null' => TRUE, ), + 'label' => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, ), + 'apikey' => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, ), + 'id' => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, ), + 'secret' => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, ), + 'canvas' => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, ), + 'require_login' => array('type' => 'int', 'length' => 4, 'not null' => TRUE, ), + 'create_account' => array('type' => 'int', 'length' => 4, 'not null' => TRUE, ), + 'unique_account' => array('type' => 'int', 'length' => 4, 'not null' => TRUE, ), + 'rid' => array('type' => 'int', 'length' => 10, 'unsigned' => TRUE, 'not null' => TRUE, ), + 'data' => array('type' => 'text', 'size' => 'big', ), + ), + 'unique keys' => array( + 'apikey' => array('apikey'), + ), + 'primary key' => array('nid'), + ); + $schema['fb_app_block'] = array( + 'fields' => array( + 'nid' => array('type' => 'int', 'length' => 11, 'unsigned' => TRUE, 'not null' => TRUE, ), + 'delta' => array('type' => 'varchar', 'length' => 32, 'not null' => TRUE, ), + 'format' => array('type' => 'int', 'length' => 11, 'default' => 0, ), + 'body' => array('type' => 'text', 'size' => 'big', 'not null' => TRUE, ), + ), + 'primary key' => array('nid', 'delta'), + ); + $schema['fb_cache_filter'] = drupal_get_schema_unprocessed('system', 'cache'); + + return $schema; } -function fb_app_update_1() { +function fb_app_update_6100() { // Add id field - $ret[] = update_sql('ALTER TABLE {fb_app} ADD id varchar(128) NOT NULL'); - return $ret; -} -?> \ No newline at end of file + $ret = array(); + db_add_field($ret, 'fb_app', 'id', array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, )); + return $ret; +} \ No newline at end of file Index: fb_app.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb_app.module,v retrieving revision 1.14 diff -u -u -p -r1.14 fb_app.module --- fb_app.module 25 Jul 2008 19:13:19 -0000 1.14 +++ fb_app.module 29 Jul 2008 18:39:50 -0000 @@ -10,8 +10,7 @@ define('FB_APP_REQ_API_KEY', 'fb_sig_api * hook_fb */ function fb_app_fb($fb, $fb_app, $op, &$return, $data) { - - //drupal_set_message("fb_app_fb($fb_app->label, $op)" . dpr($fb_app, 1)); + //dpm(func_get_args(), "fb_app_fb"); if ($op == FB_OP_GET_APP) { // This operation determines which app the request is for. Theoretically, @@ -34,7 +33,7 @@ function fb_app_fb($fb, $fb_app, $op, &$ } else { if (function_exists('fb_settings')) { - // See settings.inc + // See fb_settings.inc if ($nid = fb_settings(FB_SETTINGS_APP_NID)) { // Here if we're in iframe, using our /fb_canvas/nid/ path convention. $fb_app = db_fetch_object(db_query("SELECT * FROM {fb_app} fb INNER JOIN {node} n ON n.nid=fb.nid WHERE fb.nid=%d and status=1", @@ -84,7 +83,7 @@ function fb_app_node_info() { ); } -function fb_app_access($op, $node) { +function fb_app_access($op, $node, $account) { if (user_access('administer fb apps')) return TRUE; if ($op == 'create' && user_access('create fb apps')) @@ -231,6 +230,20 @@ function fb_app_view($node, $teaser=FALS return $node; } +function fb_app_theme() { + return array( + 'fb_app' => array( + 'arguments' => array('data' => NULL), + ), + 'dl' => array( + 'arguments' => array('items' => NULL), + ), + 'fb_app_user_info' => array( + 'arguments' => array('fb_app' => NULL, 'info' => NULL), + ), + ); +} + function fb_app_get_about_url($fb_app) { if ($fb_app->id) return url("http://www.facebook.com/apps/application.php", "id=$fb_app->id"); @@ -242,7 +255,6 @@ function theme_fb_app($data) { t('API Key') => $data->apikey, t('Secret') => $data->secret, t('About page') => $about_url ? $about_url : t('N/A'), - // TODO: edit and logout URLs )); } @@ -273,7 +285,7 @@ function fb_app_insert($node) { ); _fb_app_blocks_update($node); - + watchdog('fb_app', t('Created Facebook Application %label.', array('%label' => $fb_app->label, )), @@ -408,7 +420,7 @@ function fb_app_user($op, &$edit, &$acco function theme_fb_app_user_info($fb_app, $info) { if ($info['pic_big']) $output .= '

'; - $fb_link = l($info['name'], 'http://www.facebook.com/profile.php', NULL, 'id='.$info['uid']); + $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, @@ -439,5 +451,4 @@ function fb_app_token_values($type = 'al } return $values; } - ?> \ No newline at end of file Index: fb_canvas.info =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb_canvas.info,v retrieving revision 1.1 diff -u -u -p -r1.1 fb_canvas.info --- fb_canvas.info 7 Apr 2008 20:56:49 -0000 1.1 +++ fb_canvas.info 29 Jul 2008 18:39:50 -0000 @@ -1,5 +1,8 @@ name=Facebook Application Canvas Pages description=Support for Facebook Canvas Pages package = Facebook -dependencies = fb fb_app +dependencies[] = fb +dependencies[] = fb_app +core = 6.x +version = "6.x-1.x-dev" Index: fb_canvas.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb_canvas.module,v retrieving revision 1.10 diff -u -u -p -r1.10 fb_canvas.module --- fb_canvas.module 29 Jul 2008 18:07:06 -0000 1.10 +++ fb_canvas.module 29 Jul 2008 18:39:50 -0000 @@ -22,11 +22,8 @@ function fb_canvas_fb($fb, $fb_app, $op, $custom_theme = $fb_canvas_data['theme_fbml']; else if (fb_canvas_is_iframe()) $custom_theme = $fb_canvas_data['theme_iframe']; - - // This is for backward compatability (delete eventually) - if (!$custom_theme) - $custom_theme = variable_get('fb_theme', 'fb_fbml'); - + + watchdog('fb_debug', "setting custom_theme to $custom_theme in fb_canvas_fb"); // Special handling for forms, as they are submitted directly to us, not // to apps.facebook.com/canvas @@ -54,6 +51,7 @@ function fb_canvas_fb($fb, $fb_app, $op, ob_end_clean(); if ($destination) { + watchdog('fb_debug', "FB_OP_EXIT, handling form, original destination: $destination"); // Fully qualified URLs need to be modified to point to facebook app. // URLs are fully qualified when a form submit handler returns a path, // or any call to drupal_goto. @@ -63,6 +61,7 @@ function fb_canvas_fb($fb, $fb_app, $op, // canvas page, so we'll use Facebook's method. // Will this preempt other hook_exits? if ($fb) { + watchdog('fb_debug', "FB_OP_EXIT, handling form, redirecting to $destination"); $fb->redirect($destination); } } @@ -71,7 +70,7 @@ function fb_canvas_fb($fb, $fb_app, $op, $token = uniqid('fb_'); $cid = session_id() . "_$token"; watchdog('fb', "Storing cached form page $cid, then redirecting"); - cache_set($cid, 'cache_page', $output, time() + (60 * 5), drupal_get_headers()); // (60 * 5) == 5 minutes + cache_set($cid, $output, 'cache_page', time() + (60 * 5), drupal_get_headers()); // (60 * 5) == 5 minutes $dest = 'http://apps.facebook.com/' . $fb_app->canvas . "/fb/form_cache/$cid"; // $fb->redirect($url); // Does not work! @@ -100,7 +99,7 @@ function fb_canvas_fb($fb, $fb_app, $op, /** * Implementation of hook_form_alter. */ -function fb_canvas_form_alter($form_id, &$form) { +function fb_canvas_form_alter(&$form, &$form_state, $form_id) { // Add our settings to the fb_app edit form. if (is_array($form['fb_app_data'])) { $node = $form['#node']; @@ -140,31 +139,33 @@ function fb_canvas_form_alter($form_id, '#default_value' => $fb_canvas_data['front_added'], ); + /* XXX menu code here needs updating to D6 // Allow primary links to be different on facebook versus the rest of the // site. Code from menu_configure() in menu.module. - $root_menus = menu_get_root_menus(); - - $primary_options = $root_menus; - $primary_options[0] = t(''); - $secondary_options = $root_menus; - $secondary_options[0] = t(''); - - $form['fb_app_data']['fb_canvas']['primary_links'] = - array('#type' => 'select', - '#title' => t('Menu containing primary links'), - '#description' => t('Your application can have primary links different from those used elsewhere on your site.'), - '#default_value' => $fb_canvas_data['primary_links'], - '#options' => $primary_options, + $primary = variable_get('menu_primary_links_source', 'primary-links'); + $primary_options = array_merge($menu_options, array('' => t(''))); + $form['fb_app_data']['fb_canvas']['menu_primary_links_source'] = + array( + '#type' => 'select', + '#title' => t('Source for the primary links'), + '#default_value' => $fb_canvas_data['primary_links'], + '#options' => $primary_options, + '#tree' => FALSE, + '#description' => t('Your application can have primary links different from those used elsewhere on your site.'), ); - $form['fb_app_data']['fb_canvas']['secondary_links'] = - array('#type' => 'select', - '#title' => t('Menu containing secondary links'), - '#default_value' => $fb_canvas_data['secondary_links'], - '#options' => $secondary_options, - '#description' => t('If you select the same menu as primary links then secondary links will display the appropriate second level of your navigation hierarchy.'), + + $secondary_options = array_merge($menu_options, array('' => t(''))); + $form['fb_app_data']['fb_canvas']["menu_secondary_links_source"] = + array( + '#type' => 'select', + '#title' => t('Source for the secondary links'), + '#default_value' => $fb_canvas_data['secondary_links'], + '#options' => $secondary_options, + '#tree' => FALSE, + '#description' => t('If you select the same menu as primary links then secondary links will display the appropriate second level of your navigation hierarchy.'), ); - - +*/ + // Override themes $themes = system_theme_data(); ksort($themes); @@ -203,7 +204,7 @@ function fb_canvas_form_alter($form_id, // We need to make sure the action goes to our domain and not apps.facebook.com if ($form['#action'] == '') { - $form['#action'] = $_GET['q']; + $form['#action'] = $_GET['q']; //TODO: somewhere the canvas is getting prepended to form action urls. form submit doesn't work } $form['#action'] = _fb_canvas_make_form_action_local($form['#action']); // Let's hope no subsequent hook_form_alters mess with #action. @@ -222,8 +223,8 @@ function fb_canvas_nodeapi(&$node, $op, $output = theme('dl', array(t('Canvas page') => "http://apps.facebook.com/$fb_app->canvas", t('Callback URL') => t("%clean_url
(or %advanced_url only if your theme is designed to support PAGE_TYPE.)
Make sure you have enabled clean URLs, and include the trailing '/'.", - array("%clean_url" => url('', NULL, NULL, TRUE) . FB_SETTINGS_APP_NID . '/' . $node->nid .'/', - "%advanced_url" => url('', NULL, NULL, TRUE) . FB_SETTINGS_APP_NID . '/' . $node->nid . '/' . FB_SETTINGS_PAGE_TYPE . '/PAGE_TYPE/', + array("%clean_url" => url('', array('absolute' => TRUE)) . FB_SETTINGS_APP_NID . '/' . $node->nid . '/', + "%advanced_url" => url('', array('absolute' => TRUE)) . FB_SETTINGS_APP_NID . '/' . $node->nid . '/'. FB_SETTINGS_PAGE_TYPE . '/PAGE_TYPE/', ) ), )); @@ -259,10 +260,16 @@ function fb_canvas_handling_form() { // This may need work function _fb_canvas_make_form_action_local($action) { + dpm($action, "_fb_canvas_make_form_action_local"); + global $base_path; + //dpm($base_path, "_fb_canvas_make_form_action_local base_path"); + //dpm(url(), "_fb_canvas_make_form_action_local url()"); + // dpm(url('', array('absolute' => TRUE)), "_fb_canvas_make_form_action_local url()"); + // If action is fully qualified, do not change it if (strpos($action, ':')) return $action; - + // I'm not sure where the problem is, but sometimes actions have two question marks. I.e. // /htdocs/?app=foo&q=user/login?destination=comment/reply/1%2523comment-form // Here we replace 3rd (or more) '?' with '&'. @@ -272,8 +279,25 @@ function _fb_canvas_make_form_action_loc $action .= '&' . implode('&', $parts); } + $relative = url(''); + $absolute = url('', array('absolute'=>TRUE)); + global $fb_app; + + if (strpos($action, FB_SETTINGS_APP_NID)) { + $action = $absolute . substr($action, strlen($relative)); + } + else if (strpos($action, $relative) === 0) { + // Replace relative action with absolute. + // Include fb settings + // TODO: FB_SETTINGS_PAGE_TYPE + $action = $absolute . FB_SETTINGS_APP_NID . '/' . $fb_app->nid . '/' . substr($action, strlen($relative)); + } + + dpm($action, '_fb_canvas_make_form_action_local returning'); + return $action; + //drupal_set_message("form action now " . "http://".$_SERVER['HTTP_HOST']. $action); // debug - return "http://".$_SERVER['HTTP_HOST']. $action; + //return "http://".$_SERVER['HTTP_HOST']. $action; } /** @@ -284,9 +308,16 @@ function _fb_canvas_make_form_action_loc function fb_canvas_fix_url($url, $fb_app) { global $base_url; + + $patterns[] = "|{$base_url}/" . FB_SETTINGS_APP_NID . "/{$fb_app->nid}/|"; // Here we assume apps.facebook.com. Is this safe? $replacements[] = "http://apps.facebook.com/{$fb_app->canvas}/"; + + // fully qualified paths + $patterns[] = "|".url('', array('absolute' => TRUE))."|"; + $replacements[] = "http://apps.facebook.com/{$fb_app->canvas}/"; + $patterns[] = "|fb_cb_type/[^/]*/|"; $replacements[] = ""; @@ -294,8 +325,12 @@ function fb_canvas_fix_url($url, $fb_app // Facebook will prepend "appNNN_" all our ids $patterns[] = "|#([^\?]*)|"; $replacements[] = "#app{$fb_app->id}_$1"; + + watchdog('fb_debug', "fb_canvas_fix_url($url), patterns: " . dprint_r($patterns, 1) . " replacements: " . dprint_r($replacements, 1)); $url = preg_replace($patterns, $replacements, $url); + watchdog('fb_debug', "fb_canvas_fix_url returning $url"); + return $url; } @@ -368,7 +403,15 @@ function fb_canvas_process($output, $add if (fb_canvas_is_fbml()) { //dpm($output, "before fb_canvas_process"); // We're producing FBML for a canvas page + + /* + TODO: $output['logo'] is not being processed properly by these + patterns. fb_canvas_process() returns '/sites/all/themes/fb_fbml/logo.png' + and Facebook complains "Relative URLs not allowed here" + LOGO is turned off in theme settings for now. + */ + // Change links to use canvas on Facebook // Links ending in #something: $patterns[] = "|=\"{$base}([^\"]*#)|"; @@ -467,4 +510,3 @@ function fb_canvas_process_fbml($output, else return $output; } -?> \ No newline at end of file Index: fb_devel.info =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb_devel.info,v retrieving revision 1.1 diff -u -u -p -r1.1 fb_devel.info --- fb_devel.info 7 Apr 2008 20:56:49 -0000 1.1 +++ fb_devel.info 29 Jul 2008 18:39:50 -0000 @@ -1,6 +1,8 @@ name=Drupal for Facebook Development and Debugging description=Blocks and messages that help when developing Apps. package = Facebook -dependencies = fb devel +dependencies[] = fb +dependencies[] = devel +core = 6.x Index: fb_devel.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb_devel.module,v retrieving revision 1.5 diff -u -u -p -r1.5 fb_devel.module --- fb_devel.module 16 Jul 2008 21:08:02 -0000 1.5 +++ fb_devel.module 29 Jul 2008 18:39:50 -0000 @@ -1,22 +1,18 @@ 'fb/devel', - 'callback' => 'fb_devel_page', - 'type' => MENU_CALLBACK, - 'access' => TRUE, // TODO: restrict access - ); - $items[] = array('path' => 'fb/devel/fbu', - 'callback' => 'fb_devel_fbu_page', - 'type' => MENU_CALLBACK, - 'access' => TRUE, - ); - } +function fb_devel_menu() { + $items['fb/debug'] = array('page callback' => 'fb_devel_cb', + 'type' => MENU_CALLBACK, + 'access callback' => TRUE, /* TODO: restrict access */ + ); + + $items['fb/devel/fbu'] = array('page callback' => 'fb_devel_fbu_page', + 'type' => MENU_CALLBACK, + 'access' => TRUE, + ); + return $items; - } +} function fb_devel_fb($fb, $fb_app, $op, &$return, $data) { @@ -30,7 +26,7 @@ function fb_devel_fb($fb, $fb_app, $op, '!url' => "http://www.facebook.com/developers/apps.php", )); drupal_set_message($message, 'error'); - watchdog('fb_devel', $message); + watchdog('fb_devel', $message, array(), WATCHDOG_ERROR); } // Theme sanity check @@ -42,7 +38,7 @@ function fb_devel_fb($fb, $fb_app, $op, // disabled. '!readme' => 'README.txt')); drupal_set_message($message, 'error'); - watchdog('fb_devel', $message); + watchdog('fb_devel', $message, array(), WATCHDOG_ERROR); } } Index: fb_form.info =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb_form.info,v retrieving revision 1.2 diff -u -u -p -r1.2 fb_form.info --- fb_form.info 5 May 2008 22:14:18 -0000 1.2 +++ fb_form.info 29 Jul 2008 18:39:50 -0000 @@ -1,4 +1,8 @@ name = Facebook Forms description = Enables FBML form elements via Drupal Form API. Provides commonly needed forms such as invite friends to install application. package = Facebook -dependencies = fb +dependencies[] = fb +core = 6.x + +version = "6.x-1.x-dev" + Index: fb_form.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb_form.module,v retrieving revision 1.8 diff -u -u -p -r1.8 fb_form.module --- fb_form.module 25 Jul 2008 19:14:30 -0000 1.8 +++ fb_form.module 29 Jul 2008 18:39:50 -0000 @@ -15,25 +15,22 @@ /** * hook_menu. */ -function fb_form_menu($may_cache) { +function fb_form_menu() { $items = array(); - if ($may_cache) { - // Page allowing a user to invite their friends to add the app. - $items[] = array('path' => 'fb/invite', - 'callback' => 'fb_form_invite_page', - 'access' => TRUE, + // Page allowing a user to invite their friends to add the app. + $items['fb/invite'] = array( + 'page callback' => 'fb_form_invite_page', + 'access callback' => TRUE, 'type' => MENU_CALLBACK, ); - } return $items; } /** * hook_form_alter. */ -function fb_form_form_alter($form_id, &$form) { - // Drupal allows no clean way to set $form['#type'], so we hack. - +function fb_form_form_alter(&$form, &$form_state, $form_id) { + /* Drupal allows no clean way to set $form['#type'], so we hack... */ if ($type = $form['#fb_form_type_hack']) { $form['#type'] = $type; unset($form['#fb_form_type_hack']); @@ -116,7 +113,7 @@ function fb_form_invite_page() { if (function_exists('fb_canvas_is_fbml') && !fb_canvas_is_fbml()) { - drupal_set_message(t('Unable to display page. FBML required.'), 'error'); + drupal_set_message('Unable to display page. FBML required.', 'error'); drupal_not_found(); exit(); } @@ -254,7 +251,7 @@ function fb_form_friend_options($fbu) { $items = array(); if ($fb) { - $query = "SELECT last_name, first_name, uid, pic_square FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=$fbu)"; + $query = "SELECT last_name, first_name, uid, pic_square FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=$fbu)"; //TODO: db_query this to be safe? $result = $fb->api_client->fql_query($query); // TODO: sort results by name @@ -268,14 +265,14 @@ function fb_form_friend_options($fbu) { function fb_form_group_member_options($fbg, $fbu) { global $fb; - $query = "SELECT uid FROM group_member WHERE gid=$fbg"; + $query = "SELECT uid FROM group_member WHERE gid=$fbg"; //TODO: db_query this? $result = $fb->api_client->fql_query($query); drupal_set_message("fb_form_group_member_options($fbg, $fbu) query $query returns" . dpr($result, 1)); - $query = "SELECT uid, first_name, last_name FROM user WHERE uid IN (SELECT uid FROM group_member WHERE gid=$fbg)"; + $query = "SELECT uid, first_name, last_name FROM user WHERE uid IN (SELECT uid FROM group_member WHERE gid=$fbg)"; //TODO: db_query to be safe? $result = $fb->api_client->fql_query($query); drupal_set_message("fb_form_group_member_options($fbg, $fbu) query $query returns" . dpr($result, 1)); @@ -346,7 +343,7 @@ function friend_selector_process($orig) static $options = NULL; if (!$options) { - $query = "SELECT last_name, first_name, uid, pic_square FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=".fb_facebook_user().")"; + $query = "SELECT last_name, first_name, uid, pic_square FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=". fb_facebook_user() .")"; $result = $fb->api_client->fql_query($query); // TODO: sort results by name @@ -371,6 +368,14 @@ function friend_selector_value(&$form) { //drupal_set_message("friend_selector_value" . dpr($form, 1)); } +function fb_form_theme() { + return array( + 'friend_selectorXXX' => array( + 'arguments' => array('fbu' => NULL), + ), + ); +} + // TODO: provide some alternative when NOT a facebook app. // deprecated! function theme_friend_selector($fbu = NULL) { @@ -381,4 +386,3 @@ function theme_friend_selector($fbu = NU $output = ""; return $output; } -?> \ No newline at end of file Index: fb_infinite.info =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb_infinite.info,v retrieving revision 1.1 diff -u -u -p -r1.1 fb_infinite.info --- fb_infinite.info 15 Oct 2007 18:39:09 -0000 1.1 +++ fb_infinite.info 29 Jul 2008 18:39:50 -0000 @@ -1,5 +1,7 @@ name=Facebook Infinite Session description=Configure an infinite session that allows use of the Facebook API from non-canvas pages. For example, to access Facebook API from a cron job. package = Facebook -dependencies = fb +dependencies[] = fb +core = 6.x +version = "6.x-1.x-dev" Index: fb_infinite.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb_infinite.module,v retrieving revision 1.3 diff -u -u -p -r1.3 fb_infinite.module --- fb_infinite.module 13 May 2008 14:54:26 -0000 1.3 +++ fb_infinite.module 29 Jul 2008 18:39:50 -0000 @@ -24,43 +24,52 @@ function fb_infinite_fb($fb, $fb_app, $o /** * hook_menu */ -function fb_infinite_menu($may_cache) { - $items = array(); - if ($may_cache) { - $items[] = array('path' => 'fb/infinite/display', - 'title' => t('Facebook session information'), - 'access' => user_access('administer fb apps'), // perm defined in fb_app.module - 'callback' => 'fb_infinite_display_page', - 'type' => MENU_CALLBACK, +function fb_infinite_menu() { + $items['fb/infinite/display'] = + array('title' => t('Facebook session information'), + 'page callback' => 'fb_infinite_display_page', + 'access callback' => 'user_access', + 'access arguments' => array('administer fb apps'), // perm defined in fb_app.module + 'type' => MENU_CALLBACK, ); - } - else { - if (arg(0) == 'node' && is_numeric(arg(1))) { - $node = node_load(arg(1)); - if ($node->type == 'fb_app') { - // Only show if infinite session is configured. - $fb_app_data = fb_app_get_data($node->fb_app); - $fb_infinite_data = $fb_app_data['fb_infinite']; - if ($fb_infinite_data['key']) { - $items[] = array('path' => "node/$node->nid/fb/infinite/test", - 'title' => t('Infinite session test'), - 'type' => MENU_LOCAL_TASK, - 'access' => node_access('update', $node), - 'callback' => 'fb_infinite_test_page', - 'callback arguments' => array($node->nid), - ); - } - } + + $items['node/%fb_infinite/fb/infinite/test'] = + array('title' => 'Infinite session test', + 'page callback' => 'fb_infinite_test_page', + 'page arguments' => array(1), + 'access callback' => 'node_access', + 'access arguments' => array('update', 1), + 'type' => MENU_LOCAL_TASK, + ); + + return $items; +} + + +/** + * Implementation of hook_load to create custom loader for hook_menu + * Checks a fb_app nid to see if infinite session is configured + * + * see "Defining your own wildcard loader" - http://drupal.org/node/209056 + * passing $nid not needed if menu_get_object were to work + */ +function fb_infinite_load($nid) { + $fb_app = fb_get_app(array('nid' => $nid)); + if ($fb_app) { + // Only allow menu item if infinite session is configured. + $fb_app_data = fb_app_get_data($fb_app); + $fb_infinite_data = $fb_app_data['fb_infinite']; + if (isset($fb_infinite_data['key'])) { + return $fb_app; } } - return $items; } /** * Implementation of hook_form_alter. */ -function fb_infinite_form_alter($form_id, &$form) { - //drupal_set_message("fb_infinte_form_alter($form_id) " . dpr($form, 1)); +function fb_infinite_form_alter(&$form, &$form_state, $form_id) { + //drupal_set_message("fb_infinite_form_alter($form_id) " . dpr($form, 1)) . dpr($form_state, 1)); // Add our settings to the fb_app edit form. if (is_array($form['fb_app_data'])) { @@ -117,7 +126,7 @@ function fb_infinite_form_alter($form_id function fb_infinite_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { if ($node->type == 'fb_app') { - if ($op == 'submit') { + if ($op == 'presave') { $fb_app_data = $node->fb_app_data; $fb_infinite_data = $fb_app_data['fb_infinite']; @@ -162,14 +171,13 @@ function fb_infinite_display_page() { /** * Menu callback to test infinite session values. */ -function fb_infinite_test_page($nid) { +function fb_infinite_test_page($fb_app) { if ($GLOBALS['fb']) { $url = $GLOBALS['fb_old_base_url'] . "?q=".$_GET['q']; return t('Do not use this page from a canvas page. Try !link.', array('!link' => l($url, $url))); } - - $fb_app = fb_get_app(array('nid' => $nid)); + $fb = fb_api_init($fb_app, FB_FBU_INFINITE_SESSION); $fbu = $fb->api_client->users_getLoggedInUser(); if ($fbu) { @@ -183,20 +191,19 @@ function fb_infinite_test_page($nid) { 'status', )); $info = $info[0]; - $fb_link = l($info['name'], 'http://www.facebook.com/profile.php', NULL, 'id='.$info['uid']); + $fb_link = l($info['name'], 'http://www.facebook.com/profile.php', array('query' => 'id='.$info['uid'])); - drupal_set_message(t('Infinite session key is working.')); + drupal_set_message('Infinite session key is working.'); $output .= '

'.t('Facebook infinite session user: !user', array('!user' => $fb_link)) . '

'; $output .= '

'.t('This page cannot test that the session key will never expire. If your cron jobs start to fail, return here to test the login again.').'

'; return $output; } else { - drupal_set_message(t('Infinite session key test failed.'), 'error'); + drupal_set_message('Infinite session key test failed.', 'error'); // TODO: provide helpful hints of how to fix the problem. $output .= '

'.t('Unable to log into Facebook using infinite session key.').'

'; } return $output; } -?> \ No newline at end of file Index: fb_session.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb_session.inc,v retrieving revision 1.1 diff -u -u -p -r1.1 fb_session.inc --- fb_session.inc 7 Apr 2008 20:56:49 -0000 1.1 +++ fb_session.inc 29 Jul 2008 18:39:50 -0000 @@ -24,4 +24,4 @@ else { // Important: edit the path where includes/session.inc is included so // that it works for your system. -require_once('includes/session.inc'); \ No newline at end of file +require_once('./includes/session.inc'); \ No newline at end of file Index: fb_settings.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb_settings.inc,v retrieving revision 1.1 diff -u -u -p -r1.1 fb_settings.inc --- fb_settings.inc 7 Apr 2008 20:56:49 -0000 1.1 +++ fb_settings.inc 29 Jul 2008 18:39:50 -0000 @@ -4,6 +4,7 @@ define('FB_SETTINGS_APP_NID', 'fb_cb'); define('FB_SETTINGS_PAGE_TYPE', 'fb_cb_type'); +// NOTE: can't use variable_set() -- database.inc hasn't loaded yet, so db_query() in variable_set() fails if (!is_array($conf)) $conf = array(); @@ -44,20 +45,49 @@ if ($nid = _fb_settings_parse_nid()) } /** - * Implementation of conf_url_rewrite + * Implementation of conf_url_rewrite_inbound * * Defines the URL rewrite if not defined already. If it is defined already, - * or your using 118n modules, you should define a custom_url_rewrite in - * settings.php which calls fb_canvas_url_rewrite in addition to any others + * or your using 118n modules, you should define a custom_url_rewrite_inbound in + * settings.php which calls fb_canvas_url_rewrite_inbound in addition to any others * that need to be called. The order will be important! */ -if(!function_exists('custom_url_rewrite')) { - function custom_url_rewrite($type, $path, $original) { - return fb_settings_url_rewrite($type, $path, $original); +//TODO: this needs confirmation. +//custom_url_rewrite was dropped in 6.x so I split the 'source' portion of the old function +//into _inbound and the 'alias' portion into _outbound versions +//really guessing here, but it seems to be working +if(!function_exists('custom_url_rewrite_inbound')) { + function custom_url_rewrite_inbound(&$result, $path, $path_language) { + fb_settings_url_rewrite_inbound($result, $path, $path_language); } } +if(!function_exists('custom_url_rewrite_outbound')) { + function custom_url_rewrite_outbound(&$path, $options, $original_path) { + fb_settings_url_rewrite_outbound($path, $options, $original_path); + } +} + +//TODO: especially verify this one - not sure what to do with Absolute paths, if anything +//TODO: problem with _fb_canvas_make_form_action_local - is it caused by this? +//TODO: I don't think the fb_canvas_is_fbml() and fb_canvas_is_iframe() functions are returning the right values either +function fb_settings_url_rewrite_outbound(&$path, $options, $original_path) { + //dpm(func_get_args(), 'fb_settings_url_rewrite_outbound'); + if (function_exists('fb_canvas_is_fbml')) { + global $fb_app; + if (fb_canvas_is_fbml() || fb_canvas_handling_form()) { + //$path = $fb_app->canvas .'/'. $path; + } + if (fb_canvas_is_iframe()) { + //TODO: do something else? + //$path = $fb_app->canvas .'/'. $path; + } + + //var_dump(array($path => $options)); + } + return $path; +} /** * Rewrite URLs for facebook canvas pages. @@ -66,58 +96,52 @@ if(!function_exists('custom_url_rewrite' * set when serving canvas pages. However, it gets called before * modules are loaded. So it must live here. */ -function fb_settings_url_rewrite($type, $path, $original){ - //dpm(func_get_args(), 'fb_canvas_url_rewrite'); +function fb_settings_url_rewrite_inbound(&$result, $path, $path_language){ + //$origpath = $path; + //dpm(func_get_args(), 'fb_canvas_url_rewrite_inbound'); + //watchdog('fb_settings', "fb_settings_url_rewrite_inbound($result, $path, $path_language)", array(), WATCHDOG_DEBUG); $prefixes = array(FB_SETTINGS_APP_NID, FB_SETTINGS_PAGE_TYPE); - if ($type == 'source') { - // See if this is a request for us. - if (strpos($path, FB_SETTINGS_APP_NID . '/') === 0) { + + // See if this is a request for us. + if (strpos($path, FB_SETTINGS_APP_NID . '/') === 0) { // Too soon for arg() function. - $args = explode('/', $path); - while (count($args) && in_array($args[0], $prefixes)) { - $key = array_shift($args); - $value = array_shift($args); - fb_settings($key, $value); // Store for use later. + $args = explode('/', $path); + while (count($args) && in_array($args[0], $prefixes)) { + $key = array_shift($args); + $value = array_shift($args); + $app_nid = fb_settings($key, $value); // Store for use later. + } + if ($app_nid = fb_settings(FB_SETTINGS_APP_NID)) { + if (count($args)) { + $path = implode('/', $args); // remaining args + $alias = drupal_lookup_path('source', $path, $path_language); //can't use drupal_get_normal_path, it calls custom_url_rewrite_inbound + if ($alias) + $path = $alias; } - if ($app_nid = fb_settings(FB_SETTINGS_APP_NID)) { - if (count($args)) { - $path = implode('/', $args); // remaining args - $path = drupal_get_normal_path($path); - } - else - // frontpage - $path = drupal_get_normal_path(variable_get('site_frontpage', 'node')); + else { + // frontpage + $path = variable_get('site_frontpage', 'node'); + $alias = drupal_lookup_path('source', $path, $path_language); + if ($alias) + $path = $alias; + $_REQUEST['destination'] = $path; //required workaround for compatibility with Global Redirect module, best practice? } - } + } } - else if ($type == 'alias') { - if (function_exists('fb_canvas_is_fbml')) { - $pre = ''; - if (fb_canvas_is_iframe()) { - // Rewrite for iframes - foreach ($prefixes as $prefix) - if ($value = fb_settings($prefix)) - $pre .= $prefix . '/'. fb_settings($prefix) . '/'; - $path = $pre . $path; - } - else if (fb_canvas_is_fbml()) { - // Rewrite for FBML - //$path = $fb_app->canvas . '/' . $path; // old way - // For now, same as for iframes, but may be different one day - foreach ($prefixes as $prefix) - if ($value = fb_settings($prefix)) - $pre .= $prefix . '/'. fb_settings($prefix) . '/'; - $path = $pre . $path; - } - } + else { //resolve aliases for non-fb-callbacks + $alias = drupal_lookup_path('source', $path, $path_language); + if ($alias) + $path = $alias; } - return $path; + + $result = $path; } function fb_settings($key, $value = NULL) { static $cache = array(); if (isset($value)) $cache[$key] = $value; + return $cache[$key]; } @@ -127,14 +151,12 @@ function fb_settings($key, $value = NULL */ function _fb_settings_parse_nid() { if (isset($_GET['q'])) { - $path = $_GET['q']; - if (strpos($path, FB_SETTINGS_APP_NID . '/') === 0) { - // Too soon for arg() function. - $args = explode('/', $path); - return $args[1]; - } + $path = $_GET['q']; + if (strpos($path, FB_SETTINGS_APP_NID . '/') === 0) { + // Too soon for arg() function. + $args = explode('/', $path); + return $args[1]; + } } } - -?> \ No newline at end of file Index: fb_user.info =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb_user.info,v retrieving revision 1.1 diff -u -u -p -r1.1 fb_user.info --- fb_user.info 26 Sep 2007 17:08:21 -0000 1.1 +++ fb_user.info 29 Jul 2008 18:39:50 -0000 @@ -1,5 +1,8 @@ name=Facebook User Management description=User handling code. package = Facebook -dependencies = fb fb_app +dependencies[] = fb +dependencies[] = fb_app +core = 6.x +version = "6.x-1.x-dev" Index: fb_user.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb_user.install,v retrieving revision 1.3 diff -u -u -p -r1.3 fb_user.install --- fb_user.install 20 May 2008 05:37:52 -0000 1.3 +++ fb_user.install 29 Jul 2008 18:39:50 -0000 @@ -1,39 +1,38 @@ $db_type)), 'error'); - } - foreach ($query as $q) { - $status = db_query ($q); - if (!$status) { - drupal_set_message(t('Error installing fb_user: %error %query', - array('%query' => '
'.$q.'
', - '%error' => db_error())), - 'error'); - } - } + // Create tables. + drupal_install_schema('fb_user'); +} + + +/** + * Implementation of hook_uninstall(). + */ +function fb_user_uninstall() { + // Remove tables. + drupal_uninstall_schema('fb_user'); +} + + +function fb_user_schema() { + $schema['fb_user_app'] = + array('fields' => array('apikey' => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, ), + 'fbu' => array('type' => 'int', 'length' => 11, 'unsigned' => TRUE, 'not null' => TRUE, ), + 'uid' => array('type' => 'int', 'size' => 'normal', 'not null' => TRUE, ), + 'added' => array('type' => 'int', 'length' => 4, 'unsigned' => TRUE, 'not null' => TRUE, ), + 'time_cron' => array('type' => 'int', 'length' => 11, 'unsigned' => TRUE, 'not null' => TRUE, ), + 'time_access' => array('type' => 'int', 'length' => 11, 'unsigned' => TRUE, 'not null' => TRUE, ), + 'session_key' => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, ), + 'session_key_expires' => array('type' => 'int', 'length' => 11, 'unsigned' => TRUE, 'not null' => TRUE, ), + ), + 'primary key' => array('apikey', 'fbu'), + ); + return $schema; } function fb_user_update_1() { Index: fb_user.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/fb_user.module,v retrieving revision 1.17 diff -u -u -p -r1.17 fb_user.module --- fb_user.module 25 Jul 2008 19:15:29 -0000 1.17 +++ fb_user.module 29 Jul 2008 18:39:50 -0000 @@ -24,26 +24,22 @@ define('FB_USER_SYNC_PATH', 'fb_user/syn define('FB_USER_POST_ADD_PATH', 'fb_user/post_add'); define('FB_USER_POST_REMOVE_PATH', 'fb_user/post_remove'); -function fb_user_menu($may_cache) { - $items = array(); - if ($may_cache) { - global $user; - $items[] = array('path' => FB_USER_SYNC_PATH, - 'access' => TRUE, - 'callback' => 'fb_user_sync_cb', - 'type' => MENU_CALLBACK, - ); - $items[] = array('path' => FB_USER_POST_ADD_PATH, - 'access' => TRUE, - 'callback' => 'fb_user_post_add_cb', +function fb_user_menu() { + global $user; + $items[FB_USER_SYNC_PATH] = array('access callback' => TRUE, + 'page callback' => 'fb_user_sync_cb', + 'type' => MENU_CALLBACK, + ); + $items[FB_USER_POST_ADD_PATH] = array( + 'access callback' => TRUE, + 'page callback' => 'fb_user_post_add_cb', 'type' => MENU_CALLBACK, - ); - $items[] = array('path' => FB_USER_POST_REMOVE_PATH, - 'access' => TRUE, - 'callback' => 'fb_user_post_remove_cb', + ); + $items[FB_USER_POST_REMOVE_PATH] = array( + 'access callback' => TRUE, + 'page callback' => 'fb_user_post_remove_cb', 'type' => MENU_CALLBACK, - ); - } + ); return $items; } @@ -157,7 +153,7 @@ function fb_user_post_add_form() { } // And if the user's account is recognized, we can skip this. if ($user->uid && FALSE) { - drupal_goto(""); + drupal_goto(variable_get('site_frontpage', 'node')); //TODO: used to be "" - is this acceptable? exit(); } @@ -185,7 +181,7 @@ function fb_user_post_add_form() { $form['redirect']['frontpage'] = array('#type' => 'radio', '#title' => t('I will register later', $t), '#description' => t('Use this application without registering on %sitename.', $t), - '#return_value' => '', + '#return_value' => variable_get('site_frontpage', 'node'), //TODO: used to be "" - is this acceptable? '#parents' => $parents, ); $form['submit'] = array('#type' => 'submit', @@ -196,11 +192,11 @@ function fb_user_post_add_form() { return $form; } -function fb_user_post_add_form_submit($form_id, $values) { +function fb_user_post_add_form_submit($form, &$form_state) { //dpm(func_get_args(), 'fb_user_post_add_form_submit'); // Here we simply redirect the user to the appropriate page - return $values['redirect']; + return $form_state['values']['redirect']; } /** @@ -210,8 +206,7 @@ function fb_user_post_add_form_submit($f */ function fb_user_post_remove_cb() { global $fb, $fb_app, $user; - if (fb_verbose()) watchdog('debug', 'fb_user_post_remove_cb, session_id is ' . session_id() . ' session_name is ' . session_name() . dprint_r($_REQUEST, 1) . dprint_r($user, 1) . dprint_r($fb_app, 1)); - + watchdog('fb_user', 'fb_user_post_remove_cb'. dprint_r($_REQUEST, 1) . dprint_r($user, 1) . dprint_r($fb_app, 1), array(), WATCHDOG_DEBUG); // Update our database to reflect application is NOT added _fb_user_track($fb, $fb_app, $user); @@ -237,14 +232,14 @@ function _fb_user_sync_redirect($redirec // so better to generate our own. $key = uniqid('fb_user_'); - cache_set($key, 'cache', serialize($cache_data), CACHE_TEMPORARY); + cache_set($key, serialize($cache_data), 'cache', CACHE_TEMPORARY); // Note that drupal_goto will fail here, but $fb->redirect succeeds. - $url = fb_scrub_urls(url($redirect, 'sync_token='.$key, NULL, TRUE)); - - if (fb_verbose()) watchdog('fb_debug', "Redirecting to $url"); - - $fb->redirect($url); + $fb->redirect(url($redirect, array('query' => 'sync_token='.$key, + 'absolute' => TRUE, + ) + ) + ); exit(); } @@ -262,7 +257,7 @@ function fb_user_sync_cb() { // On canvas pages, require user to add the app... if ($fb) { if (fb_verbose() && function_exists('dprint_r')) - watchdog('debug', 'fb_user_sync_cb request ' . dprint_r($_REQUEST, 1)); + watchdog('fb_user', 'fb_user_sync_cb request '. dprint_r($_REQUEST, 1), array(), WATCHDOG_DEBUG); $fb->require_add(); @@ -290,13 +285,22 @@ function fb_user_sync_cb() { drupal_access_denied(); exit(); } - watchdog('debug', 'got the data ' . dprint_r($data, 1)); + watchdog('fb_user', 'got the data '. dprint_r($data, 1), array(), WATCHDOG_DEBUG); $fbu = $data['fbu']; $fb_app = $data['fb_app']; drupal_set_title(t('Added %appname Application', array('%appname' => $fb_app->title))); if ($fbu && $fb_app) { - list ($module, $authname) = _fb_user_authmap($fb_app, $fbu); + $authname = _fb_user_authname($fb_app, $fbu); + watchdog('fb_user', 'Syncing local user %uid with facebook user %fbu via authmap entry %authname', + array('%fbu' => $fbu, + '%uid' => $user->uid, + '%authname' => $authname)); + user_set_authmaps($user, array('authname_fb_user' => $authname)); + watchdog('fb_user', 'Synced local user %uid with facebook user %fbu via authmap entry %authname', + array('%fbu' => $fbu, + '%uid' => $user->uid, + '%authname' => $authname)); // Check if the authname is already in use. $account = user_external_load($authname); @@ -322,7 +326,7 @@ function fb_user_sync_cb() { drupal_set_message(t('Your local account is linked to your Facebook profile.', array('!localurl' => url('user/'.$user->uid), - '!facebookurl' => url('http://www.facebook.com/profile.php', 'id='.$fbu)))); + '!facebookurl' => url('http://www.facebook.com/profile.php', array('query' => 'id='. $fbu))))); // Give the user feedback that the sync has been successful. // Query facebook to learn more about their facebook account. @@ -549,9 +553,8 @@ function fb_user_nodeapi(&$node, $op, $a $fb_app = $node->fb_app; $add_url = fb_user_get_map_url($fb_app); $output = theme('dl', array(t('Post-add URL') => "http://apps.facebook.com/{$fb_app->canvas}/".FB_USER_POST_ADD_PATH."?redirect=", - t('Post-remove URL') => url(FB_SETTINGS_APP_NID .'/'. $node->nid . '/' . FB_USER_POST_REMOVE_PATH, NULL, NULL, TRUE), - t('Add URL') => $add_url ? $add_url . '
' . t('(Send an authenticated user to this URL so that local account will be authmapped to facebook account.)') : t('none'), - )); + t('Post-remove URL') => url(FB_SETTINGS_APP_NID .'/'. $node->nid .'/'. FB_USER_POST_REMOVE_PATH, array('absolute' => TRUE)), + t('Add URL') => "http://apps.facebook.com/{$fb_app->canvas}/".FB_USER_SYNC_PATH . '
' . t('(Send an authenticated user to this URL so that local account will be authmapped to facebook account.)'))); $node->content['fb_user'] = array('#value' => $output, '#weight' => 2, ); @@ -559,7 +562,7 @@ function fb_user_nodeapi(&$node, $op, $a } } -function fb_user_form_alter($form_id, &$form) { +function fb_user_form_alter(&$form, &$form_state, $form_id) { //drupal_set_message("fb_user_form_alter($form_id) " . dpr($form, 1)); // Add our settings to the fb_app edit form. @@ -788,6 +791,14 @@ function fb_user_user($op, &$edit, &$acc } } +function fb_user_theme() { + return array( + 'fb_app_name_with_links' => array( + 'arguments' => array('fb_app', 'is_added' => NULL), + ), + ); +} + function theme_fb_app_name_with_links($fb_app, $is_added = NULL) { $output = $fb_app->title; // TODO add link to about page @@ -885,7 +896,7 @@ function fb_user_create_local_user($fb, $account = user_save('', $user_default); - watchdog('fb_user', t('New user: %name %email.', array('%name' => $name, '%email' => '<'. $mail .'>')), WATCHDOG_NOTICE, l(t('edit'), 'user/'. $account->uid .'/edit')); + watchdog('fb_user', 'New user: %name %email.', array('%name' => $name, '%email' => '<'. $mail .'>'), WATCHDOG_NOTICE, l(t('edit'), 'user/'. $account->uid .'/edit')); // Allow third-party modules to act after account creation. $config = _fb_invoke($fb_app, FB_OP_POST_USER, @@ -894,8 +905,8 @@ function fb_user_create_local_user($fb, // TODO: move this to fb_action. Temporarily disabled. if (FALSE) { // Prepare to send an email. - $base = url('', NULL, NULL, TRUE); - $variables = array('!username' => $account->name, '!site' => variable_get('site_name', 'Drupal'), '!password' => $user_default['pass'], '!uri' => $base, '!uri_brief' => substr($base, strlen('http://')), '!mailto' => $mail, '!date' => format_date(time()), '!login_uri' => url('user', NULL, NULL, TRUE), '!edit_uri' => url('user/'. $account->uid .'/edit', NULL, NULL, TRUE), '!login_url' => user_pass_reset_url($account)); + $base = url('', array('absolute' => TRUE)); + $variables = array('!username' => $account->name, '!site' => variable_get('site_name', 'Drupal'), '!password' => $user_default['pass'], '!uri' => $base, '!uri_brief' => substr($base, strlen('http://')), '!mailto' => $mail, '!date' => format_date(time()), '!login_uri' => url('user', array('absolute' => TRUE)), '!edit_uri' => url('user/'. $account->uid .'/edit', array('absolute' => TRUE)), '!login_url' => user_pass_reset_url($account)); $subject = _user_mail_text('welcome_subject', $variables); $body = _user_mail_text('welcome_body', $variables); @@ -923,7 +934,7 @@ function fb_user_create_local_user($fb, */ function fb_user_get_local_user($fbu, $fb_app) { // TODO: this query probably needs to search for one authname or the other, not both. - $result = db_query("SELECT am.* FROM authmap am WHERE am.authname='%s' OR am.authname='%s' ORDER BY am.authname", + $result = db_query("SELECT am.* FROM {authmap} am WHERE am.authname='%s' OR am.authname='%s' ORDER BY am.authname", "$fbu-$fb_app->apikey@facebook.com", "$fbu@facebook.com"); if ($data = db_fetch_object($result)) { $account = user_load(array('uid' => $data->uid)); @@ -1026,5 +1037,3 @@ function fb_user_token_values($type = 'a return $values; } - -?> \ No newline at end of file Index: themes/fb_fbml/fb_fbml.info =================================================================== RCS file: themes/fb_fbml/fb_fbml.info diff -N themes/fb_fbml/fb_fbml.info --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ themes/fb_fbml/fb_fbml.info 29 Jul 2008 18:39:50 -0000 @@ -0,0 +1,11 @@ +name = fb_fbml +description = Use on Facebook FBML canvas pages only. +core = 6.x +engine = phptemplate + +regions[admin] = Admin sidebar +regions[header] = Canvas Header +regions[right] = Canvas Right +regions[content_footer] = Content Footer +regions[canvas_footer] = Canvas Footer + Index: themes/fb_fbml/page.tpl.php =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/themes/fb_fbml/page.tpl.php,v retrieving revision 1.6 diff -u -u -p -r1.6 page.tpl.php --- themes/fb_fbml/page.tpl.php 10 Jul 2008 06:38:21 -0000 1.6 +++ themes/fb_fbml/page.tpl.php 29 Jul 2008 18:39:50 -0000 @@ -56,9 +56,9 @@ - + Index: themes/fb_fbml/styles.tpl.php =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/fb/themes/fb_fbml/styles.tpl.php,v retrieving revision 1.8 diff -u -u -p -r1.8 styles.tpl.php --- themes/fb_fbml/styles.tpl.php 20 May 2008 05:39:31 -0000 1.8 +++ themes/fb_fbml/styles.tpl.php 29 Jul 2008 18:39:50 -0000 @@ -1,4 +1,3 @@ -