АСѾԐД Создание и продвижение сайтов

Fast Site Engine

CMS для сайтов

Создать сайт

Карта сайта
Переходим на Линукс
Политика конфиденциальности
Сделать сайт на основе Fast Site Engine

Установка
Документация
Список изменений
Лицензионное соглашение

Скачать
О движкеОбо мнеДеятельностьПортфолиоКонтакты

Выбор часового пояса

Модуль выбора часового пояса, дополнительно имеет JavaScript модуль Combobox для вывода выпадающего списка с возможностью ручного ввода (поиска) с адаптацией для слабовидящих WCAG 2.0, ГОСТ Р 52872-2012.
Живой пример данного модуля и js выпадающих списков combobox смотрите здесь (правый с возможностью поиска значений).

Пример подключения

Берём переменные из куков (cookie).

require D.'deny/mods/zones/index.php';
//Задаём значения по умолчанию
$uzd='Europe/Moscow';
if(!$uzs=c('myregion'))$uzs=128;//Europe
$region=zoneregion($uzs);
if(!$uz=c('mycity'))$uz=$uzd;
$uz=htmlspecialchars($uz,ENT_QUOTES);
$city=zonecity($region['value'],$uz);
if(''==$city['value']){$city['value']=$uzd;$city['text']=ll('zones',$uzd);}
date_default_timezone_set($city['value']);

Используем JS Combobox

Первый выпадающий список будет без ручного ввода симулирующий HTML элемент select.
Второй с возможностью ввода. (описание смотрите ниже)

echo 
'<label id="myregion-label" onclick="ff.g(\'myregion\').focus()" title="',ll('zone','belt'),'">',ll('zone','region'),':</label><br>',
'<div class="combo" style="z-index:2">',
  '<div id="myregion" role="combobox" tabindex="0" aria-labelledby="myregion-label" aria-controls="region" aria-haspopup="listbox" aria-autocomplete="list" aria-expanded="false" onchange="setmyzone(this)" data-v="',$region['value'],'">',$region['text'],'</div>',
  '<div role="listbox" id="region" tabindex="-1" aria-label="',ll('zone','region'),'">',$region['options'],'</div>',
'</div>',
'<label for="mycity" title="',ll('zone','belt'),'">',ll('zone','city'),':</label><br>',
'<div class="combo" style="z-index:1">',
  '<input type="text" id="mycity" role="combobox" aria-controls="city" aria-autocomplete="both" aria-haspopup="listbox" aria-expanded="false" onchange="setmyzone(this)" data-v="',$city['value'],'" value="',$city['text'],'">',
  '<button aria-label="',ll('zone','city'),'" aria-controls="city" aria-expanded="false" tabindex="-1"></button>',
  '<div role="listbox" id="city" tabindex="-1" aria-label="',ll('zone','city'),'">',$city['options'],'</div>',
