Сокращение выбора часовых поясов

Аватар пользователя ser_house ser_house 21 июля 2012 в 10:01

Может, это вообще ерунда...

Если позволить пользователю выбирать свой часовой пояс, то ему предоставляется для этого select с 455(!) пунктами. Выбор из почти полтысячи значений, причем большинство дублируются по фактическим смещениям часов. Подумал, что неплохо было бы сократить эту дикость до приемлемого уровня. Получилось 39 смещений для выбора. Конечно, убрал из вывода название временной зоны, и может быть это недостаток, не знаю. Да и сами названия перестали соответствовать реальности, но как-то не приходит в голову, где от них была бы реальная польза.

Как было:

Как стало:

Код:

/**
 * Implements hook_form_alter
 *
 */

function hook_form_alter(&$form, &$form_state, $form_id) {
  // Если у формы есть поле выбора временной зоны
  if (isset($form['timezone'])) {
    // Получаем полный список временных зон
    $zonelist = timezone_identifiers_list();
    $zones = array();
    $cur_time = REQUEST_TIME;
   
    // Формируем массив, где значениями будут только смещения времени (для последующей сортировки)
    foreach ($zonelist as $zone) {
      $zones[$zone] = format_date($cur_time, 'custom', 'O', $zone);
    }
   
    // Убираем дубликаты (здесь сортировка бесполезна)
    $zones = array_unique($zones);
   
    // Сортируем в порядке возрастания
    asort($zones);
   
    /* Формируем итоговый список для элемента управления
    Будет состоять из текущего для пользователя времени с учетом временной зоны
    и смещения этой зоны в часах */

    $options = array();
    foreach ($zones as $zone_name => $zone) {
      $options[$zone_name] =
        format_date($cur_time, 'custom',
          variable_get('date_format_long', 'l, F j, Y - H:i') . ' [O]', $zone_name);
    }
   
    // Для полей, создающихся с помощью функции system_user_timezone (большинство)
    $select_name = 'timezone';
   
    // В админке поле создается наживую в функции system_regional_settings
    if ('system_regional_settings' == $form_id) {
      $select_name = 'date_default_timezone';
    }
    // Элементов до: 455
    //debug(count($form['timezone'][$select_name]['#options']), 'Кол-во элементов до', TRUE);
   
    // Заменяем список формы на наш, более простой
    $form['timezone'][$select_name]['#options'] = $options;
   
    // Элементов после: 39
    //debug(count($form['timezone'][$select_name]['#options']), 'Кол-во элементов после', TRUE);
   
    /* Берем выбранную временную зону из профиля пользователя.
    Если в профиле не указана - из настроек по умолчанию для сайта.
    Если и там нет - зона не выбрана */

    if ('user_profile_form' == $form_id) {
      $account = $form['#user'];
      $form['timezone'][$select_name]['#default_value'] =
        isset($account->timezone) ?
          $account->timezone :
          ($account->uid == $user->uid ?
            variable_get('date_default_timezone', '') :
            '');
    }
    // Либо зона по умолчанию из настроек сайта, либо получаем
    else {
      $form['timezone'][$select_name]['#default_value'] =
        variable_get('date_default_timezone', date_default_timezone_get());
    }
   
    // Немного подправленная подсказка для пользователя
    $form['timezone'][$select_name]['#description'] =
      'Выберите ваше текущее время. Даты и время на сайте будут показываться с учётом выбранного часового пояса.';
    //$form['timezone'][$select_name]['#description'] =
      //t('Select your current time and time zone. Dates and times throughout this site will be displayed using this time zone.'),
  }
}

Страничка (там и модуль готовый приложен): http://serho.ru/cust-modules/sokratit-kolichestvo-vremennyh-zon

ВложениеРазмер
Иконка изображения before.jpg25.03 КБ
Иконка изображения after.jpg25.99 КБ

Комментарии

Аватар пользователя danylevskyi danylevskyi 21 июля 2012 в 10:32

Отличная идея!
Я бы порекомендовал оформить код в виде модуля.
Но сперва следует проверить, может что-то подобное есть.

Аватар пользователя ser_house ser_house 21 июля 2012 в 11:15

"danylevskyi" wrote:
Но сперва следует проверить, может что-то подобное есть.

Вроде ничего не нашел, хотя на drupal.org поле фактически именно такое.

Аватар пользователя erikson erikson 11 февраля 2013 в 0:38

Благодарю! Очень пригодилось. Вставил в свою тему, чтоб модули не плодить.

Возможно полезнее было бы использовать hook_form_FORM_ID_alter. Спецы подскажут.

Аватар пользователя ser_house ser_house 11 февраля 2013 в 15:40

"erikson" wrote:
Возможно полезнее было бы использовать hook_form_FORM_ID_alter. Спецы подскажут.

Для какой формы? Мы же не знаем заранее, где может быть это поле Smile

Аватар пользователя erikson erikson 29 января 2014 в 11:00

Заметил в отчете о состоянии (admin/reports/status) следующее сообщение: "Временная зона установлена на Asia/Baku". Устанавливалось +4gmt для Питера. Вполне возможно, что и не критично. Но надпись "Баку" малость смущает.

Аватар пользователя T-34 T-34 8 июня 2014 в 18:25

Некропост, но все же: модуль Chosen позволяет добавить в выпадающие списки функцию автодополнения (autocomplete). Очень удобная вещь, на примере часовых поясов: можно ввести "Москва" и тут же выбрать предлагаемый часовой пояс "Европа/Москва".