БлогNot. Сколько до открытия?

Сколько до открытия?

Этот полезный сервис был оперативно создан по следам минувшего дня города, который "нанонаучная столица Сибири" отмечает в последнее воскресенье июня, а спиртное-то в этот день по-прежнему не продают, хотя псевдопедросовского мэра мы ради этого дела даже сменили на псевдокоммунистического, но банка пива человеку, ничего не ведающему о чиновничьих развлечениях и приехавшему, например, с дачи, всё равно в этот день не светит. Я-то на сей раз не попался, так как с трудом сумел запомнить такой выкрутас как "последнее воскресенье июня", а вот масса знакомых пролетела в очередной раз.

Скрипт был написан непосредственно 28-го июня ночером и сразу же разослан всем желающим, поэтому выглядит довольно примитивно. Он показывает, продают ли в настоящее время алкоголь в г. Новосибирске и придерживается следующих соглашений:

  • есть список "стоп-дат" $bad_dates, куда в настоящее время входят 9 мая и пресловутый "день города";
  • есть стоп-время "до открытия" $time_1 и "после закрытия" $time_2, до и после которого не продают, $time_2 не должно быть больше полуночи (легко поправить).

Скрипт предупреждает жёлтым фоном накануне наступления стоп-времени (за 15 минут) и критических дней (весь день), а страшное время когда "не продают", выделяется красным.

Несколько "стоп-дат" могут идти в списке $bad_dates подряд, ближайшее время открытия и закрытия должно находиться. Если компрадорскому режиму вздумается, например, запретить продажу пива по воскресеньям, достаточно будет пополнить список стоп-дат такими записями как 'first Sunday of January', ... 'last Sunday of December', благо, PHP позволяет.

Примерный код для подключения скрипта на своём сайте:

<div><iframe width="230" height="80" hspace="4" vspace="4" 
      align="center" frameborder="0" scrolling="no" seamless 
      src="http://scripts.kislenko.net/ai/index.html">
 Извините, плавающие фреймы недоступны в Вашем браузере
</iframe></div>

Или можно скачать архив и разместить у себя, но PHP нужен версии не ниже 5.3.0. Все файлы скрипта закодированы в Юникод (UTF-8). Используется JQuery.

Код, в частности, даёт ответы на такие вопросы:

  • как правильно подключить со стороны клиента php-скрипт, обновляющий с нужной частотой (у меня - раз в 30 секунд) какой-то раздел в документе (см. index.html)?
  • как наиболее просто делать php-шаблоны и применять их? (см. tmpl.html как шаблон и метод template в alcoinf.php как применение шаблона).

Файл index.php - вызов PHP-скрипта с помощью JQuery и автообновление раздела <div id="alcinfo">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Alcinfo.Nsk</title>
</head>
<body>

<div id="alcinfo" align="center"></div>
<script src="jquery.js"></script>	
<script type="text/javascript">
 function show() {
  $.ajax({
   url: "alcoinf.php",
   cache: false,
   success: function(html){
    $("#alcinfo").html(html);
   }
  });
 }
 $(document).ready( function() {
  show();
  setInterval('show()',30000);
 });
</script>
<noscript><p><small>для работы приложения нужен JavaScript!</small></p></noscript>
</body>
</html>
Файл tmpl.html - стиль и шаблон для обновляемого элемента внутри alcinfo
<div style="
 background: <!bgcolor>;
 color: #000000; /* Цвет текста */
 font-size: 12px;
 border: 2px solid CornflowerBlue;
 padding: 5px; /* Поля вокруг текста */
 -moz-border-radius: 15px; /* Для Firefox 3 */
 -webkit-border-radius: 15px; /* Для Safari 4 и Chrome */
 border-radius: 15px; /* Для современных браузеров */
 width: 200px;
">
<!alert><br><!timemsg> <!time>
</div>

Так как используются закруглённые рамки из CSS3, в старых браузерах, вроде Internet Explorer 8 и ниже, смотреться не будет :)

