Hi,
I'm writing a custom module that needs to add an #after_build callback to the user profile form. But my callback is never executed because Date Timezone overrides the '#after_build' attribute in the $form structure in date_timezone_form_alter().
This function is pretty simple, and looks like this:
function date_timezone_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'system_date_time_settings') {
date_timezone_site_form($form);
$form['#after_build'] = array('date_timezone_site_form_after_build');
}
elseif ($form_id == 'user_profile_form' && variable_get('configurable_timezones', 1) && isset($form['timezone'])) {
date_timezone_user_form($form);
$form['#after_build'] = array('date_timezone_user_form_after_build');
}
}
To work well with other modules, it should look something like this:
function date_timezone_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'system_date_time_settings') {
date_timezone_site_form($form);
if (!isset($form['#after_build'])) {
$form['#after_build'] = array();
}
$form['#after_build'][] = 'date_timezone_site_form_after_build';
}
elseif ($form_id == 'user_profile_form' && variable_get('configurable_timezones', 1) && isset($form['timezone'])) {
date_timezone_user_form($form);
if (!isset($form['#after_build'])) {
$form['#after_build'] = array();
}
$form['#after_build'][] = 'date_timezone_user_form_after_build';
}
}
Otherwise Date Timezone's behavior short-circuits any attempt to add an after_build callback from other modules that execute before Date Timezone.
The fix is trivial, so I'm setting this issue to 'needs review'. Please, let me know it you rather prefer a formal patch.
Thanks!
Comments
Comment #1
markus_petrux commentedThe patch to
date_timezone.modulewould look like this:This is IMHO critical because it breaks other modules. :(
Comment #2
karens commentedTrue. I was so excited about finding a way around the way that Event module did this (Date and Event were dueling over this before), that I didn't think about other modules jumping in too.
Comment #4
devd commentedPlease note that the timezone_identifiers_list function is not available in the most recent versions of PHP available for CentOS/RHEL as of this writing ( 5.1.6-23.2.el5_3 ).
Use the following code in the file date/date_api.module
function date_timezone_names($required = FALSE, $refresh = FALSE) {
static $zonenames;
if (empty($zonenames) || $refresh) {
$cached = cache_get('date_timezone_identifiers_list');
$zonenames = !empty($cached) ? $cached->data : array();
if ($refresh || empty($cached) || empty($zonenames)) {
- $data = timezone_identifiers_list();
+ $data = custom_timezone_list();
asort($data);
// Use include instead of include once in case the function gets
// refreshed via devel or other API and is called more than once.
if (module_exists('date_php4')) {
include('./'. drupal_get_path('module', 'date_php4') .'/date_php4_missing_data.inc');
}
foreach ($data as $delta => $zone) {
// Because many time zones exist in PHP only for backward
// compatibility reasons and should not be used, the list is
// filtered by a regular expression.
if (preg_match('!^((Africa|America|Antarctica|Arctic|Asia|Atlantic|Australia|Europe|Indian|Pacific)/|UTC$)!', $zone)) {
$zonenames[$zone] = $zone;
}
}
// If using PHP4, filter the list down to only the timezones
// the PHP4 wrapper has data for.
if (module_exists('date_php4')) {
foreach ($missing_timezone_data as $zone) {
unset($zonenames[$zone]);
}
}
// If using Event, further filter the list down to only
// zones that exist in the event module.
if (module_exists('event') && db_table_exists('event_timezones')) {
$result = db_query("SELECT name FROM {event_timezones} ORDER BY name");
$names = array();
while ($row = db_fetch_array($result)) {
$names[] = str_replace(' ', '_', $row['name']);
}
foreach ($zonenames as $name => $zone) {
if (!in_array($name, $names)) {
unset($zonenames[$name]);
}
}
}
if (!empty($zonenames)) {
cache_set('date_timezone_identifiers_list', $zonenames);
}
}
foreach ($zonenames as $zone) {
$zonenames[$zone] = t('!timezone', array('!timezone' => $zone));
}
}
$none = array('' => '');
return !$required ? $none + $zonenames : $zonenames;
}
function custom_timezone_list(){
return array('0' => 'Africa/Abidjan', '1' => 'Africa/Accra', '2' => 'Africa/Addis_Ababa', '3' => 'Africa/Algiers', '4' => 'Africa/Asmara', '5' => 'Africa/Bamako', '6' => 'Africa/Bangui', '7' => 'Africa/Banjul', '8' => 'Africa/Bissau', '9' => 'Africa/Blantyre', '10' => 'Africa/Brazzaville', '11' => 'Africa/Bujumbura', '12' => 'Africa/Cairo', '13' => 'Africa/Casablanca', '14' => 'Africa/Ceuta', '15' => 'Africa/Conakry', '16' => 'Africa/Dakar', '17' => 'Africa/Dar_es_Salaam', '18' => 'Africa/Djibouti', '19' => 'Africa/Douala', '20' => 'Africa/El_Aaiun', '21' => 'Africa/Freetown', '22' => 'Africa/Gaborone', '23' => 'Africa/Harare', '24' => 'Africa/Johannesburg', '25' => 'Africa/Kampala', '26' => 'Africa/Khartoum', '27' => 'Africa/Kigali', '28' => 'Africa/Kinshasa', '29' => 'Africa/Lagos', '30' => 'Africa/Libreville', '31' => 'Africa/Lome', '32' => 'Africa/Luanda', '33' => 'Africa/Lubumbashi', '34' => 'Africa/Lusaka', '35' => 'Africa/Malabo', '36' => 'Africa/Maputo', '37' => 'Africa/Maseru', '38' => 'Africa/Mbabane', '39' => 'Africa/Mogadishu', '40' => 'Africa/Monrovia', '41' => 'Africa/Nairobi', '42' => 'Africa/Ndjamena', '43' => 'Africa/Niamey', '44' => 'Africa/Nouakchott', '45' => 'Africa/Ouagadougou', '46' => 'Africa/Porto-Novo', '47' => 'Africa/Sao_Tome', '48' => 'Africa/Tripoli', '49' => 'Africa/Tunis', '50' => 'Africa/Windhoek', '51' => 'America/Adak', '52' => 'America/Anchorage', '53' => 'America/Anguilla', '54' => 'America/Antigua', '55' => 'America/Araguaina', '56' => 'America/Argentina/Buenos_Aires', '57' => 'America/Argentina/Catamarca', '58' => 'America/Argentina/Cordoba', '59' => 'America/Argentina/Jujuy', '60' => 'America/Argentina/La_Rioja', '61' => 'America/Argentina/Mendoza', '62' => 'America/Argentina/Rio_Gallegos', '63' => 'America/Argentina/Salta', '64' => 'America/Argentina/San_Juan', '65' => 'America/Argentina/San_Luis', '66' => 'America/Argentina/Tucuman', '67' => 'America/Argentina/Ushuaia', '68' => 'America/Aruba', '69' => 'America/Asuncion', '70' => 'America/Atikokan', '71' => 'America/Bahia', '72' => 'America/Barbados', '73' => 'America/Belem', '74' => 'America/Belize', '75' => 'America/Blanc-Sablon', '76' => 'America/Boa_Vista', '77' => 'America/Bogota', '78' => 'America/Boise', '79' => 'America/Cambridge_Bay', '80' => 'America/Campo_Grande', '81' => 'America/Cancun', '82' => 'America/Caracas', '83' => 'America/Cayenne', '84' => 'America/Cayman', '85' => 'America/Chicago', '86' => 'America/Chihuahua', '87' => 'America/Costa_Rica', '88' => 'America/Cuiaba', '89' => 'America/Curacao', '90' => 'America/Danmarkshavn', '91' => 'America/Dawson', '92' => 'America/Dawson_Creek', '93' => 'America/Denver', '94' => 'America/Detroit', '95' => 'America/Dominica', '96' => 'America/Edmonton', '97' => 'America/Eirunepe', '98' => 'America/El_Salvador', '99' => 'America/Fortaleza', '100' => 'America/Glace_Bay', '101' => 'America/Godthab', '102' => 'America/Goose_Bay', '103' => 'America/Grand_Turk', '104' => 'America/Grenada', '105' => 'America/Guadeloupe', '106' => 'America/Guatemala', '107' => 'America/Guayaquil', '108' => 'America/Guyana', '109' => 'America/Halifax', '110' => 'America/Havana', '111' => 'America/Hermosillo', '112' => 'America/Indiana/Indianapolis', '113' => 'America/Indiana/Knox', '114' => 'America/Indiana/Marengo', '115' => 'America/Indiana/Petersburg', '116' => 'America/Indiana/Tell_City', '117' => 'America/Indiana/Vevay', '118' => 'America/Indiana/Vincennes', '119' => 'America/Indiana/Winamac', '120' => 'America/Inuvik', '121' => 'America/Iqaluit', '122' => 'America/Jamaica', '123' => 'America/Juneau', '124' => 'America/Kentucky/Louisville', '125' => 'America/Kentucky/Monticello', '126' => 'America/La_Paz', '127' => 'America/Lima', '128' => 'America/Los_Angeles', '129' => 'America/Maceio', '130' => 'America/Managua', '131' => 'America/Manaus', '132' => 'America/Marigot', '133' => 'America/Martinique', '134' => 'America/Mazatlan', '135' => 'America/Menominee', '136' => 'America/Merida', '137' => 'America/Mexico_City', '138' => 'America/Miquelon', '139' => 'America/Moncton', '140' => 'America/Monterrey', '141' => 'America/Montevideo', '142' => 'America/Montreal', '143' => 'America/Montserrat', '144' => 'America/Nassau', '145' => 'America/New_York', '146' => 'America/Nipigon', '147' => 'America/Nome', '148' => 'America/Noronha', '149' => 'America/North_Dakota/Center', '150' => 'America/North_Dakota/New_Salem', '151' => 'America/Panama', '152' => 'America/Pangnirtung', '153' => 'America/Paramaribo', '154' => 'America/Phoenix', '155' => 'America/Port-au-Prince', '156' => 'America/Port_of_Spain', '157' => 'America/Porto_Velho', '158' => 'America/Puerto_Rico', '159' => 'America/Rainy_River', '160' => 'America/Rankin_Inlet', '161' => 'America/Recife', '162' => 'America/Regina', '163' => 'America/Resolute', '164' => 'America/Rio_Branco', '165' => 'America/Santarem', '166' => 'America/Santiago', '167' => 'America/Santo_Domingo', '168' => 'America/Sao_Paulo', '169' => 'America/Scoresbysund', '170' => 'America/Shiprock', '171' => 'America/St_Barthelemy', '172' => 'America/St_Johns', '173' => 'America/St_Kitts', '174' => 'America/St_Lucia', '175' => 'America/St_Thomas', '176' => 'America/St_Vincent', '177' => 'America/Swift_Current', '178' => 'America/Tegucigalpa', '179' => 'America/Thule', '180' => 'America/Thunder_Bay', '181' => 'America/Tijuana', '182' => 'America/Toronto', '183' => 'America/Tortola', '184' => 'America/Vancouver', '185' => 'America/Whitehorse', '186' => 'America/Winnipeg', '187' => 'America/Yakutat', '188' => 'America/Yellowknife', '189' => 'Antarctica/Casey', '190' => 'Antarctica/Davis', '191' => 'Antarctica/DumontDUrville', '192' => 'Antarctica/Mawson', '193' => 'Antarctica/McMurdo', '194' => 'Antarctica/Palmer', '195' => 'Antarctica/Rothera', '196' => 'Antarctica/South_Pole', '197' => 'Antarctica/Syowa', '198' => 'Antarctica/Vostok', '199' => 'Arctic/Longyearbyen', '200' => 'Asia/Aden', '201' => 'Asia/Almaty', '202' => 'Asia/Amman', '203' => 'Asia/Anadyr', '204' => 'Asia/Aqtau', '205' => 'Asia/Aqtobe', '206' => 'Asia/Ashgabat', '207' => 'Asia/Baghdad', '208' => 'Asia/Bahrain', '209' => 'Asia/Baku', '210' => 'Asia/Bangkok', '211' => 'Asia/Beirut', '212' => 'Asia/Bishkek', '213' => 'Asia/Brunei', '214' => 'Asia/Choibalsan', '215' => 'Asia/Chongqing', '216' => 'Asia/Colombo', '217' => 'Asia/Damascus', '218' => 'Asia/Dhaka', '219' => 'Asia/Dili', '220' => 'Asia/Dubai', '221' => 'Asia/Dushanbe', '222' => 'Asia/Gaza', '223' => 'Asia/Harbin', '224' => 'Asia/Ho_Chi_Minh', '225' => 'Asia/Hong_Kong', '226' => 'Asia/Hovd', '227' => 'Asia/Irkutsk', '228' => 'Asia/Jakarta', '229' => 'Asia/Jayapura', '230' => 'Asia/Jerusalem', '231' => 'Asia/Kabul', '232' => 'Asia/Kamchatka', '233' => 'Asia/Karachi', '234' => 'Asia/Kashgar', '235' => 'Asia/Kathmandu', '236' => 'Asia/Kolkata', '237' => 'Asia/Krasnoyarsk', '238' => 'Asia/Kuala_Lumpur', '239' => 'Asia/Kuching', '240' => 'Asia/Kuwait', '241' => 'Asia/Macau', '242' => 'Asia/Magadan', '243' => 'Asia/Makassar', '244' => 'Asia/Manila', '245' => 'Asia/Muscat', '246' => 'Asia/Nicosia', '247' => 'Asia/Novokuznetsk', '248' => 'Asia/Novosibirsk', '249' => 'Asia/Omsk', '250' => 'Asia/Oral', '251' => 'Asia/Phnom_Penh', '252' => 'Asia/Pontianak', '253' => 'Asia/Pyongyang', '254' => 'Asia/Qatar', '255' => 'Asia/Qyzylorda', '256' => 'Asia/Rangoon', '257' => 'Asia/Riyadh', '258' => 'Asia/Sakhalin', '259' => 'Asia/Samarkand', '260' => 'Asia/Seoul', '261' => 'Asia/Shanghai', '262' => 'Asia/Singapore', '263' => 'Asia/Taipei', '264' => 'Asia/Tashkent', '265' => 'Asia/Tbilisi', '266' => 'Asia/Tehran', '267' => 'Asia/Thimphu', '268' => 'Asia/Tokyo', '269' => 'Asia/Ulaanbaatar', '270' => 'Asia/Urumqi', '271' => 'Asia/Vientiane', '272' => 'Asia/Vladivostok', '273' => 'Asia/Yakutsk', '274' => 'Asia/Yekaterinburg', '275' => 'Asia/Yerevan', '276' => 'Atlantic/Azores', '277' => 'Atlantic/Bermuda', '278' => 'Atlantic/Canary', '279' => 'Atlantic/Cape_Verde', '280' => 'Atlantic/Faroe', '281' => 'Atlantic/Madeira', '282' => 'Atlantic/Reykjavik', '283' => 'Atlantic/South_Georgia', '284' => 'Atlantic/St_Helena', '285' => 'Atlantic/Stanley', '286' => 'Australia/Adelaide', '287' => 'Australia/Brisbane', '288' => 'Australia/Broken_Hill', '289' => 'Australia/Currie', '290' => 'Australia/Darwin', '291' => 'Australia/Eucla', '292' => 'Australia/Hobart', '293' => 'Australia/Lindeman', '294' => 'Australia/Lord_Howe', '295' => 'Australia/Melbourne', '296' => 'Australia/Perth', '297' => 'Australia/Sydney', '298' => 'Europe/Amsterdam', '299' => 'Europe/Andorra', '300' => 'Europe/Athens', '301' => 'Europe/Belgrade', '302' => 'Europe/Berlin', '303' => 'Europe/Bratislava', '304' => 'Europe/Brussels', '305' => 'Europe/Bucharest', '306' => 'Europe/Budapest', '307' => 'Europe/Chisinau', '308' => 'Europe/Copenhagen', '309' => 'Europe/Dublin', '310' => 'Europe/Gibraltar', '311' => 'Europe/Guernsey', '312' => 'Europe/Helsinki', '313' => 'Europe/Isle_of_Man', '314' => 'Europe/Istanbul', '315' => 'Europe/Jersey', '316' => 'Europe/Kaliningrad', '317' => 'Europe/Kiev', '318' => 'Europe/Lisbon', '319' => 'Europe/Ljubljana', '320' => 'Europe/London', '321' => 'Europe/Luxembourg', '322' => 'Europe/Madrid', '323' => 'Europe/Malta', '324' => 'Europe/Mariehamn', '325' => 'Europe/Minsk', '326' => 'Europe/Monaco', '327' => 'Europe/Moscow', '328' => 'Europe/Oslo', '329' => 'Europe/Paris', '330' => 'Europe/Podgorica', '331' => 'Europe/Prague', '332' => 'Europe/Riga', '333' => 'Europe/Rome', '334' => 'Europe/Samara', '335' => 'Europe/San_Marino', '336' => 'Europe/Sarajevo', '337' => 'Europe/Simferopol', '338' => 'Europe/Skopje', '339' => 'Europe/Sofia', '340' => 'Europe/Stockholm', '341' => 'Europe/Tallinn', '342' => 'Europe/Tirane', '343' => 'Europe/Uzhgorod', '344' => 'Europe/Vaduz', '345' => 'Europe/Vatican', '346' => 'Europe/Vienna', '347' => 'Europe/Vilnius', '348' => 'Europe/Volgograd', '349' => 'Europe/Warsaw', '350' => 'Europe/Zagreb', '351' => 'Europe/Zaporozhye', '352' => 'Europe/Zurich', '353' => 'Indian/Antananarivo', '354' => 'Indian/Chagos', '355' => 'Indian/Christmas', '356' => 'Indian/Cocos', '357' => 'Indian/Comoro', '358' => 'Indian/Kerguelen', '359' => 'Indian/Mahe', '360' => 'Indian/Maldives', '361' => 'Indian/Mauritius', '362' => 'Indian/Mayotte', '363' => 'Indian/Reunion', '364' => 'Pacific/Apia', '365' => 'Pacific/Auckland', '366' => 'Pacific/Chatham', '367' => 'Pacific/Easter', '368' => 'Pacific/Efate', '369' => 'Pacific/Enderbury', '370' => 'Pacific/Fakaofo', '371' => 'Pacific/Fiji', '372' => 'Pacific/Funafuti', '373' => 'Pacific/Galapagos', '374' => 'Pacific/Gambier', '375' => 'Pacific/Guadalcanal', '376' => 'Pacific/Guam', '377' => 'Pacific/Honolulu', '378' => 'Pacific/Johnston', '379' => 'Pacific/Kiritimati', '380' => 'Pacific/Kosrae', '381' => 'Pacific/Kwajalein', '382' => 'Pacific/Majuro', '383' => 'Pacific/Marquesas', '384' => 'Pacific/Midway', '385' => 'Pacific/Nauru', '386' => 'Pacific/Niue', '387' => 'Pacific/Norfolk', '388' => 'Pacific/Noumea', '389' => 'Pacific/Pago_Pago', '390' => 'Pacific/Palau', '391' => 'Pacific/Pitcairn', '392' => 'Pacific/Ponape', '393' => 'Pacific/Port_Moresby', '394' => 'Pacific/Rarotonga', '395' => 'Pacific/Saipan', '396' => 'Pacific/Tahiti', '397' => 'Pacific/Tarawa', '398' => 'Pacific/Tongatapu', '399' => 'Pacific/Truk', '400' => 'Pacific/Wake', '401' => 'Pacific/Wallis', '402' => 'UTC');
}