Может, это вообще ерунда...
Если позволить пользователю выбирать свой часовой пояс, то ему предоставляется для этого 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.jpg | 25.03 КБ |
after.jpg | 25.99 КБ |
Комментарии
Отличная идея!
Я бы порекомендовал оформить код в виде модуля.
Но сперва следует проверить, может что-то подобное есть.
Вроде ничего не нашел, хотя на drupal.org поле фактически именно такое.
Пригодилось, спасибо! ))
Благодарю! Очень пригодилось. Вставил в свою тему, чтоб модули не плодить.
Возможно полезнее было бы использовать hook_form_FORM_ID_alter. Спецы подскажут.
Для какой формы? Мы же не знаем заранее, где может быть это поле
Заметил в отчете о состоянии (admin/reports/status) следующее сообщение: "Временная зона установлена на Asia/Baku". Устанавливалось +4gmt для Питера. Вполне возможно, что и не критично. Но надпись "Баку" малость смущает.
Некропост, но все же: модуль Chosen позволяет добавить в выпадающие списки функцию автодополнения (autocomplete). Очень удобная вещь, на примере часовых поясов: можно ввести "Москва" и тут же выбрать предлагаемый часовой пояс "Европа/Москва".