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