<?php
/**
- * Generates the timezone selection form and JavaScript.
+ * Generates a list of available timezone continents and cities.
*
- * Note: 'UTC/UTC' is mapped to 'UTC' to form a valid option
+ * Two distinct array based on available timezones
+ * and the one selected in the settings:
+ * - (0) continents:
+ * + list of available continents
+ * + special key 'selected' containing the value of the selected timezone's continent
+ * - (1) cities:
+ * + list of available cities associated with their continent
+ * + special key 'selected' containing the value of the selected timezone's city (without the continent)
*
- * Example: preselect Europe/Paris
- * list($htmlform, $js) = templateTZform('Europe/Paris');
+ * Example:
+ * [
+ * [
+ * 'America',
+ * 'Europe',
+ * 'selected' => 'Europe',
+ * ],
+ * [
+ * ['continent' => 'America', 'city' => 'Toronto'],
+ * ['continent' => 'Europe', 'city' => 'Paris'],
+ * 'selected' => 'Paris',
+ * ],
+ * ];
*
- * @param string $preselected_timezone preselected timezone (optional)
+ * Notes:
+ * - 'UTC/UTC' is mapped to 'UTC' to form a valid option
+ * - a few timezone cities includes the country/state, such as Argentina/Buenos_Aires
+ * - these arrays are designed to build timezone selects in template files with any HTML structure
*
- * @return an array containing the generated HTML form and Javascript code
+ * @param array $installedTimeZones List of installed timezones as string
+ * @param string $preselectedTimezone preselected timezone (optional)
+ *
+ * @return array[] continents and cities
**/
-function generateTimeZoneForm($preselected_timezone='')
+function generateTimeZoneData($installedTimeZones, $preselectedTimezone = '')
{
- // Select the first available timezone if no preselected value is passed
- if ($preselected_timezone == '') {
- $l = timezone_identifiers_list();
- $preselected_timezone = $l[0];
+ 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);
}
- // Try to split the provided timezone
- $spos = strpos($preselected_timezone, '/');
- $pcontinent = substr($preselected_timezone, 0, $spos);
- $pcity = substr($preselected_timezone, $spos+1);
-
- // Display config form:
- $timezone_form = '';
- $timezone_js = '';
-
- // 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) {
+ $continents = [];
+ $cities = [];
+ foreach ($installedTimeZones 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>';
+ // Ignore invalid timezones
+ if ($spos === false) {
+ continue;
}
- }
- $continents_html = '';
- $continents = array_keys($continents);
-
- foreach ($continents as $continent) {
- $continents_html .= '<option value="'.$continent.'"';
- if ($pcontinent == $continent) {
- $continents_html .= ' selected="selected"';
- }
- $continents_html .= '>'.$continent.'</option>';
+ $continent = substr($tz, 0, $spos);
+ $city = substr($tz, $spos+1);
+ $cities[] = ['continent' => $continent, 'city' => $city];
+ $continents[$continent] = true;
}
- // Timezone selection form
- $timezone_form = 'Continent:';
- $timezone_form .= '<select name="continent" id="continent" onChange="onChangecontinent();">';
- $timezone_form .= $continents_html.'</select>';
- $timezone_form .= ' City:';
- $timezone_form .= '<select name="city" id="city">'.$cities[$pcontinent].'</select><br />';
-
- // Javascript handler - updates the city list when the user selects a continent
- $timezone_js = '<script>';
- $timezone_js .= 'function onChangecontinent() {';
- $timezone_js .= 'document.getElementById("city").innerHTML =';
- $timezone_js .= ' citiescontinent[document.getElementById("continent").value]; }';
- $timezone_js .= 'var citiescontinent = '.json_encode($cities).';';
- $timezone_js .= '</script>';
+ $continents = array_keys($continents);
+ $continents['selected'] = $pcontinent;
+ $cities['selected'] = $pcity;
- return array($timezone_form, $timezone_js);
+ return [$continents, $cities];
}
/**
* @param string $continent the timezone continent
* @param string $city the timezone city
*
- * @return whether continent/city is a valid timezone
+ * @return bool 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()
);
}
-?>