[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).
Несколько вызовов не будут мешать друг другу, т.е. вы можете выводить как контент по периоду, так и контент в определённую дату, даже если эта дата попадает в этот период.
Комментарии: 1
Ух ты! Осенний код подъехал, спасибо! Всегда жара с заявками в праздники, может и пригодится!
Тоже решаю такие квесты регулярно, поэтому позволю себе задать вопрос)
Просто интересно, а ты не пробовал стандартные для Revo планируемые даты публикации прикрутить для этих целей как-то?
Имею в виду перед тем, как решение выработал. Сниппет конечно круче, т.к. он универсальный, один раз поставил, и будет срабатывать каждый год))
Тоже горожу сниппеты, но сейчас подумал, что по-простому кажется можно было типа такого
Как думаешь, @Денис Усманов, рабочая это схема для одноразовых событий?
Тоже решаю такие квесты регулярно, поэтому позволю себе задать вопрос)
Просто интересно, а ты не пробовал стандартные для Revo планируемые даты публикации прикрутить для этих целей как-то?
Имею в виду перед тем, как решение выработал. Сниппет конечно круче, т.к. он универсальный, один раз поставил, и будет срабатывать каждый год))
Тоже горожу сниппеты, но сейчас подумал, что по-простому кажется можно было типа такого
[[#8.published:is=`1`:then=`[[#8.content]]`]]
выводить в шаблоне страницы, а в стандартных полях ресурса (с id=8 из моего примера) ставить планируемую дату публикации, и снятия с публикации, вот эти:Как думаешь, @Денис Усманов, рабочая это схема для одноразовых событий?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.