Index: system/system.install =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.install,v retrieving revision 1.88 diff -u -r1.88 system.install --- system/system.install 30 Mar 2007 08:47:58 -0000 1.88 +++ system/system.install 6 Apr 2007 12:10:44 -0000 @@ -559,6 +559,7 @@ login int NOT NULL default '0', status tinyint NOT NULL default '0', timezone varchar(8) default NULL, + zonename varchar(50) default NULL, language varchar(12) NOT NULL default '', picture varchar(255) NOT NULL DEFAULT '', init varchar(64) default '', @@ -1045,6 +1046,7 @@ login int NOT NULL default '0', status smallint NOT NULL default '0', timezone varchar(8) default NULL, + zonename varchar(50) default NULL, language varchar(12) NOT NULL default '', picture varchar(255) NOT NULL DEFAULT '', init varchar(64) default '', @@ -3724,6 +3726,23 @@ } /** + * Add timezone name column to users table. + */ +function system_update_2007() { + $ret = array(); + switch ($GLOBALS['db_type']) { + case 'pgsql': + db_add_column($ret, 'users', 'zonename', 'varchar(50)', array('not null' => FALSE)); + break; + case 'mysql': + case 'mysqli': + $ret[] = update_sql("ALTER TABLE {users} ADD zonename varchar(50) NULL"); + break; + } + return $ret; +} + +/** * @} End of "defgroup updates-5.0-to-x.x" * The next series of updates should start at 3000. */ Index: system/system.module =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.module,v retrieving revision 1.461 diff -u -r1.461 system.module --- system/system.module 6 Apr 2007 04:39:51 -0000 1.461 +++ system/system.module 6 Apr 2007 12:08:35 -0000 @@ -307,6 +307,14 @@ drupal_add_css(drupal_get_path('module', 'system') .'/system.css', 'module'); } +function system_cron() { + if (drupal_handle_timezones() && variable_get('date_timezone_next_update', 0) <= time()) { + system_timezone_update_site(); + system_timezone_update_user(); + variable_set('date_timezone_next_update', time() + 86400); + } +} + /** * Implementation of hook_user(). * @@ -317,23 +325,36 @@ $form['theme_select'] = system_theme_select_form(t('Selecting a different theme will change the look and feel of the site.'), isset($edit['theme']) ? $edit['theme'] : NULL, 2); if (variable_get('configurable_timezones', 1)) { - $zones = _system_zonelist(); $form['timezone'] = array( '#type'=>'fieldset', '#title' => t('Locale settings'), '#weight' => 6, '#collapsible' => TRUE, ); - $form['timezone']['timezone'] = array( - '#type' => 'select', - '#title' => t('Time zone'), - '#default_value' => strlen($edit['timezone']) ? $edit['timezone'] : variable_get('date_default_timezone', 0), - '#options' => $zones, - '#description' => t('Select your current local time. Dates and times throughout this site will be displayed using this time zone.'), - ); + if (drupal_handle_timezones()) { + $form['timezone']['zonename'] = array( + '#type' => 'select', + '#title' => t('Time zone'), + '#default_value' => strlen($edit['zonename']) ? $edit['zonename'] : variable_get('date_default_zonename', 'GMT'), + '#options' => system_zonenames(), + '#description' => t('Select your current local time zone. Dates and times throughout this site will be displayed using this time zone.'), + ); + } + else { + $form['timezone']['timezone'] = array( + '#type' => 'select', + '#title' => t('Time zone'), + '#default_value' => strlen($edit['timezone']) ? $edit['timezone'] : variable_get('date_default_timezone', 0), + '#options' => _system_zonelist(), + '#description' => t('Select your current local time. Dates and times throughout this site will be displayed using this time zone.'), + ); + } } - return $form; + + } + elseif ($type == 'submit' && drupal_handle_timezones()) { + system_timezone_update_user($user->uid, $edit['zonename']); } } @@ -515,6 +536,11 @@ return $output; } +function drupal_handle_timezones() { + // This may need more than just a version comparison. Some libraries might be missing even in the right version. + return version_compare(PHP_VERSION, '5.1', '>='); +} + function _system_zonelist() { $timestamp = time(); $zonelist = array(-11, -10, -9.5, -9, -8, -7, -6, -5, -4, -3.5, -3, -2, -1, 0, 1, 2, 3, 3.5, 4, 5, 5.5, 5.75, 6, 6.5, 7, 8, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.75, 13, 14); @@ -526,6 +552,47 @@ return $zones; } +function system_zonenames() { + if (drupal_handle_timezones()) { + return drupal_map_assoc(DateTimeZone::listIdentifiers()); + } +} + +function system_timezone_update_site($zonename = '') { + if (drupal_handle_timezones()) { + if (!empty($zonename)) { + variable_set('date_default_zonename', $zonename); + } + else { + $zonename = variable_get('date_default_zonename', 'GMT'); + } + $dateTimeZone = new DateTimeZone($zonename); + $dateTime = new DateTime("now", $dateTimeZone); + variable_set('date_default_timezone', $dateTimeZone->getOffset($dateTime)); + // Do we want to do date_default_timezone_set()? This will make all php date functions use this timezone + // which may affect logs and statistics. See http://us3.php.net/manual/en/function.date-default-timezone-set.php. + date_default_timezone_set($zonename); + } +} + +function system_timezone_update_user($uid = 0, $zonename = '') { + if (drupal_handle_timezones()) { + if (!empty($uid) && !empty($zonename)) { + $dateTimeZone = new DateTimeZone($zonename); + $dateTime = new DateTime("now", $dateTimeZone); + db_query("UPDATE {users} SET zonename = '%s', timezone = '%s' WHERE uid = %d", $zonename, $dateTimeZone->getOffset($dateTime), $uid); + } + else { + $result = db_query("SELECT DISTINCT zonename FROM {users}"); + while ($row = db_fetch_array($result)) { + $dateTimeZone = new DateTimeZone($row['zonename']); + $dateTime = new DateTime("now", $dateTimeZone); + db_query("UPDATE {users} SET timezone = '%s' WHERE zonename = '%s'", $dateTimeZone->getOffset($dateTime), $row['zonename']); + } + } + } +} + function system_site_information_settings() { $form['site_name'] = array( '#type' => 'textfield', @@ -781,7 +848,6 @@ function system_date_time_settings() { // Date settings: - $zones = _system_zonelist(); // Date settings: possible date formats $dateshort = array('Y-m-d H:i', 'm/d/Y - H:i', 'd/m/Y - H:i', 'Y/m/d - H:i', @@ -806,13 +872,33 @@ $datelongchoices[$f] = format_date(time(), 'custom', $f); } - $form['date_default_timezone'] = array( - '#type' => 'select', - '#title' => t('Default time zone'), - '#default_value' => variable_get('date_default_timezone', 0), - '#options' => $zones, - '#description' => t('Select the default site time zone.') - ); + if (drupal_handle_timezones()) { + $form['date_default_timezone'] = array( + '#type' => 'hidden', + '#value' => variable_get('date_default_timezone', 0), + ); + $form['date_default_zonename'] = array( + '#type' => 'select', + '#title' => t('Default time zone'), + '#default_value' => variable_get('date_default_zonename', 'GMT'), + '#options' => system_zonenames(), + '#description' => t('Select the default site time zone.'), + '#submit' => array('system_timezone_update_site' => array('date_default_zonename')), + ); + } + else { + $form['date_default_zonename'] = array( + '#type' => 'hidden', + '#value' => variable_get('date_default_zonename', 'GMT'), + ); + $form['date_default_timezone'] = array( + '#type' => 'select', + '#title' => t('Default time zone'), + '#default_value' => variable_get('date_default_timezone', 0), + '#options' => _system_zonelist(), + '#description' => t('Select the default site time zone.'), + ); + } $form['configurable_timezones'] = array( '#type' => 'radios', @@ -2397,4 +2483,4 @@ $output .= ''; return $output; -} +} \ No newline at end of file Index: user/user.module =================================================================== RCS file: /cvs/drupal/drupal/modules/user/user.module,v retrieving revision 1.763 diff -u -r1.763 user.module --- user/user.module 30 Mar 2007 07:45:19 -0000 1.763 +++ user/user.module 6 Apr 2007 11:00:44 -0000 @@ -398,7 +398,7 @@ } else { // Make sure we return the default fields at least - $fields = array('uid', 'name', 'pass', 'mail', 'picture', 'mode', 'sort', 'threshold', 'theme', 'signature', 'created', 'access', 'login', 'status', 'timezone', 'language', 'init', 'data'); + $fields = array('uid', 'name', 'pass', 'mail', 'picture', 'mode', 'sort', 'threshold', 'theme', 'signature', 'created', 'access', 'login', 'status', 'timezone', 'zonename', 'language', 'init', 'data'); } }