]> git.immae.eu Git - github/shaarli/Shaarli.git/blobdiff - application/TimeZone.php
Fix a JS bug preventing AJAX tag deletion to work
[github/shaarli/Shaarli.git] / application / TimeZone.php
index ccbef918b3f6f9c6db91c50c17df5c7b8ce7a7af..c1869ef87e1d0b96b105c792d8dc902c15ca5246 100644 (file)
@@ -1,89 +1,75 @@
 <?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 .= '&nbsp;&nbsp;&nbsp;&nbsp;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];
 }
 
 /**
@@ -94,17 +80,12 @@ function generateTimeZoneForm($preselected_timezone='')
  * @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()
     );
 }
-?>