[HolidaysContent] Вывод контента в определённую дату и/или период времени
Всем привет, поступила банальная на первый взгляд задача, выводить в праздничные дни оформление тематическое… Всё бы ничего, просто написать сниппет который проверяет текущую дату и выводит чанк при совпадении… Но как быть с новым годом? Заказчик просит с 20.12 текущего года, по 10.01 соответственно следующего года показывать снег на сайте, тут уже нужно учитывать период, год начала и конца события.
Не стал искать решения на просторах интернета, решил написать самостоятельно, за одно подтянуть в очередной раз свои знания в PHP… Как сделал, всё же посмотрел на modstore.pro, есть ли какие ни будь подобные компоненты, оказывается есть My_holidays, почитал описание, показалось, что он не совсем мне удобен возможно.
В общем и целом, надеюсь кому нибудь пригодится мой сниппет)
Сниппет HolidaysContent
Использование:
В определённую дату, например 8 марта
Новый год, с 20.12 текущего года, по 10.01 следующего года
Обратите внимание, что параметр date — приоритетнее параметров периода (start/end).
Несколько вызовов не будут мешать друг другу, т.е. вы можете выводить как контент по периоду, так и контент в определённую дату, даже если эта дата попадает в этот период.
Не стал искать решения на просторах интернета, решил написать самостоятельно, за одно подтянуть в очередной раз свои знания в PHP… Как сделал, всё же посмотрел на modstore.pro, есть ли какие ни будь подобные компоненты, оказывается есть My_holidays, почитал описание, показалось, что он не совсем мне удобен возможно.
В общем и целом, надеюсь кому нибудь пригодится мой сниппет)
Сниппет HolidaysContent
<?php
$date = $modx->getOption('date', $scriptProperties, '');
$start = $modx->getOption('start', $scriptProperties, '');
$end = $modx->getOption('end', $scriptProperties, '');
$chunk = $modx->getOption('tpl', $scriptProperties, '');
$currentTimestamp = time();
$currentYear = date('Y');
// Проверяем, совпадает ли текущая дата с указанной датой
if (!empty($date)) {
$dateWithYear = $date . '.' . $currentYear;
$dateTimestamp = strtotime($dateWithYear);
if ($dateTimestamp !== false && date('d.m', $currentTimestamp) == date('d.m', $dateTimestamp)) {
return $modx->getChunk($chunk);
}
}
// Проверяем, попадает ли текущая дата в указанный период
if (!empty($start) && !empty($end)) {
// Определяем год для начала и конца периода
list($startDay, $startMonth, $startYear) = explode('.', $start);
list($endDay, $endMonth, $endYear) = explode('.', $end);
// Определяем год для начала периода
if ($startYear == 'this') {
$startYear = $currentYear;
} elseif ($startYear == 'next') {
$startYear = $currentYear + 1;
} else {
$startYear = $currentYear;
}
// Определяем год для конца периода
if ($endYear == 'this') {
$endYear = $currentYear;
} elseif ($endYear == 'next') {
$endYear = $currentYear + 1;
} else {
$endYear = $currentYear;
}
$startWithYear = $startDay . '.' . $startMonth . '.' . $startYear;
$endWithYear = $endDay . '.' . $endMonth . '.' . $endYear;
$startTimestamp = strtotime($startWithYear);
$endTimestamp = strtotime($endWithYear);
// Если период пересекает новый год, нужно учесть это
if ($startTimestamp > $endTimestamp) {
// Проверяем, если текущая дата попадает в период пересекающий год
if ($currentTimestamp >= $startTimestamp || $currentTimestamp < $endTimestamp) {
return $modx->getChunk($chunk);
}
} else {
if ($currentTimestamp >= $startTimestamp && $currentTimestamp <= $endTimestamp) {
return $modx->getChunk($chunk);
}
}
}Использование:
В определённую дату, например 8 марта
[[!HolidaysContent? date=`08.03` &tpl=`8march`]]Новый год, с 20.12 текущего года, по 10.01 следующего года
[[!HolidaysContent? start=`20.12.this` &end=`10.01.next` &tpl=`newyear`]]Обратите внимание, что параметр date — приоритетнее параметров периода (start/end).
Несколько вызовов не будут мешать друг другу, т.е. вы можете выводить как контент по периоду, так и контент в определённую дату, даже если эта дата попадает в этот период.
Комментарии: 7
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Тоже решаю такие квесты регулярно, поэтому позволю себе задать вопрос)
Просто интересно, а ты не пробовал стандартные для Revo планируемые даты публикации прикрутить для этих целей как-то?
Имею в виду перед тем, как решение выработал. Сниппет конечно круче, т.к. он универсальный, один раз поставил, и будет срабатывать каждый год))
Тоже горожу сниппеты, но сейчас подумал, что по-простому кажется можно было типа такого
выводить в шаблоне страницы, а в стандартных полях ресурса (с id=8 из моего примера) ставить планируемую дату публикации, и снятия с публикации, вот эти:
Как думаешь, @Денис Усманов, рабочая это схема для одноразовых событий?
Указал год — сработает только для него. Не указал, ежегодно. Если длительность не указана, то она равна 1 дню.
1. Работать с датами можно через объект DateTime. Насколько помню там даже можно просто сравнивать даты обычным оператором $myDate > $yourDate
2. Может быть имеет смысл не привязываться к году, а просто выводить за столько то дней до и после определённой даты. Новый год всегда 1 января не важно какого года, другие праздники тоже.
3. На мой взгляд удобнее и нагляднее вместо:
писать в таком стиле:
4. Я всегда стараюсь делать один return в сниппетах или функциях. Для меня лично тоже так удобнее и нагляднее (единая точка выхода).