afd7b77b4c
Modifications - attempt to use the server's timezone - if none is set, use UTC - TimeZone: apply coding conventions - variable naming - no closing PHP tag Relates to #274 Signed-off-by: VirtualTam <virtualtam@flibidi.net>
112 lines
3.5 KiB
PHP
112 lines
3.5 KiB
PHP
<?php
|
|
/**
|
|
* Generates the timezone selection form and JavaScript.
|
|
*
|
|
* Note: 'UTC/UTC' is mapped to 'UTC' to form a valid option
|
|
*
|
|
* Example: preselect Europe/Paris
|
|
* list($htmlform, $js) = generateTimeZoneForm('Europe/Paris');
|
|
*
|
|
* @param string $preselected_timezone preselected timezone (optional)
|
|
*
|
|
* @return an array containing the generated HTML form and Javascript code
|
|
**/
|
|
function generateTimeZoneForm($preselectedTimezone='')
|
|
{
|
|
// Select the server timezone
|
|
if ($preselectedTimezone == '') {
|
|
$preselectedTimezone = date_default_timezone_get();
|
|
}
|
|
|
|
if ($preselectedTimezone == 'UTC') {
|
|
$pcity = $pcontinent = 'UTC';
|
|
} else {
|
|
// Try to split the provided timezone
|
|
$spos = strpos($preselectedTimezone, '/');
|
|
$pcontinent = substr($preselectedTimezone, 0, $spos);
|
|
$pcity = substr($preselectedTimezone, $spos+1);
|
|
}
|
|
|
|
// Display config form:
|
|
$timezoneForm = '';
|
|
$timezoneJs = '';
|
|
|
|
// The list is in the form 'Europe/Paris', 'America/Argentina/Buenos_Aires'
|
|
// We split the list in continents/cities.
|
|
$continents = array();
|
|
$cities = array();
|
|
|
|
// TODO: use a template to generate the HTML/Javascript form
|
|
|
|
foreach (timezone_identifiers_list() as $tz) {
|
|
if ($tz == 'UTC') {
|
|
$tz = 'UTC/UTC';
|
|
}
|
|
$spos = strpos($tz, '/');
|
|
|
|
if ($spos !== false) {
|
|
$continent = substr($tz, 0, $spos);
|
|
$city = substr($tz, $spos+1);
|
|
$continents[$continent] = 1;
|
|
|
|
if (!isset($cities[$continent])) {
|
|
$cities[$continent] = '';
|
|
}
|
|
$cities[$continent] .= '<option value="'.$city.'"';
|
|
if ($pcity == $city) {
|
|
$cities[$continent] .= ' selected="selected"';
|
|
}
|
|
$cities[$continent] .= '>'.$city.'</option>';
|
|
}
|
|
}
|
|
|
|
$continentsHtml = '';
|
|
$continents = array_keys($continents);
|
|
|
|
foreach ($continents as $continent) {
|
|
$continentsHtml .= '<option value="'.$continent.'"';
|
|
if ($pcontinent == $continent) {
|
|
$continentsHtml .= ' selected="selected"';
|
|
}
|
|
$continentsHtml .= '>'.$continent.'</option>';
|
|
}
|
|
|
|
// Timezone selection form
|
|
$timezoneForm = 'Continent:';
|
|
$timezoneForm .= '<select name="continent" id="continent" onChange="onChangecontinent();">';
|
|
$timezoneForm .= $continentsHtml.'</select>';
|
|
$timezoneForm .= ' City:';
|
|
$timezoneForm .= '<select name="city" id="city">'.$cities[$pcontinent].'</select><br />';
|
|
|
|
// Javascript handler - updates the city list when the user selects a continent
|
|
$timezoneJs = '<script>';
|
|
$timezoneJs .= 'function onChangecontinent() {';
|
|
$timezoneJs .= 'document.getElementById("city").innerHTML =';
|
|
$timezoneJs .= ' citiescontinent[document.getElementById("continent").value]; }';
|
|
$timezoneJs .= 'var citiescontinent = '.json_encode($cities).';';
|
|
$timezoneJs .= '</script>';
|
|
|
|
return array($timezoneForm, $timezoneJs);
|
|
}
|
|
|
|
/**
|
|
* Tells if a continent/city pair form a valid timezone
|
|
*
|
|
* Note: 'UTC/UTC' is mapped to 'UTC'
|
|
*
|
|
* @param string $continent the timezone continent
|
|
* @param string $city the timezone city
|
|
*
|
|
* @return whether continent/city is a valid timezone
|
|
*/
|
|
function isTimeZoneValid($continent, $city)
|
|
{
|
|
if ($continent == 'UTC' && $city == 'UTC') {
|
|
return true;
|
|
}
|
|
|
|
return in_array(
|
|
$continent.'/'.$city,
|
|
timezone_identifiers_list()
|
|
);
|
|
}
|