Вы сказали:
не выводит по датам выбранным в календаре
document.addEventListener('DOMContentLoaded', function () {
let calendarEl = document.getElementById('lesson-calendar');
let calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
locale: 'ru',
height: 'auto',
selectable: true,
events: function (info, successCallback, failureCallback) {
let params = {
action: 'get_calendar_lessons',
start: info.startStr,
end: info.endStr
};
if (ROLE === 'student') {
params.student_id = STUDENT_ID;
}
$.getJSON('api.php', params, function (data) {
successCallback(data);
}).fail(function () {
failureCallback();
});
},
/* выбор диапазона дат */
select: function (info) {
$('#date_from').val(info.startStr);
$('#date_to').val(info.endStr);
loadLessons();
},
/* клик по уроку */
eventClick: function (info) {
let lessonId = info.event.id;
/* выбираем урок в списке */
$(
.lesson-item[data-id="${lessonId}"]).trigger('click');
/* снимаем подсветку в календаре */
info.event.setProp('backgroundColor', '#0d6efd');
info.event.setProp('borderColor', '#0d6efd');
}
});
calendar.render();
/* сохраняем глобально, понадобится позже */
window.lessonCalendar = calendar;
});
function loadLessons(sort='get_lessons') {
//let sort = $('.sort-lessons').val(); // last_lessons / change_lessons
//let sort = $('.sort-lessons').find('option:selected').val();
//let action = 'get_lessons';
let action = sort;
/*if (sort === 'change_lessons') {
action = 'get_lessons_change';
}*/
console.log(sort);
let params = { action: action };
//let params = { action: 'get_lessons' };
if (ROLE === 'student') {
params.student_id = STUDENT_ID;
}
$.getJSON('api.php', params, function(data) {//{action: 'get_lessons'}
$('#lesson-list').html('');
let html = '';
if (data.length === 0) {
//$('#lesson-list').html('<p>Уроки отсутствуют</p>');//
html = '<p>Уроки отсутствуют</p>';
//return;
}else{
data.forEach(function(lesson) {
/*$('#lesson-list').append(
<div class="p-2 lesson-item" data-id="${lesson.id}">
<strong>${lesson.topic}</strong><br>
<small>${lesson.date} | ${lesson.student_name}</small>
</div>
);*/
/*html +=
<div class="p-2 lesson-item" data-id="${lesson.id}">
<strong>${lesson.topic}</strong><br>
<small>${lesson.date} | ${lesson.student_name}</small>
</div>;*/
let changedClass = lesson.is_changed ? 'changed' : '';
let changedIcon = lesson.is_changed
? '<i class="bi bi-bell-fill changed-icon"></i>'
: '';
html +=
<div class="p-2 lesson-item ${changedClass}" data-id="${lesson.id}">
${changedIcon}
<strong>${lesson.topic}</strong><br>
<small>${lesson.date} | ${lesson.student_name}</small>
</div>
;
});
}
$('#lesson-list').html(html);
$('#left-panel-mobile').html(html);
if (LESSON_ID) {
$(.lesson-item[data-id="${LESSON_ID}"]).trigger('click');
}
}).fail(function(jqXHR, textStatus, errorThrown){
console.log("Ошибка AJAX:", textStatus, errorThrown);
$('#lesson-list, #left-panel-mobile').html('<p>Ошибка загрузки уроков</p>');
});
}
loadLessons();
limitLessonScroll();
$(document).on('change', '.sort-lessons', function () {
loadLessons($(this).val());
});
<div class="col-md-3 col-lg-2 border-end d-none d-md-block" id="left-panel">
<!--<div class="col-12 col-md-3 col-lg-2 border-end" id="left-panel">-->
<h5 class="mt-3">Уроки</h5>
<div class="mb-3 mt-3">
<!-- <label>выбрать сортировку</label> -->
<select class="form-control form-select sort-lessons">
<option value="get_lessons" selected>Все уроки</option>
<option value="get_lessons_change">Измененые уроки</option>
</select>
</div>
<div id="lesson-list"></div>
<div class="mt-4">
<h6 class="mb-2">Календарь</h6>
<div id="lesson-calendar"></div>
</div>
</div>
if($action == 'get_lesson'){
$id = $_GET['id'] ?? 0;
$res = $db->query("SELECT * FROM lessons WHERE id=$id");
$lesson = $res->fetchArray(SQLITE3_ASSOC);
if(!$lesson){
echo json_encode(['status'=>'error','message'=>'Урок не найден']);
exit;
}
$lesson['link_l'] = 'https://'.$_SERVER['HTTP_HOST'].'/?lesson='.$id.'-'.md5($id.'lesson+');
// Получаем имя студента
$student_res = $db->query("SELECT name FROM students WHERE id=".$lesson['student_id']);
$student_row = $student_res->fetchArray(SQLITE3_ASSOC);
$lesson['student_name'] = $student_row['name'] ?? '';
echo json_encode($lesson);
exit;
}
if ($action == 'get_lessons_change') {
$where = '';
/* если ученик — показываем только его уроки */
if ($role === 'student') {
$sid = (int)$_GET['student_id'];
$where = " AND l.student_id = $sid";
}
$sql = "
SELECT DISTINCT
l.id,
l.topic,
l.date,
s.name AS student_name
FROM lessons l
INNER JOIN homework h ON h.lesson_id = l.id
INNER JOIN notifications n ON n.homework_id = h.id
LEFT JOIN students s ON s.id = l.student_id
WHERE n.is_read = 0
$where
ORDER BY l.id DESC
";
$res = $db->query($sql);
$lessons = [];
while ($row = $res->fetchArray(SQLITE3_ASSOC)) {
$lessons[] = [
'id' => $row['id'],
'topic' => $row['topic'],
'date' => $row['date'],
'student_name' => $row['student_name'],
'link_l' => 'https://' . $_SERVER['HTTP_HOST'] .
'/?lesson=' . $row['id'] . '-' . md5($row['id'] . 'lesson+')
];
}
echo json_encode($lessons);
exit;
}
if ($action === 'get_calendar_lessons') {
$where = [];
/* фильтр по роли */
if ($role === 'student') {
$sid = (int)$_GET['student_id'];
$where[] = "l.student_id = $sid";
}
/* диапазон дат */
if (!empty($_GET['start'])) {
$start = $_GET['start'];
$where[] = "l.date >= '$start'";
}
if (!empty($_GET['end'])) {
$end = $_GET['end'];
$where[] = "l.date <= '$end'";
}
$where_sql = '';
if (!empty($where)) {
$where_sql = 'WHERE ' . implode(' AND ', $where);
}
$sql = "
SELECT
l.id,
l.topic,
l.date,
s.name AS student_name,
CASE
WHEN EXISTS (
SELECT 1
FROM homework h
INNER JOIN notifications n ON n.homework_id = h.id
WHERE h.lesson_id = l.id
AND n.is_read = 0
)
THEN 1
ELSE 0
END AS is_changed
FROM lessons l
LEFT JOIN students s ON s.id = l.student_id
$where_sql
";
$res = $db->query($sql);
$events = [];
while ($row = $res->fetchArray(SQLITE3_ASSOC)) {
$events[] = [
'id' => $row['id'],
'title' => $row['topic'] . ' (' . $row['student_name'] . ')',
'start' => $row['date'],
'allDay' => true,
/* цвет для изменённых уроков */
'backgroundColor' => $row['is_changed'] ? '#fff3cd' : '#0d6efd',
'borderColor' => $row['is_changed'] ? '#ffc107' : '#0d6efd',
'extendedProps' => [
'is_changed' => (int)$row['is_changed']
]
];
}
echo json_encode($events);
exit;
}