Xor

 
<<< Назад

Todoer: календарь на год

После переезда исключил показ календаря на год из модуля предыдущая статья. Для возможности повторения каждый может выбрать сам внешний вид при формировании календаря из тысяч возможных примеров. Вот один из них:
скрипт

    class Calendar 
{
    /**
     * Вывод календаря на один месяц.
     */
    public static function  getMonth($month, $year, $events = array())
    {
        $months = array(
            1  => 'Январь',
            2  => 'Февраль',
            3  => 'Март',
            4  => 'Апрель',
            5  => 'Май',
            6  => 'Июнь',
            7  => 'Июль',
            8  => 'Август',
            9  => 'Сентябрь',
            10 => 'Октябрь',
            11 => 'Ноябрь',
            12 => 'Декабрь'
        );

        $month = intval($month);
        $out = '
        <link rel="stylesheet" type="text/css" href="\css\cld.css">
        <div class="calendar-item">
            <div class="calendar-head">' . $months[$month] . ' ' . $year . '</div>
            <table>
                <tr>
                    <th>Пн</th>
                    <th>Вт</th>
                    <th>Ср</th>
                    <th>Чт</th>
                    <th>Пт</th>
                    <th>Сб</th>
                    <th>Вс</th>
                </tr>';

        $day_week = date('N', mktime(0, 0, 0, $month, 1, $year));
        $day_week--;

        $out.= '<tr>';

        for ($x = 0; $x < $day_week; $x++) {
            $out.= '<td></td>';
        }

        $days_counter = 0;      
        $days_month = date('t', mktime(0, 0, 0, $month, 1, $year));

        for ($day = 1; $day <= $days_month; $day++) {
            if (date('j.n.Y') == $day . '.' . $month . '.' . $year) {
                $class = 'today';
            } elseif (time() > strtotime($day . '.' . $month . '.' . $year)) {
                $class = 'last';
            } else {
                $class = '';
            }

            $event_show = false;
            $event_text = array();
            if (!empty($events)) {
              foreach ($events as $event) {
                foreach ($event as $date => $text) {
                    $date = explode('.', $date);
                    if (count($date) == 3) {
                        $y = explode(' ', $date[2]);
                        if (count($y) == 2) {
                            $date[2] = $y[0];
                        }

                        if ($day == intval($date[0]) && $month == intval($date[1]) && $year == $date[2]) {
                            $event_show = true;
                            $event_text[] = $text;
                        }
                    } elseif (count($date) == 2) {
                        if ($day == intval($date[0]) && $month == intval($date[1])) {
                            $event_show = true;
                            $event_text[] = $text;
                        }
                    } elseif ($day == intval($date[0])) {
                        $event_show = true;
                        $event_text[] = $text;
                    }               
                }
              }
            }

            if ($event_show) {
                $out.= '<td class="calendar-day ' . $class . ' event">' . $day;
                if (!empty($event_text)) {
                    $out.= '<div class="calendar-popup">' . implode('<br>', $event_text) . '</div>';
                }
                $out.= '</td>';
            } else {
                $out.= '<td class="calendar-day ' . $class . '">' . $day . '</td>';
            }

            if ($day_week == 6) {
                $out.= '</tr>';
                if (($days_counter + 1) != $days_month) {
                    $out.= '<tr>';
                }
                $day_week = -1;
            }

            $day_week++; 
            $days_counter++;
        }

        $out .= '</tr></table></div>';
        return $out;
    }

    /**
     * Вывод календаря на несколько месяцев.
     */
    public static function  getInterval($start, $end, $events = array())
    {
        $curent = explode('.', $start);
        $curent[0] = intval($curent[0]);

        $end = explode('.', $end);
        $end[0] = intval($end[0]);

        $begin = true;
        $out = '<div class="calendar-wrp">';
        do {
            $out .= self::getMonth($curent[0], $curent[1], $events);

            if ($curent[0] == $end[0] && $curent[1] == $end[1]) {
                $begin = false;
            }       

            $curent[0]++;
            if ($curent[0] == 13) {
                $curent[0] = 1;
                $curent[1]++;
            }
        } while ($begin == true);   

        $out .= '</div>';
        return $out;
    }
}
$sql="SELECT a.`TITLE`, DATE_FORMAT(`DUE`, '%d.%m.%Y') due FROM `clnd_events` a
join clnd_categories cat on `CALENDAR_CATEGORY_ID`=cat.ID
where DATE_FORMAT(`DUE`, '%Y')='2023'
and cat.AT_CALENDAR=1";
$recs = SQLSelect($sql);
//echo Calendar::getMonth(date('n'), date('Y'));
$events = array();
//echo "<pre>";
//print_r($recs);
$total = count($recs); 
/////////////////////////////////////////////////////////////////////////////////////
for ($i = 0; $i < $total; $i++) {
 $events[$i] = array($recs[$i]['due']=>$recs[$i]['TITLE']) ;
}
/*
    array('16'    => 'Заплатить ипотеку'),
    array('23.02' => 'День защитника Отечества'),
    array('08.03' => 'Международный женский день'),
    array('08.03' => 'test'),
    array('31.12' => 'Новый год')
);
 */