'</div>';
//подключаем обработку нашего класса в конце /inc/_.js
ff.onload(function() {
  ff.init({
    combobox:'combo',
    ...
  }
);
//по умолчанию combobox:1, будет искать класс combobox.
Опции заполнения combobox - div class="combo ...":
//вставлять основной текст combobox:
- по умолчанию текст из option исключая содержимое тега small
  (в данной структуре он задуман для вспомогательных данных)
- tagout - текст из первого тега
- smallout - текст из первого тега small
- fullout - весь текст
- cutagsout - вырезать все теги с их содержимым, оставить только текст
- valueout - текст из option data-v (значение)
//можно объединять комбинации:
- div class="combo tagout smallout" - текст из 1 тега и тега small
- div class="combo tagout valueout" - текст из 1 тега и значение (option data-v)
- div class="combo cutagsout valueout" - вырежет теги и добавит option data-v

Добавляем оформление Combobox в CSS

Я собрал в одну "упаковку" сразу оба элемента. !important перебивают заданные стили у меня на сайте, смотрите по месту есть ли в них необходимость..

.combo{height:32px;background-color:#f0f0f0;border:1px solid #cecece;border-radius:5px;position:relative;z-index:2}
.combo [role='combobox']{box-sizing:border-box;position:absolute;z-index:2;width:100%;height:32px;margin:0;padding:0 0 0 6px !important;border-radius:5px;font:bold 15px/30px Verdana;color:#fff;text-shadow:0 1px 1px #735206;background:linear-gradient(#ff9000,#ed480c);box-shadow:0 6px 6px -4px rgba(0,0,0,.2);border:1px solid transparent;overflow:hidden;cursor:pointer}
.combo [role='combobox']:after{content:'';width:0;height:0;font-size:0;position:absolute;top:13px;left:auto;right:11px;border:6px solid transparent;border-top:5px solid #fff;border-bottom:0;background:none;opacity:1;transition:none}
.combo.open [role='combobox']:after{top:12px;border-bottom:5px solid #fff;border-top:0}
.combo [role='combobox']::-moz-selection{background-color:#aeaeae}
.combo [role='combobox']::selection{background-color:rgba(174,174,174,.99)}
.combo button{display:block;position:absolute;z-index:3;width:32px;height:32px;right:0;padding:0;border:0;border-radius:5px;background:none;box-shadow:none;cursor:pointer}
.combo button:after{display:block;content:'';width:0;height:0;font-size:0;position:absolute;top:14px;left:auto;right:11px;border:6px solid transparent;border-top:5px solid #fff;border-bottom:0;background:none;opacity:1;transition:none}
.combo.open input[role='combobox']{cursor:auto}
.combo.open button:after{top:13px;border-bottom:5px solid #fff;border-top:0}
.combo [role='listbox']{box-sizing:border-box;display:none;padding-bottom:9px;width:100%;position:absolute;top:32px;max-height:420px;overflow-y:auto;border-radius:3px;border:1px solid #cecece;background-color:#f0f0f0}
.combo span{display:block;padding:5px 0 5px 9px;font:13px/20px Verdana;cursor:pointer}
.combo span:hover{background-color:#f8f8f8}
.combo .selected{color:#aeaeae;background-color:#f8f8f8 !important;cursor:default !important}
.combo [aria-selected='true']{color:#000;background-color:#dadada !important}
/*Дополнительная информация справа*/
.combo #city span{padding-right:40px}
.combo span small{position:absolute;right:4px}

CSS стили по отдельности

.drop{height:32px;background-color:#f0f0f0;border:1px solid #cecece;border-radius:5px;position:relative;z-index:2}
.drop [role='combobox']{box-sizing:border-box;position:absolute;z-index:2;width:100%;height:32px;margin:0;padding:0 0 0 6px !important;border-radius:5px;font:bold 15px/30px Verdana;color:#fff;text-shadow:0 1px 1px #735206;background:linear-gradient(#ff9000,#ed480c);box-shadow:0 6px 6px -4px rgba(0,0,0,.2);border:1px solid transparent;overflow:hidden;cursor:pointer}
.drop [role='combobox']:after{content:'';width:0;height:0;font-size:0;position:absolute;top:13px;left:auto;right:11px;border:6px solid transparent;border-top:5px solid #fff;border-bottom:0;background:none;opacity:1;transition:none}
.drop.open [role='combobox']:after{top:12px;border-bottom:5px solid #fff;border-top:0}
.drop [role='listbox']{box-sizing:border-box;display:none;padding-bottom:9px;width:100%;position:absolute;top:32px;max-height:420px;overflow-y:auto;border-radius:3px;border:1px solid #cecece;background-color:#f0f0f0}
.drop span{display:block;padding:5px 0 5px 9px;font:13px/20px Verdana;cursor:pointer}
.drop span:hover{background-color:#f8f8f8}
.drop .selected{color:#aeaeae;background-color:#f8f8f8 !important;cursor:default !important}
.drop [aria-selected='true']{color:#000;background-color:#dadada !important}
.drop2{height:32px;background-color:#f0f0f0;border:1px solid #cecece;border-radius:5px;position:relative;z-index:2}
.drop2 input{box-sizing:border-box;position:absolute;z-index:2;width:100%;height:32px;margin:0 !important;padding:0 0 0 6px !important;border-radius:5px;font:bold 15px/30px Verdana;color:#fff;text-shadow:0 1px 1px #735206;background:linear-gradient(#ff9000,#ed480c);box-shadow:0 6px 6px -4px rgba(0,0,0,.2);border:1px solid transparent}
.drop2 input::-moz-selection{background-color:#aeaeae}
.drop2 input::selection{background-color:rgba(174,174,174,.99)}
.drop2 button{display:block;position:absolute;z-index:3;width:32px;height:32px;right:0;padding:0;border:0;border-radius:5px;background:none;box-shadow:none;cursor:pointer}
.drop2 button:after{display:block;content:'';width:0;height:0;font-size:0;position:absolute;top:14px;left:auto;right:11px;border:6px solid transparent;border-top:5px solid #fff;border-bottom:0;background:none;opacity:1;transition:none}
.drop2.open input[role='combobox']{cursor:auto}
.drop2.open button:after{top:13px;border-bottom:5px solid #fff;border-top:0}
.drop2 div{box-sizing:border-box;display:none;padding-bottom:9px;width:100%;position:absolute;top:32px;max-height:420px;overflow-y:auto;border-radius:3px;border:1px solid #cecece;background-color:#f0f0f0}
.drop2 span{display:block;padding:5px 40px 5px 9px;font:13px/20px Verdana;cursor:pointer}
.drop2 span:hover{background-color:#f8f8f8}
.drop2 .selected{color:#aeaeae;background-color:#f8f8f8 !important;cursor:default !important}
.drop2 [aria-selected='true']{color:#000;background-color:#dadada !important}
.drop2 span small{position:absolute;right:4px}

Получаем значения JS

Решаем как именно сохранять данные и что делать дальше.

function setmyzone(e){
  var n,v=ff.atr(e,'data-v');//,t=ff.nn(e,'input')?ff.v(e):e.innerHTML;
  n=ff.isi(v)?'myregion':'mycity';
  ff.sc(n,v,'t');//сохраняем куку и обновляем страницу, 
    в моём скрипте идут манипуляции с адресом - удаляю значение t из $_GET (не обязательно, для примера).
}

Если будет необходимо вызвать повторную инициализацию combobox при AJAX запросе - в конце вывода добавьте:

echo '<input type="hidden" id="fseval" value="fo.init(`combo`)">';
или
echo '<input type="hidden" id="fseval" value="fo.init()">';

Горячие клавиши и функционирование Combobox

Для начала стоит отметить, что теги из пунктов вырезаются, т.е. дополнительная информация +3:00 часа итп.
aria-autocomplete="list" - при вводе значений будет произведён поиск и показаны подходящие пункты. Если поля ввода нет, то по нажатию буквы будет выделять по кругу по подходящие пункты списка начинающиеся с такой же с 1-й буквы.
aria-autocomplete="both" - тоже, плюс идёт подстановка "хвоста" значения в поле ввода..
Можно дописать class="combo open focused" : open - откроет(выпадет) список пунктов, focused установит фокус в Combobox.

Описание php функций

zoneregion($z=128, $c='', $j=L, $o=0) - отдаёт регионы часовых поясов.

Возвращает массив ['value'=>'Номер зоны','text'=>'Название исходя из выбранного языка вывода','options'=>'Список пунктов часовых поясов']. Если значение(value) или текст(text) пустые, значит не найдено.

zonecity($r=128, $z='Europe/Moscow', $c='', $j=L, $o=0, $w=1, $d='<small>+%02d:%02d</small>', $d0=0){ - отдаёт города для выбранного региона часового пояса.

Возвращает массив ['value'=>'Значение часового пояса на английском (Europe/Moscow)','text'=>'Название исходя из выбранного языка вывода','options'=>'Список пунктов городов']. Если значение(value) или текст(text) пустые, значит не найдено.





09.07.2026
10.8.7534 от С.М.З.Х.
Unix time: 1783623316
© Все права защищены 2004 - 2026