Файл alcoinf.php - скрипт для формирования вывода в элементе alcinfo
<?php
 //Часть настроек
 $bad_dates = Array ('9 May','last Sunday of June'); //Список стоп-дат
  //http://php.ru/manual/datetime.formats.relative.html
 date_default_timezone_set ('Asia/Almaty'); //Часовой пояс
  //http://ru2.php.net/manual/en/timezones.php
 $time_1 = '09:00';  //Стоп-время "до открытия"
 $time_2 = '22:00';  //и "после закрытия"
 $red = '#FF0000'; //Цвета фона
 $yellow = '#FFFF00';
 $green = '#00FF00';
 //Дальше - программируемая часть
 $needver = '5.3.0'; //Требуемая версия PHP
 if (version_compare(PHP_VERSION, $needver, '<=')) {    
  echo 'Скрипт требует PHP версии не ниже '.$needver.'. Ваша версия: '.PHP_VERSION;
  exit(1);
 }
 $today = date_create('today'); //Сегодня (полночь)
 list ($h1,$m1) = explode(':',$time_1); date_time_set ($today,$h1,$m1); $time1 = date_timestamp_get($today); 
  //Открылось сегодня
 list ($h2,$m2) = explode(':',$time_2); date_time_set ($today,$h2,$m2); $time2 = date_timestamp_get($today); 
  //Закрылось сегодня
 $today = date_timestamp_get(date_create('today')); //Вернём сегодня (полночь)
 $time = time(); //Сейчас
 $tomorrow = date_timestamp_get(date_create('tomorrow')); //Следующее открытие
 do {
  $found = found_in_list($bad_dates,$tomorrow);
  if (!$found) break;
  $tomorrow += 86400;
 } while (true);
 $next_open = date_create(); 
 if ($time<$time1) $nextopen = $time1;
 else { 
  date_timestamp_set($next_open, $tomorrow+$h1*3600+$m1*60); $nextopen = date_timestamp_get($next_open); 
 }
 $evening = date_timestamp_get(date_create("today $time_2")); //Следующее закрытие
 do {
  $found = found_in_list($bad_dates,$evening);
  if (!$found) break;
  $evening += 86400;
 } while (true);
 $next_shut = date_create(); date_timestamp_set($next_shut, $evening); $nextshut = date_timestamp_get($next_shut);
 if (found_in_list ($bad_dates,$today)>0) {
  template($red,'Сегодня не продают :(','До открытия',$nextopen);
  exit(0);
 }
 else if (found_in_list ($bad_dates,date_timestamp_get(date_create('tomorrow')))>0) {
  if ($time>=$time1 and $time<=$time2)
   template($yellow,'Внимание! Завтра не продают','До закрытия',$nextshut);
  else {
   template($red,'Внимание! Завтра не продают','До открытия',$nextopen);
  }
  exit(0);
 }
 $color = '';
 if ($time<$time1 and abs($time-$time1)<=15*60 or $time<$time2 and abs($time-$time2)<=15*60) $color = $yellow;
 if ($time>=$time1 and $time<=$time2) { 
  if (empty($color)) $color=$green;
  template($color,'Открыто!','До закрытия',$nextshut); 
 }
 else { 
  if (empty($color)) $color=$red;
  template($color,'Закрыто!','До открытия',$nextopen); 
 }

 function found_in_list ($bad_dates,$t) {
  foreach ($bad_dates as $bad_date) {
   $date = date_create ($bad_date);
   if (!$date) {
    continue; //Просто продоллжаем при неверной дате в списке! Как бы надо - ниже
    //$e = date_get_last_errors(); foreach ($e['errors'] as $error) echo $error."<br>\n"; exit(1);
   }
   if (date_timestamp_get ($date) == $t) return $t;
  }
  return 0;
 }

 function gettime ($time) {
  $d = date_create(); date_timestamp_set($d, $time); $t2 = date_timestamp_get($d);
  $t = date_create('now'); $t1 = date_timestamp_get($t); 
  $minutes = round(abs($t2-$t1)/60);
  return sprintf('%02d:%02d', floor($minutes/60), $minutes%60); 
 }
 
 function template($bgcolor,$alert,$timemsg,$time) {
  $tmpl = @file_get_contents('tmpl.html');
  $tmpl = str_replace('<!bgcolor>',$bgcolor,$tmpl);
  $tmpl = str_replace('<!alert>',$alert,$tmpl);
  $tmpl = str_replace('<!timemsg>',$timemsg,$tmpl);
  $tmpl = str_replace('<!time>',gettime($time),$tmpl);
  echo "$tmpl";
 }
?>

В комплекте прилагается первая попавшаяся версия JQuery 1.2.6. Разумеется, на локальном компьютере скрипт нужно устанавливать на сервер, а "кликом по файлу", то есть, при запуске по протоколу file://, ничего не выйдет.

P.S. Также обратите внимание, что может понадобиться правильная настройка часового пояса в начале файла alcoinf.php. Для Новосибирска, например, после очередного перехода из 6 в 7 часовой пояс (24 июля 2016 г.) подойдёт настройка Asia/Bangkok :)

 Скачать файлы скрипта Alcinfo.Nsk в архиве .zip (19 Кб)

 Список моих маленьких скриптов онлайн

02.07.2015, 18:45 [10180 просмотров]


теги: время php сервис дата новосибирск алкоголь jquery

К этой статье пока нет комментариев, Ваш будет первым