From efda42f2fca0684e4b84580b47c4784a83b1b55e Mon Sep 17 00:00:00 2001 From: catch Date: Wed, 22 Feb 2023 15:28:49 +0000 Subject: [PATCH] Issue #3020455 by Spokje, jhedstrom, kim.pepper, Bhanu951, mpdonadio, alexpott, smustgrave: Deprecate system_time_zones() and move to TimeZoneFormHelper --- .../Core/Datetime/TimeZoneFormHelper.php | 62 +++++++++++++++++++ .../FieldFormatter/TimestampFormatter.php | 3 +- .../Core/Installer/Form/SiteConfigureForm.php | 3 +- .../FieldFormatter/DateTimeFormatterBase.php | 3 +- core/modules/system/src/Form/RegionalForm.php | 3 +- core/modules/system/system.module | 44 +++---------- .../System/SystemFunctionsLegacyTest.php | 30 +++++++++ core/modules/user/src/AccountForm.php | 3 +- core/modules/user/src/Entity/User.php | 2 +- .../migrate/process/d6/UserUpdate7002.php | 3 +- .../views/src/Plugin/views/field/Date.php | 3 +- .../Core/Datetime/TimeZoneFormHelperTest.php} | 40 +++++++----- 12 files changed, 142 insertions(+), 57 deletions(-) create mode 100644 core/lib/Drupal/Core/Datetime/TimeZoneFormHelper.php create mode 100644 core/modules/system/tests/src/Kernel/System/SystemFunctionsLegacyTest.php rename core/{modules/system/tests/src/Kernel/Timezone/TimezoneTest.php => tests/Drupal/Tests/Core/Datetime/TimeZoneFormHelperTest.php} (63%) diff --git a/core/lib/Drupal/Core/Datetime/TimeZoneFormHelper.php b/core/lib/Drupal/Core/Datetime/TimeZoneFormHelper.php new file mode 100644 index 000000000000..3be2148b7bae --- /dev/null +++ b/core/lib/Drupal/Core/Datetime/TimeZoneFormHelper.php @@ -0,0 +1,62 @@ + new TranslatableMarkup('- None selected -')] : []; + foreach ($zonelist as $zone) { + $zones[$zone] = new TranslatableMarkup(str_replace('_', ' ', $zone)); + } + // Sort the translated time zones alphabetically. + asort($zones); + if ($grouped) { + $grouped_zones = []; + foreach ($zones as $key => $value) { + $split = explode('/', $value); + $city = array_pop($split); + $region = array_shift($split); + if (!empty($region)) { + $grouped_zones[$region][$key] = empty($split) ? $city : $city . ' (' . implode('/', $split) . ')'; + } + else { + $grouped_zones[$key] = $value; + } + } + foreach ($grouped_zones as $key => $value) { + if (is_array($grouped_zones[$key])) { + asort($grouped_zones[$key]); + } + } + $zones = $grouped_zones; + } + + return $zones; + + } + +} diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/TimestampFormatter.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/TimestampFormatter.php index 1f999ca70cd2..7d7eb9dfa235 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/TimestampFormatter.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/TimestampFormatter.php @@ -3,6 +3,7 @@ namespace Drupal\Core\Field\Plugin\Field\FieldFormatter; use Drupal\Core\Datetime\DateFormatterInterface; +use Drupal\Core\Datetime\TimeZoneFormHelper; use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemListInterface; @@ -131,7 +132,7 @@ class TimestampFormatter extends FormatterBase { $elements['timezone'] = [ '#type' => 'select', '#title' => $this->t('Time zone'), - '#options' => ['' => $this->t('- Default site/user time zone -')] + system_time_zones(FALSE, TRUE), + '#options' => ['' => $this->t('- Default site/user time zone -')] + TimeZoneFormHelper::getOptionsList(FALSE, TRUE), '#default_value' => $this->getSetting('timezone'), ]; diff --git a/core/lib/Drupal/Core/Installer/Form/SiteConfigureForm.php b/core/lib/Drupal/Core/Installer/Form/SiteConfigureForm.php index d15e26be3fc0..42a57221ef7c 100644 --- a/core/lib/Drupal/Core/Installer/Form/SiteConfigureForm.php +++ b/core/lib/Drupal/Core/Installer/Form/SiteConfigureForm.php @@ -2,6 +2,7 @@ namespace Drupal\Core\Installer\Form; +use Drupal\Core\Datetime\TimeZoneFormHelper; use Drupal\Core\Extension\ModuleInstallerInterface; use Drupal\Core\Form\ConfigFormBase; use Drupal\Core\Form\FormStateInterface; @@ -207,7 +208,7 @@ class SiteConfigureForm extends ConfigFormBase { '#type' => 'select', '#title' => $this->t('Default time zone'), '#default_value' => $default_timezone, - '#options' => system_time_zones(NULL, TRUE), + '#options' => TimeZoneFormHelper::getOptionsList(FALSE, TRUE), '#weight' => 5, '#attributes' => ['class' => ['timezone-detect']], '#access' => empty($install_state['config_install_path']), diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php index b45c4e66f871..52d060febe83 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php @@ -4,6 +4,7 @@ namespace Drupal\datetime\Plugin\Field\FieldFormatter; use Drupal\Core\Datetime\DateFormatterInterface; use Drupal\Core\Datetime\DrupalDateTime; +use Drupal\Core\Datetime\TimeZoneFormHelper; use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemListInterface; @@ -97,7 +98,7 @@ abstract class DateTimeFormatterBase extends FormatterBase { '#type' => 'select', '#title' => $this->t('Time zone override'), '#description' => $this->t('The time zone selected here will always be used'), - '#options' => system_time_zones(TRUE, TRUE), + '#options' => TimeZoneFormHelper::getOptionsList(TRUE, TRUE), '#default_value' => $this->getSetting('timezone_override'), ]; diff --git a/core/modules/system/src/Form/RegionalForm.php b/core/modules/system/src/Form/RegionalForm.php index f628051d459b..25d2e20ff087 100644 --- a/core/modules/system/src/Form/RegionalForm.php +++ b/core/modules/system/src/Form/RegionalForm.php @@ -3,6 +3,7 @@ namespace Drupal\system\Form; use Drupal\Core\Config\ConfigFactoryInterface; +use Drupal\Core\Datetime\TimeZoneFormHelper; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Locale\CountryManagerInterface; use Drupal\Core\Form\ConfigFormBase; @@ -67,7 +68,7 @@ class RegionalForm extends ConfigFormBase { $system_date = $this->config('system.date'); // Date settings: - $zones = system_time_zones(NULL, TRUE); + $zones = TimeZoneFormHelper::getOptionsList(FALSE, TRUE); $form['locale'] = [ '#type' => 'details', diff --git a/core/modules/system/system.module b/core/modules/system/system.module index 752ac1c0ae6b..7ca4d49640dd 100644 --- a/core/modules/system/system.module +++ b/core/modules/system/system.module @@ -13,6 +13,7 @@ use Drupal\Core\Asset\AttachedAssetsInterface; use Drupal\Core\Block\BlockPluginInterface; use Drupal\Core\Cache\Cache; use Drupal\Core\Database\Query\AlterableInterface; +use Drupal\Core\Datetime\TimeZoneFormHelper; use Drupal\Core\Entity\ContentEntityTypeInterface; use Drupal\Core\Extension\Extension; use Drupal\Core\File\Exception\FileException; @@ -1102,42 +1103,17 @@ function system_mail($key, &$message, $params) { * * @return array * An array or nested array containing time zones, keyed by the system name. + * + * @deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. This function + * is no longer used in Drupal core. Use + * \Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsList() or + * \DateTimeZone::listIdentifiers() instead. + * + * @see https://www.drupal.org/node/3023528 */ function system_time_zones($blank = NULL, $grouped = FALSE) { - $zonelist = timezone_identifiers_list(); - $zones = $blank ? ['' => t('- None selected -')] : []; - foreach ($zonelist as $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)) { - $zones[$zone] = t('@zone', ['@zone' => t(str_replace('_', ' ', $zone))]); - } - } - // Sort the translated time zones alphabetically. - asort($zones); - if ($grouped) { - $grouped_zones = []; - foreach ($zones as $key => $value) { - $split = explode('/', $value); - $city = array_pop($split); - $region = array_shift($split); - if (!empty($region)) { - $grouped_zones[$region][$key] = empty($split) ? $city : $city . ' (' . implode('/', $split) . ')'; - } - else { - $grouped_zones[$key] = $value; - } - } - foreach ($grouped_zones as $key => $value) { - if (is_array($grouped_zones[$key])) { - asort($grouped_zones[$key]); - } - } - $zones = $grouped_zones; - } - - return $zones; + @trigger_error(__METHOD__ . '() is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. This function is no longer used in Drupal core. Use \Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsList() or \DateTimeZone::listIdentifiers() instead. See https://www.drupal.org/node/3023528', E_USER_DEPRECATED); + return TimeZoneFormHelper::getOptionsList((bool) $blank, $grouped); } /** diff --git a/core/modules/system/tests/src/Kernel/System/SystemFunctionsLegacyTest.php b/core/modules/system/tests/src/Kernel/System/SystemFunctionsLegacyTest.php new file mode 100644 index 000000000000..5316186aec5a --- /dev/null +++ b/core/modules/system/tests/src/Kernel/System/SystemFunctionsLegacyTest.php @@ -0,0 +1,30 @@ +expectDeprecation('system_time_zones() is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. This function is no longer used in Drupal core. Use \Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsList() or \DateTimeZone::listIdentifiers() instead. See https://www.drupal.org/node/3023528'); + system_time_zones(); + } + +} diff --git a/core/modules/user/src/AccountForm.php b/core/modules/user/src/AccountForm.php index 263ec3bfc4a9..c553cbf0349e 100644 --- a/core/modules/user/src/AccountForm.php +++ b/core/modules/user/src/AccountForm.php @@ -3,6 +3,7 @@ namespace Drupal\user; use Drupal\Component\Datetime\TimeInterface; +use Drupal\Core\Datetime\TimeZoneFormHelper; use Drupal\Core\Entity\ContentEntityForm; use Drupal\Core\Entity\EntityConstraintViolationListInterface; use Drupal\Core\Entity\EntityRepositoryInterface; @@ -296,7 +297,7 @@ abstract class AccountForm extends ContentEntityForm implements TrustedCallbackI '#type' => 'select', '#title' => $this->t('Time zone'), '#default_value' => $account->getTimezone() ?: $system_date_config->get('timezone.default'), - '#options' => system_time_zones($account->id() != $user->id(), TRUE), + '#options' => TimeZoneFormHelper::getOptionsList($account->id() != $user->id(), TRUE), '#description' => $this->t('Select the desired local time and time zone. Dates and times throughout this site will be displayed using this time zone.'), ]; diff --git a/core/modules/user/src/Entity/User.php b/core/modules/user/src/Entity/User.php index 1ea54bf04a81..1df5d88dce65 100644 --- a/core/modules/user/src/Entity/User.php +++ b/core/modules/user/src/Entity/User.php @@ -572,7 +572,7 @@ class User extends ContentEntityBase implements UserInterface { * The allowed values. */ public static function getAllowedTimezones() { - return array_keys(system_time_zones()); + return \DateTimeZone::listIdentifiers(); } /** diff --git a/core/modules/user/src/Plugin/migrate/process/d6/UserUpdate7002.php b/core/modules/user/src/Plugin/migrate/process/d6/UserUpdate7002.php index 858fcfc9906c..84f6dfecc221 100644 --- a/core/modules/user/src/Plugin/migrate/process/d6/UserUpdate7002.php +++ b/core/modules/user/src/Plugin/migrate/process/d6/UserUpdate7002.php @@ -2,6 +2,7 @@ namespace Drupal\user\Plugin\migrate\process\d6; +use Drupal\Core\Datetime\TimeZoneFormHelper; use Drupal\migrate\MigrateExecutableInterface; use Drupal\migrate\ProcessPluginBase; use Drupal\migrate\Row; @@ -39,7 +40,7 @@ class UserUpdate7002 extends ProcessPluginBase implements ContainerFactoryPlugin parent::__construct($configuration, $plugin_id, $plugin_definition); $this->dateConfig = $date_config; if (!isset(static::$timezones)) { - static::$timezones = system_time_zones(); + static::$timezones = TimeZoneFormHelper::getOptionsList(); } } diff --git a/core/modules/views/src/Plugin/views/field/Date.php b/core/modules/views/src/Plugin/views/field/Date.php index e33994b2ebde..80008a8baf1a 100644 --- a/core/modules/views/src/Plugin/views/field/Date.php +++ b/core/modules/views/src/Plugin/views/field/Date.php @@ -2,6 +2,7 @@ namespace Drupal\views\Plugin\views\field; +use Drupal\Core\Datetime\TimeZoneFormHelper; use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\views\ResultRow; @@ -119,7 +120,7 @@ class Date extends FieldPluginBase { '#type' => 'select', '#title' => $this->t('Timezone'), '#description' => $this->t('Timezone to be used for date output.'), - '#options' => ['' => $this->t('- Default site/user timezone -')] + system_time_zones(FALSE, TRUE), + '#options' => ['' => $this->t('- Default site/user timezone -')] + TimeZoneFormHelper::getOptionsList(FALSE, TRUE), '#default_value' => $this->options['timezone'], ]; foreach (array_merge(['custom'], array_keys($date_formats)) as $timezone_date_formats) { diff --git a/core/modules/system/tests/src/Kernel/Timezone/TimezoneTest.php b/core/tests/Drupal/Tests/Core/Datetime/TimeZoneFormHelperTest.php similarity index 63% rename from core/modules/system/tests/src/Kernel/Timezone/TimezoneTest.php rename to core/tests/Drupal/Tests/Core/Datetime/TimeZoneFormHelperTest.php index 831571bdc02b..3f78db5ba42b 100644 --- a/core/modules/system/tests/src/Kernel/Timezone/TimezoneTest.php +++ b/core/tests/Drupal/Tests/Core/Datetime/TimeZoneFormHelperTest.php @@ -1,30 +1,40 @@ set('string_translation', $this->getStringTranslationStub()); + \Drupal::setContainer($container); + } + + /** + * @covers ::getOptionsList + */ + public function testGetList(): void { + // Test the default parameters for getOptionsList(). + $result = TimeZoneFormHelper::getOptionsList(); $this->assertIsArray($result); $this->assertArrayHasKey('Africa/Dar_es_Salaam', $result); $this->assertEquals('Africa/Dar es Salaam', $result['Africa/Dar_es_Salaam']); // Tests time zone grouping. - $result = system_time_zones(NULL, TRUE); + $result = TimeZoneFormHelper::getOptionsList(FALSE, TRUE); // Check a two-level time zone. $this->assertIsArray($result); @@ -51,8 +61,8 @@ class TimezoneTest extends KernelTestBase { // Test that the ungrouped and grouped results have the same number of // items. - $ungrouped_count = count(system_time_zones()); - $grouped_result = system_time_zones(NULL, TRUE); + $ungrouped_count = count(TimeZoneFormHelper::getOptionsList()); + $grouped_result = TimeZoneFormHelper::getOptionsList(FALSE, TRUE); $grouped_count = 0; array_walk_recursive($grouped_result, function () use (&$grouped_count) { $grouped_count++;