prepare("SELECT * FROM teachers WHERE school_id = ? ORDER BY name"); $stmt->execute([$school_id]); return $stmt->fetchAll(PDO::FETCH_ASSOC); } function get_timeslots($pdo) { return $pdo->query("SELECT * FROM timeslots ORDER BY start_time")->fetchAll(PDO::FETCH_ASSOC); } function get_teacher_schedule($pdo, $teacher_id) { $sql = " -- Get all lessons (elective and non-elective) for a teacher SELECT s.id, s.day_of_week, s.timeslot_id, s.lesson_display_name, c.name as class_name, s.is_double, s.is_elective, eg.name as elective_group_name FROM schedules s JOIN schedule_teachers st ON s.id = st.schedule_id LEFT JOIN classes c ON s.class_id = c.id LEFT JOIN elective_groups eg ON s.elective_group_id = eg.id WHERE st.teacher_id = :teacher_id ORDER BY s.day_of_week, s.timeslot_id "; $stmt = $pdo->prepare($sql); $stmt->execute([':teacher_id' => $teacher_id]); return $stmt->fetchAll(PDO::FETCH_ASSOC); } // --- Main Logic --- $pdoconn = db(); $school_id = $_SESSION['school_id']; $role = $_SESSION['role']; $user_id = $_SESSION['user_id']; $teachers = []; if ($role === 'admin') { $stmt = $pdoconn->prepare("SELECT * FROM teachers WHERE school_id = ? ORDER BY name"); $stmt->execute([$school_id]); $teachers = $stmt->fetchAll(PDO::FETCH_ASSOC); } else { // Teacher $stmt = $pdoconn->prepare("SELECT * FROM teachers WHERE user_id = ? AND school_id = ?"); $stmt->execute([$user_id, $school_id]); $teachers = $stmt->fetchAll(PDO::FETCH_ASSOC); } $timeslots = get_timeslots($pdoconn); $days_of_week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']; $selected_teacher_id = null; if ($role === 'admin') { $selected_teacher_id = isset($_GET['teacher_id']) ? $_GET['teacher_id'] : null; } else { // Teacher if (!empty($teachers)) { $selected_teacher_id = $teachers[0]['id']; } } $selected_teacher_name = ''; $teacher_schedule_raw = []; if ($selected_teacher_id) { foreach ($teachers as $teacher) { if ($teacher['id'] == $selected_teacher_id) { $selected_teacher_name = $teacher['name']; break; } } $teacher_schedule_raw = get_teacher_schedule($pdoconn, $selected_teacher_id); } // Organize schedule for easy display $non_break_periods = array_values(array_filter($timeslots, function($ts) { return !$ts['is_break']; })); $timeslot_id_to_period_idx = []; foreach($non_break_periods as $idx => $period) { $timeslot_id_to_period_idx[$period['id']] = $idx; } $teacher_timetable_by_period = []; // Initialize the timetable array foreach ($days_of_week as $day_idx => $day) { $teacher_timetable_by_period[$day_idx] = array_fill(0, count($non_break_periods), null); } foreach ($teacher_schedule_raw as $lesson) { $day_idx = $lesson['day_of_week']; if (isset($timeslot_id_to_period_idx[$lesson['timeslot_id']])) { $period_idx = $timeslot_id_to_period_idx[$lesson['timeslot_id']]; if (isset($teacher_timetable_by_period[$day_idx][$period_idx])) { if (!is_array($teacher_timetable_by_period[$day_idx][$period_idx]) || !isset($teacher_timetable_by_period[$day_idx][$period_idx][0])) { $teacher_timetable_by_period[$day_idx][$period_idx] = [$teacher_timetable_by_period[$day_idx][$period_idx]]; } $teacher_timetable_by_period[$day_idx][$period_idx][] = $lesson; } else { $teacher_timetable_by_period[$day_idx][$period_idx] = $lesson; } if (!empty($lesson['is_double']) && isset($non_break_periods[$period_idx + 1])) { $next_period_idx = $period_idx + 1; if (isset($teacher_timetable_by_period[$day_idx][$next_period_idx])) { if (!is_array($teacher_timetable_by_period[$day_idx][$next_period_idx]) || !isset($teacher_timetable_by_period[$day_idx][$next_period_idx][0])) { $teacher_timetable_by_period[$day_idx][$next_period_idx] = [$teacher_timetable_by_period[$day_idx][$next_period_idx]]; } $teacher_timetable_by_period[$day_idx][$next_period_idx][] = $lesson; } else { $teacher_timetable_by_period[$day_idx][$next_period_idx] = $lesson; } } } } ?> Teacher Timetable - Haki Schedule

Teacher Timetable

Timetable for

0) { $prev_period_id = $non_break_periods[$period_idx - 1]['id']; foreach($timeslots as $ts) { if ($ts['id'] === $prev_period_id) { $last_period_end_time = $ts['end_time']; break; } } } foreach ($timeslots as $ts) { if ($ts['is_break'] && $ts['start_time'] >= $last_period_end_time && $ts['start_time'] < $timeslot_info['start_time']) { $break_html .= ''; $break_html .= ''; $break_html .= ''; $break_html .= ''; } } echo $break_html; ?> $day): ?> = $last_timeslot_end_time) { $final_break_html .= ''; $final_break_html .= ''; $final_break_html .= ''; $final_break_html .= ''; } } echo $final_break_html; ?>
Time
' . htmlspecialchars($ts['name']) . '
' . date("g:i A", strtotime($ts['start_time'])) . ' - ' . date("g:i A", strtotime($ts['end_time'])) . '
Break

-
true, 'classes' => [] ]; } if (!empty($single_lesson['class_name'])) { $lessons_by_group[$group_name]['classes'][] = $single_lesson['class_name']; } } else { $display_subject = $single_lesson['lesson_display_name']; if (!isset($lessons_by_group[$display_subject])) { $lessons_by_group[$display_subject] = [ 'is_elective' => false, 'classes' => [] ]; } if (!empty($single_lesson['class_name'])) { $lessons_by_group[$display_subject]['classes'][] = $single_lesson['class_name']; } } } } foreach ($lessons_by_group as $name => $data) { echo '
'; echo '' . htmlspecialchars($name) . '
'; if (!empty($data['classes'])) { echo '' . htmlspecialchars(implode(', ', array_unique($data['classes']))) . ''; } echo '
'; } } ?>
' . htmlspecialchars($ts['name']) . '
' . date("g:i A", strtotime($ts['start_time'])) . ' - ' . date("g:i A", strtotime($ts['end_time'])) . '
Break
No lessons are scheduled for you at the moment.
Please select a teacher to view their timetable.