echo Calendar::getInterval(date('01.Y'), date('12.Y'), $events);

результат:

image-1680262763447.png

update: файл \css\cld.css

.calendar-item {
    width: 200px;
    display: inline-block;
    vertical-align: top;
    margin: 0 16px 20px;
    font: 14px/1.2 Arial, sans-serif;
}
.calendar-head {
    text-align: center;
    padding: 5px;
    font-weight: 700;
    font-size: 14px;
}
.calendar-item table {
    border-collapse: collapse;
    width: 100%;
}
.calendar-item th {
    font-size: 12px;
    padding: 6px 7px;
    text-align: center;
    color: #888;
    font-weight: normal;
}
.calendar-item td {
    font-size: 13px;
    padding: 6px 5px;
    text-align: center;
    border: 1px solid #ddd;
}
.calendar-item tr th:nth-child(6), .calendar-item tr th:nth-child(7) {
    color: #e65a5a;
}
.calendar-item tr td:nth-child(6), .calendar-item tr td:nth-child(7)  {
    color: #e65a5a !important;
}   
.calendar-day.last {
    color: #999 ;
}   
.calendar-day.today {
    font-weight: bold;
}
.calendar-day.event {
    background: #ffe2ad;
    position: relative;
    cursor: pointer;
}
.calendar-day.event:hover .calendar-popup {
    display: block;
}
.calendar-popup {
    display: none;
    position: absolute;
    top: 40px;
    left: 0;
    min-width: 200px;
    padding: 15px;
    background: #fff;
    text-align: left;
    font-size: 13px;
    z-index: 100;
    box-shadow: 0 0 10px rgba(0,0,0,0.5);
    color: #000;
}
.calendar-popup:before {
    content: ""; 
    border: solid transparent;
    position: absolute;    
    left: 8px;    
    bottom: 100%;
    border-bottom-color: #fff;
    border-width: 9px;
    margin-left: 0;
}

update2: Использование в интерфейсе МДМ (домашние страницы)
форум

Обсуждение (1) (1)

Смотрите так же:
03.04.2023 Todoer: обмен данными с Яндекс календарём
30.03.2023 Todoer: анонс + программное создание задачи
08.05.2022 Глобальный поиск - добавление своих сущностей. Upd Внедрено
05.01.2022 Яндекс Лампочка в Yandex Devices - добавление сцен
18.04.2021 Переезд на мастер спустя год
24.03.2021 Ещё о старте/остановке МДМ в Винде
18.02.2021 Модуль Todoer
06.01.2021 Для виндузятников - перенос бд на рам-диск
22.11.2020 Календарь-планировщик
01.08.2020 Irbis как терминал
18.05.2020 Китайская камера rtsp + vlc как перекодировщик для html
12.05.2020 Опыт интеграции МДМ с Я.Алисой ещё одним способом - без белого адреса, москита, ПУ.(дополнено)
07.05.2020 Поправим формат даты в Панели управления
11.04.2020 Баловство с шаблонами
26.03.2020 Простые правила - вариант модуля. ч. 2
25.03.2020 Простые правила - вариант модуля
20.12.2019 расширение средств работы с events updated
20.11.2019 По следам наших выступлений - сколько мы наэкономили?
04.11.2019 Группа как объект - экономим на коде - 2
26.10.2019 Прикручиваем Grafana к Мажордому
11.10.2019 Группа как объект - экономим на коде
25.09.2019 Если у вас нет телеги...
11.09.2019 Датчик присутствия из ип камеры
30.07.2019 Win-платформа-замена ffmpeg для получения скриншотов из rstp - потока
24.06.2019 Форматированный отчет в телеграм - имитация таблицы
30.04.2019 Используем зомбо-ящик в Мажордомо
24.03.2019 О среднем в Мажордомо
31.10.2018 Об "обделённых" пользователях Win-систем -- с точки зрения кэширования winTTS сообщений
16.09.2018 Перезагрузка Мажордомо в Win-системах

Домодедово, Россия

На форуме: xor