Помощник (Хелпер) - Календарь
Доброго времени суток всем!
Не пинайте сильно, если это уже где-то есть. Просто, значит, не нашел и написал своё для решения простейшей задачи - выяснения по дате рабочий это день или нет и поиска первого рабочего дня после даты. Ниже привожу код основного класса, а также ссылки на архивы с кодом и с дампом таблицы с производственными календарями на 2013-2014 годы.
И так... Все коды можно найти по ссылке -
Содержимое архива необходимо положить в папку /modules/core/
Пример использования Хелпера:
<?php
echo "Статус для даты 2013-11-14 - ".Core_Calendar::getDateStatus('2013-11-14')."<br/>";
echo "Первый рабочий день после 2013-12-31 - ".Core_Calendar::getFirstWorkingDayAfterDate('2013-12-31')."<br/>";
echo "Первый рабочий день после текущей даты - ".Core_Calendar::getFirstWorkingDayAfterUnixDate(time(),'Y-m-d');
?>
Вот код основного класса:
<?php
defined('HOSTCMS') || exit('HostCMS: access denied.');
/**
* Calendar helper
*
* @package HostCMS 6\Core
* @version 6.x
* @author InnovInt CJSC
* @copyright © 2013 ЗАО "ИнновИнт",
*/
class Core_Calendar {
//
// Core_Calendar::getFirstWorkingDayAfterDate($date,$format="Y-m-d")
//
// Метод возвращает первый рабочий день после указанной даты в запрошенном формате $format (по умолчанию - Y-m-d)
// $date - дата в формате Y-m-d
//
// Результат: дата в запрошенном формате или false, если такую дату найти не удалось
//
public static function getFirstWorkingDayAfterDate($date,$format="Y-m-d") {
$oDay = Core_Entity::factory('Core_Calendar_Day');
$oDay->queryBuilder()->where('date', '>', $date)->where('workday','=',1)->orderBy('date')->limit(1);
$aDay = $oDay->findAll();
$result = false;
if (count($aDay)>0) {
$time = DateTime::createFromFormat('Y-m-d', $aDay[0]->date);
$result = $time->format($format);
}
return $result;
}
//
// Core_Calendar::getFirstWorkingDayAfterUnixDate($date,$format="U")
//
// Метод возвращает первый рабочий день после указанной даты в запрошенном формате $format (по умолчанию - U)
// $date - дата в формате UnixTimeStamp
//
// Результат: дата в запрошенном формате или false, если такую дату найти не удалось
//
public static function getFirstWorkingDayAfterUnixDate($date,$format="U") {
return self::getFirstWorkingDayAfterDate(date('Y-m-d',$date),$format);
}
//
// Core_Calendar::getDateStatus($date)
//
// Метод возвращает cтатус запрошенной даты
// $date - дата в формате Y-m-d
//
// Результат: 1 - рабочий день, 0 - выходной день или праздник
//
public static function getDateStatus($date) {
$result = false;
$oDay = Core_Entity::factory('Core_Calendar_Day');
$oDay->queryBuilder()->where('date', '=', $date);
$aDay = $oDay->findAll();
if (count($aDay) > 0) {
$result = $aDay[0]->workday;
}
return $result;
}
//
// Core_Calendar::getUnixDateStatus($date)
//
// Метод возвращает cтатус запрошенной даты
// $date - дата в формате U (UnixTimeStamp)
//
// Результат: 1 - рабочий день, 0 - выходной день или праздник
//
public static function getUnixDateStatus($date) {
return self::getDateStatus(date('Y-m-d',$date));
}
}
По следующей ссылке архив с дампом таблицы. В ней производственные календари на 2013-2014 годы. SQL можно выполнить или через Системные функции->SQL-запросы или через phpMyAdmin или любым другим удобным вам способом.
Если есть пожелания по включению какой-либо ещё полезной информации в календарь,
то пишите тут, подумаем. Добавим.
Для тех, кому надо отредактировать выходные дни - ищите таблицу calendar_days. В ней все банально просто
Не пинайте сильно, если это уже где-то есть. Просто, значит, не нашел и написал своё для решения простейшей задачи - выяснения по дате рабочий это день или нет и поиска первого рабочего дня после даты. Ниже привожу код основного класса, а также ссылки на архивы с кодом и с дампом таблицы с производственными календарями на 2013-2014 годы.
И так... Все коды можно найти по ссылке -
Содержимое архива необходимо положить в папку /modules/core/
Пример использования Хелпера:
<?php
echo "Статус для даты 2013-11-14 - ".Core_Calendar::getDateStatus('2013-11-14')."<br/>";
echo "Первый рабочий день после 2013-12-31 - ".Core_Calendar::getFirstWorkingDayAfterDate('2013-12-31')."<br/>";
echo "Первый рабочий день после текущей даты - ".Core_Calendar::getFirstWorkingDayAfterUnixDate(time(),'Y-m-d');
?>
Вот код основного класса:
<?php
defined('HOSTCMS') || exit('HostCMS: access denied.');
/**
* Calendar helper
*
* @package HostCMS 6\Core
* @version 6.x
* @author InnovInt CJSC
* @copyright © 2013 ЗАО "ИнновИнт",
*/
class Core_Calendar {
//
// Core_Calendar::getFirstWorkingDayAfterDate($date,$format="Y-m-d")
//
// Метод возвращает первый рабочий день после указанной даты в запрошенном формате $format (по умолчанию - Y-m-d)
// $date - дата в формате Y-m-d
//
// Результат: дата в запрошенном формате или false, если такую дату найти не удалось
//
public static function getFirstWorkingDayAfterDate($date,$format="Y-m-d") {
$oDay = Core_Entity::factory('Core_Calendar_Day');
$oDay->queryBuilder()->where('date', '>', $date)->where('workday','=',1)->orderBy('date')->limit(1);
$aDay = $oDay->findAll();
$result = false;
if (count($aDay)>0) {
$time = DateTime::createFromFormat('Y-m-d', $aDay[0]->date);
$result = $time->format($format);
}
return $result;
}
//
// Core_Calendar::getFirstWorkingDayAfterUnixDate($date,$format="U")
//
// Метод возвращает первый рабочий день после указанной даты в запрошенном формате $format (по умолчанию - U)
// $date - дата в формате UnixTimeStamp
//
// Результат: дата в запрошенном формате или false, если такую дату найти не удалось
//
public static function getFirstWorkingDayAfterUnixDate($date,$format="U") {
return self::getFirstWorkingDayAfterDate(date('Y-m-d',$date),$format);
}
//
// Core_Calendar::getDateStatus($date)
//
// Метод возвращает cтатус запрошенной даты
// $date - дата в формате Y-m-d
//
// Результат: 1 - рабочий день, 0 - выходной день или праздник
//
public static function getDateStatus($date) {
$result = false;
$oDay = Core_Entity::factory('Core_Calendar_Day');
$oDay->queryBuilder()->where('date', '=', $date);
$aDay = $oDay->findAll();
if (count($aDay) > 0) {
$result = $aDay[0]->workday;
}
return $result;
}
//
// Core_Calendar::getUnixDateStatus($date)
//
// Метод возвращает cтатус запрошенной даты
// $date - дата в формате U (UnixTimeStamp)
//
// Результат: 1 - рабочий день, 0 - выходной день или праздник
//
public static function getUnixDateStatus($date) {
return self::getDateStatus(date('Y-m-d',$date));
}
}
По следующей ссылке архив с дампом таблицы. В ней производственные календари на 2013-2014 годы. SQL можно выполнить или через Системные функции->SQL-запросы или через phpMyAdmin или любым другим удобным вам способом.
Если есть пожелания по включению какой-либо ещё полезной информации в календарь,
то пишите тут, подумаем. Добавим.Для тех, кому надо отредактировать выходные дни - ищите таблицу calendar_days. В ней все банально просто

ИнновИнт
Авторизация