Xor

 
<<< Back

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: Использование в интерфейсе МДМ (домашние страницы)
форум

Discuss (1) (3)

See also:
2024-02-12 Китайская панель в подрозетник с экраном 480*480
2023-10-29 MQTT в МДМ - способ обработки топика через метод
2023-04-03 Todoer: обмен данными с Яндекс календарём
2023-03-30 Todoer: анонс + программное создание задачи
2022-05-08 Глобальный поиск - добавление своих сущностей. Upd Внедрено
2022-01-05 Яндекс Лампочка в Yandex Devices - добавление сцен
2021-04-18 Переезд на мастер спустя год
2021-03-24 Ещё о старте/остановке МДМ в Винде
2021-02-18 Модуль Todoer
2021-01-06 Для виндузятников - перенос бд на рам-диск
2020-11-22 Календарь-планировщик
2020-08-01 Irbis как терминал
2020-05-18 Китайская камера rtsp + vlc как перекодировщик для html
2020-05-12 Опыт интеграции МДМ с Я.Алисой ещё одним способом - без белого адреса, москита, ПУ.(дополнено)
2020-05-07 Поправим формат даты в Панели управления
2020-04-11 Баловство с шаблонами
2020-03-26 Простые правила - вариант модуля. ч. 2
2020-03-25 Простые правила - вариант модуля
2019-12-20 расширение средств работы с events updated
2019-11-20 По следам наших выступлений - сколько мы наэкономили?
2019-11-04 Группа как объект - экономим на коде - 2
2019-10-26 Прикручиваем Grafana к Мажордому
2019-10-11 Группа как объект - экономим на коде
2019-09-25 Если у вас нет телеги...
2019-09-11 Датчик присутствия из ип камеры
2019-07-30 Win-платформа-замена ffmpeg для получения скриншотов из rstp - потока
2019-06-24 Форматированный отчет в телеграм - имитация таблицы
2019-04-30 Используем зомбо-ящик в Мажордомо
2019-03-24 О среднем в Мажордомо
2018-10-31 Об "обделённых" пользователях Win-систем -- с точки зрения кэширования winTTS сообщений
2018-09-16 Перезагрузка Мажордомо в Win-системах

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

На форуме: xor