[HolidaysContent] Вывод контента в определённую дату и/или период времени

Всем привет, поступила банальная на первый взгляд задача, выводить в праздничные дни оформление тематическое… Всё бы ничего, просто написать сниппет который проверяет текущую дату и выводит при совпадении… Но как быть с новым годом? Заказчик просит с 20.12 текущего года, по 10.01 соответственно следующего года показывать снег на сайте, тут уже нужно учитывать период, год начала и конца события.

Не стал искать решения на просторах интернета, решил написать самостоятельно, за одно подтянуть в очередной раз свои знания в 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).
Несколько вызовов не будут мешать друг другу, т.е. вы можете выводить как контент по периоду, так и контент в определённую дату, даже если эта дата попадает в этот период.
Денис Усманов
8 часов назад
modx.pro
3
64
+3

Комментарии: 1

Дима Касаткин
2 часа назад
0
Ух ты! Осенний код подъехал, спасибо! Всегда жара с заявками в праздники, может и пригодится!

Тоже решаю такие квесты регулярно, поэтому позволю себе задать вопрос)

Просто интересно, а ты не пробовал стандартные для Revo планируемые даты публикации прикрутить для этих целей как-то?

Имею в виду перед тем, как решение выработал. Сниппет конечно круче, т.к. он универсальный, один раз поставил, и будет срабатывать каждый год))

Тоже горожу сниппеты, но сейчас подумал, что по-простому кажется можно было типа такого
[[#8.published:is=`1`:then=`[[#8.content]]`]]
выводить в шаблоне страницы, а в стандартных полях ресурса (с id=8 из моего примера) ставить планируемую дату публикации, и снятия с публикации, вот эти:


Как думаешь, @Денис Усманов, рабочая это схема для одноразовых событий?
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1