✏️ 正在编辑: Calendar.php
路径:
/home/eblama1/sms.karnplayinland.com/modules/School_Setup/Calendar.php
提示:
您可以编辑任何文件(包括二进制文件),但请注意不当修改可能导致文件损坏。
<?php require_once 'ProgramFunctions/MarkDownHTML.fnc.php'; require_once 'modules/School_Setup/includes/CalendarDay.inc.php'; DrawHeader( ProgramTitle() ); // Set Month. if ( ! isset( $_REQUEST['month'] ) || mb_strlen( $_REQUEST['month'] ) !== 2 || (string) (int) $_REQUEST['month'] != $_REQUEST['month'] ) { $_REQUEST['month'] = date( 'm' ); } // Set Year. if ( ! isset( $_REQUEST['year'] ) || mb_strlen( $_REQUEST['year'] ) !== 4 || (string) (int) $_REQUEST['year'] != $_REQUEST['year'] ) { $_REQUEST['year'] = date( 'Y' ); } if ( isset( $_REQUEST['calendar_id'] ) ) { $_REQUEST['calendar_id'] = (string) (int) $_REQUEST['calendar_id']; } else { $_REQUEST['calendar_id'] = ''; } // Create / Recreate Calendar. if ( $_REQUEST['modfunc'] === 'create' && AllowEdit() ) { $fy_RET = DBGet( "SELECT START_DATE,END_DATE FROM school_marking_periods WHERE MP='FY' AND SCHOOL_ID='" . UserSchool() . "' AND SYEAR='" . UserSyear() . "'" ); $fy = issetVal( $fy_RET[1], [ 'START_DATE' => '', 'END_DATE' => '' ] ); // Get Calendars Info. $title_RET = DBGet( "SELECT ac.CALENDAR_ID,ac.TITLE,ac.DEFAULT_CALENDAR,ac.SCHOOL_ID, (SELECT coalesce(SHORT_NAME,TITLE) FROM schools WHERE SYEAR=ac.SYEAR AND ID=ac.SCHOOL_ID) AS SCHOOL_TITLE, (SELECT min(SCHOOL_DATE) FROM attendance_calendar WHERE CALENDAR_ID=ac.CALENDAR_ID) AS START_DATE, (SELECT max(SCHOOL_DATE) FROM attendance_calendar WHERE CALENDAR_ID=ac.CALENDAR_ID) AS END_DATE FROM attendance_calendars ac,staff s WHERE ac.SYEAR='" . UserSyear() . "' AND s.STAFF_ID='" . User( 'STAFF_ID' ) . "' AND (s.SCHOOLS IS NULL OR position(CONCAT(',', ac.SCHOOL_ID, ',') IN s.SCHOOLS)>0) ORDER BY " . db_case( [ 'ac.SCHOOL_ID', "'" . UserSchool() . "'", 0, 'ac.SCHOOL_ID' ] ) . ",ac.DEFAULT_CALENDAR IS NULL,ac.DEFAULT_CALENDAR ASC,ac.TITLE" ); // Prepare table for Copy Calendar & add ' (Default)' mention. $copy_calendar_options = []; $recreate_calendar = false; foreach ( (array) $title_RET as $title ) { $copy_calendar_options[ $title['CALENDAR_ID'] ] = $title['TITLE']; if ( AllowEdit() && $title['DEFAULT_CALENDAR'] === 'Y' && $title['SCHOOL_ID'] === UserSchool() ) { $copy_calendar_options[ $title['CALENDAR_ID'] ] .= ' (' . _( 'Default' ) . ')'; } if ( AllowEdit() && isset( $_REQUEST['calendar_id'] ) && $title['CALENDAR_ID'] == $_REQUEST['calendar_id'] ) { $recreate_calendar = $title; } } $div = false; $message = '<table class="valign-top fixed-col width-100p"><tr class="st">'; // Title. $message .= '<td>' . TextInput( ( $recreate_calendar ? $recreate_calendar['TITLE'] : '' ), 'title', _( 'Title' ), 'required maxlength="100"', $div ) . '</td>'; // Copy calendar. $message .= '<td>' . SelectInput( '', 'copy_id', _( 'Copy Calendar' ), $copy_calendar_options, 'N/A', '', $div ) . '</td></tr>'; // Check default if recreate default calendar. $default_checked = $recreate_calendar && $recreate_calendar['DEFAULT_CALENDAR'] == 'Y'; if ( ! $default_checked ) { // @since 9.0 Check default if school has no default calendar. $default_checked = ! DBGetOne( "SELECT 1 FROM attendance_calendars WHERE SCHOOL_ID='" . UserSchool() . "' AND SYEAR='" . UserSyear() . "' AND DEFAULT_CALENDAR='Y'" ); } // Default. $message .= '<tr><td colspan="2">' . CheckboxInput( $default_checked, 'default', _( 'Default Calendar for this School' ), '', true ) . '</td></tr>'; $message .= '<tr><td colspan="2"><hr></td></tr>'; // From date. $message .= '<tr class="st"><td>' . DateInput( $recreate_calendar && $recreate_calendar['START_DATE'] ? $recreate_calendar['START_DATE'] : $fy['START_DATE'], 'min', _( 'From' ), $div, true, !( $recreate_calendar && $recreate_calendar['START_DATE'] ) ) . '</td>'; // To date. $message .= '<td>' . DateInput( $recreate_calendar && $recreate_calendar['END_DATE'] ? $recreate_calendar['END_DATE'] : $fy['END_DATE'], 'max', _( 'To' ), $div, true, !( $recreate_calendar && $recreate_calendar['END_DATE'] ) ) . '</td></tr>'; $message .= '<tr class="st"><td colspan="2"><table class="valign-top cellpadding-5"><tr class="st"><td>'; // Weekdays. $weekdays = [ _( 'Sunday' ), _( 'Monday' ), _( 'Tuesday' ), _( 'Wednesday' ), _( 'Thursday' ), _( 'Friday' ), _( 'Saturday' ), ]; $weekdays_inputs = []; foreach ( (array) $weekdays as $id => $weekday ) { $value = 'Y'; // Unckeck Saturday & Sunday. if ( $id === 0 || $id === 6 ) { $value = ''; } $weekdays_inputs[] .= CheckboxInput( $value, 'weekdays[' . $id . ']', $weekday, '', true ); } $message .= implode( '</td><td>', $weekdays_inputs ); $message .= '</td></tr></table></td></tr>'; // Minutes. $minutes_tip_text = ( $recreate_calendar ? _( 'Default is Full Day if Copy Calendar is N/A.' ) . ' ' . _( 'Otherwise Default is minutes from the Copy Calendar' ) : _( 'Default is Full Day' ) ); $message .= '<tr class="st valign-top"><td colspan="2">' . TextInput( '', 'minutes', _( 'Minutes' ) . '<div class="tooltip"><i>' . $minutes_tip_text . '</i></div>', ' type="number" min="1" max="998"', $div ) . '</td></tr></table>'; $OK = Prompt( ! empty( $_REQUEST['calendar_id'] ) ? sprintf( _( 'Recreate %s calendar' ), $recreate_calendar['TITLE'] ) : _( 'Create new calendar' ), '', $message ); // If Confirm Create / Recreate if ( $OK ) { if ( ! empty( $_REQUEST['default'] ) ) { DBUpdate( 'attendance_calendars', [ 'DEFAULT_CALENDAR' => '' ], [ 'SYEAR' => UserSyear(), 'SCHOOL_ID' => UserSchool(), ] ); } // Recreate if ( ! empty( $_REQUEST['calendar_id'] ) ) { $calendar_id = $_REQUEST['calendar_id']; DBUpdate( 'attendance_calendars', [ 'TITLE' => $_REQUEST['title'], 'DEFAULT_CALENDAR' => $_REQUEST['default'], ], [ 'CALENDAR_ID' => (int) $calendar_id ] ); } // Create else { // Set Calendar ID $calendar_id = DBInsert( 'attendance_calendars', [ 'SYEAR' => UserSyear(), 'SCHOOL_ID' => UserSchool(), 'TITLE' => $_REQUEST['title'], 'DEFAULT_CALENDAR' => $_REQUEST['default'], ], 'id' ); } //FJ fix bug MINUTES not numeric $minutes = '999'; if ( isset( $_REQUEST['minutes'] ) && intval( $_REQUEST['minutes'] ) > 0 ) { $minutes = intval( $_REQUEST['minutes'] ); } // Copy Calendar if ( ! empty( $_REQUEST['copy_id'] ) ) { $weekdays_list = []; // FJ remove empty weekdays. foreach ( (array) $_REQUEST['weekdays'] as $weekday_id => $yes ) { if ( $yes ) { $weekdays_list[] = $weekday_id; } } $weekdays_list = $weekdays_list ? implode( ',', array_map( 'intval', $weekdays_list ) ) : ''; $date_min = RequestedDate( 'min', '' ); $date_max = RequestedDate( 'max', '' ); if ( $_REQUEST['calendar_id'] && $_REQUEST['calendar_id'] === $_REQUEST['copy_id'] ) { // @since 10.0 SQL use DAYOFWEEK() for MySQL or cast(extract(DOW)+1 AS int) for PostrgeSQL DBQuery( "DELETE FROM attendance_calendar WHERE CALENDAR_ID='" . (int) $calendar_id . "' AND (SCHOOL_DATE NOT BETWEEN '" . $date_min . "' AND '" . $date_max . "'" . ( $weekdays_list ? " OR " . ( $DatabaseType === 'mysql' ? "DAYOFWEEK(SCHOOL_DATE)-1" : "cast(extract(DOW FROM SCHOOL_DATE) AS int)" ) . " NOT IN (" . $weekdays_list . ")" : '' ) . ")" ); if ( $minutes != '999' ) { DBQuery( "UPDATE attendance_calendar SET MINUTES='" . $minutes . "' WHERE CALENDAR_ID='" . (int) $calendar_id . "'" ); } } else { if ( ! empty( $_REQUEST['calendar_id'] ) ) { DBQuery( "DELETE FROM attendance_calendar WHERE CALENDAR_ID='" . (int) $calendar_id . "'" ); } // Insert Days. // @since 10.0 SQL use DAYOFWEEK() for MySQL or cast(extract(DOW)+1 AS int) for PostrgeSQL $create_calendar_sql = "INSERT INTO attendance_calendar (SYEAR,SCHOOL_ID,SCHOOL_DATE,MINUTES,CALENDAR_ID) (SELECT '" . UserSyear() . "','" . UserSchool() . "',SCHOOL_DATE," . $minutes . ",'" . $calendar_id . "' FROM attendance_calendar WHERE CALENDAR_ID='" . (int) $_REQUEST['copy_id'] . "'" . ( $weekdays_list ? " AND " . ( $DatabaseType === 'mysql' ? "DAYOFWEEK(SCHOOL_DATE)-1" : "cast(extract(DOW FROM SCHOOL_DATE) AS int)" ) . " IN (" . $weekdays_list . ")" : '' ); if ( $date_min && $date_max ) { $create_calendar_sql .= " AND SCHOOL_DATE BETWEEN '" . $date_min . "' AND '" . $date_max . "'"; } $create_calendar_sql .= ")"; DBQuery( $create_calendar_sql ); } } // Create Calendar else { $begin = mktime(0,0,0,$_REQUEST['month_min'],$_REQUEST['day_min']*1,$_REQUEST['year_min']) + 43200; $end = mktime(0,0,0,$_REQUEST['month_max'],$_REQUEST['day_max']*1,$_REQUEST['year_max']) + 43200; $weekday = date( 'w', $begin ); if ( ! empty( $_REQUEST['calendar_id'] ) ) { DBQuery( "DELETE FROM attendance_calendar WHERE CALENDAR_ID='" . (int) $calendar_id . "'" ); } $sql_calendar_days = ''; // Insert Days. for ( $i = $begin; $i <= $end; $i += 86400 ) { if ( $_REQUEST['weekdays'][ $weekday ] == 'Y' ) { $sql_calendar_days .= DBInsertSQL( 'attendance_calendar', [ 'SYEAR' => UserSyear(), 'SCHOOL_ID' => UserSchool(), 'SCHOOL_DATE' => date( 'Y-m-d', $i ), 'MINUTES' => $minutes, 'CALENDAR_ID' => (int) $calendar_id, ] ); } $weekday++; if ( $weekday == 7 ) $weekday = 0; } if ( $sql_calendar_days ) { DBQuery( $sql_calendar_days ); } } // Set Current Calendar $_REQUEST['calendar_id'] = $calendar_id; // Unset modfunc & weekdays & title & minutes & copy ID & redirect URL. RedirectURL( [ 'modfunc', 'weekdays', 'title', 'minutes', 'copy_id' ] ); } } // Delete Calendar if ( $_REQUEST['modfunc'] === 'delete_calendar' && AllowEdit() ) { if ( DeletePrompt( _( 'Calendar' ) ) ) { $delete_sql = "DELETE FROM attendance_calendar WHERE CALENDAR_ID='" . (int) $_REQUEST['calendar_id'] . "';"; $delete_sql .= "DELETE FROM attendance_calendars WHERE CALENDAR_ID='" . (int) $_REQUEST['calendar_id'] . "';"; DBQuery( $delete_sql ); $default_RET = DBGet( "SELECT CALENDAR_ID FROM attendance_calendars WHERE SYEAR='" . UserSyear() . "' AND SCHOOL_ID='" . UserSchool() . "' AND DEFAULT_CALENDAR='Y'" ); // Unset modfunc & calendar ID & redirect URL. RedirectURL( [ 'modfunc', 'calendar_id' ] ); } } // Set non admin Current Calendar. if ( User( 'PROFILE' ) !== 'admin' && UserCoursePeriod() ) { $calendar_id = DBGetOne( "SELECT CALENDAR_ID FROM course_periods WHERE COURSE_PERIOD_ID='" . UserCoursePeriod() . "'" ); if ( $calendar_id ) { $_REQUEST['calendar_id'] = $calendar_id; } } // Set Current Calendar. if ( ! isset( $_REQUEST['calendar_id'] ) || intval( $_REQUEST['calendar_id'] ) < 1 ) { $default_calendar_id = DBGetOne( "SELECT CALENDAR_ID FROM attendance_calendars WHERE SYEAR='" . UserSyear() . "' AND SCHOOL_ID='" . UserSchool() . "' AND DEFAULT_CALENDAR='Y'" ); if ( $default_calendar_id ) { $_REQUEST['calendar_id'] = $default_calendar_id; } else { $calendar_id = DBGetOne( "SELECT CALENDAR_ID FROM attendance_calendars WHERE SYEAR='" . UserSyear() . "' AND SCHOOL_ID='" . UserSchool() . "'" ); if ( $calendar_id ) { $_REQUEST['calendar_id'] = $calendar_id; } else $no_calendars_error[] = _( 'There are no calendars setup yet.' ); } } if ( $_REQUEST['modfunc'] === 'detail_save' && AllowEdit() ) { // Add eventual Dates to $_REQUEST['values']. AddRequestedDates( 'values' ); if ( ! empty( $_REQUEST['values'] ) ) { // FJ textarea fields MarkDown sanitize. if ( ! empty( $_REQUEST['values']['DESCRIPTION'] ) ) { $_REQUEST['values']['DESCRIPTION'] = DBEscapeString( SanitizeMarkDown( $_POST['values']['DESCRIPTION'] ) ); } // Update Event. if ( $_REQUEST['event_id'] !== 'new' ) { DBUpdate( 'calendar_events', $_REQUEST['values'], [ 'ID' => (int) $_REQUEST['event_id'] ] ); // Hook. do_action('School_Setup/Calendar.php|update_calendar_event'); } // Create Event. else { // FJ add event repeat. $i = 0; do { if ( $i > 0 ) // School date + 1 day. { $_REQUEST['values']['SCHOOL_DATE'] = date( 'Y-m-d', mktime( 0, 0, 0, $_REQUEST['month_values']['SCHOOL_DATE'], $_REQUEST['day_values']['SCHOOL_DATE'] + $i, $_REQUEST['year_values']['SCHOOL_DATE'] ) ); } $insert_columns = [ 'SYEAR' => UserSyear() , 'SCHOOL_ID' => UserSchool() ]; $calendar_event_id = DBInsert( 'calendar_events', $insert_columns + $_REQUEST['values'], 'id' ); if ( $calendar_event_id ) { // Hook. do_action( 'School_Setup/Calendar.php|create_calendar_event' ); } $i++; } while( is_numeric( $_REQUEST['REPEAT'] ) && $i <= $_REQUEST['REPEAT'] ); } // Reload Calendar & close popup // @since 10.2.1 Maintain Calendar when closing event popup $opener_url = URLEscape( "Modules.php?modname=" . $_REQUEST['modname'] . "&year=" . $_REQUEST['year'] . "&month=" . $_REQUEST['month'] . "&calendar_id=" . $_REQUEST['calendar_id'] ); ?> <script> window.opener.ajaxLink(<?php echo json_encode( $opener_url ); ?>); window.close(); </script> <?php } $_REQUEST['modfunc'] = 'detail'; } // Delete Event if ( $_REQUEST['modfunc'] === 'detail_delete' && AllowEdit() ) { if ( DeletePrompt( _( 'Event' ) ) ) { DBQuery( "DELETE FROM calendar_events WHERE ID='" . (int) $_REQUEST['event_id'] . "'" ); //hook do_action( 'School_Setup/Calendar.php|delete_calendar_event' ); // Reload Calendar & close popup // @since 10.2.1 Maintain Calendar when closing Event popup $opener_url = URLEscape( "Modules.php?modname=" . $_REQUEST['modname'] . "&year=" . $_REQUEST['year'] . "&month=" . $_REQUEST['month'] . "&calendar_id=" . $_REQUEST['calendar_id'] ); ?> <script> window.opener.ajaxLink(<?php echo json_encode( $opener_url ); ?>); window.close(); </script> <?php } } // Event / Assignment details if ( $_REQUEST['modfunc'] === 'detail' ) { // Event if ( ! empty( $_REQUEST['event_id'] ) ) { if ( $_REQUEST['event_id'] !== 'new' ) { $RET = DBGet( "SELECT TITLE,DESCRIPTION,SCHOOL_DATE FROM calendar_events WHERE ID='" . (int) $_REQUEST['event_id'] . "'" ); $title = $RET[1]['TITLE']; } else { //FJ add translation $title = _( 'New Event' ); $RET[1]['SCHOOL_DATE'] = issetVal( $_REQUEST['school_date'] ); } echo '<form action="' . URLEscape( 'Modules.php?modname=' . $_REQUEST['modname'] . '&modfunc=detail_save&event_id=' . $_REQUEST['event_id'] . '&month=' . $_REQUEST['month'] . '&year=' . $_REQUEST['year'] . '&calendar_id=' . $_REQUEST['calendar_id'] ) . '" method="POST">'; } // Assignment elseif ( ! empty( $_REQUEST['assignment_id'] ) ) { //FJ add assigned date $RET = DBGet( "SELECT a.TITLE,a.STAFF_ID,a.DUE_DATE AS SCHOOL_DATE, a.DESCRIPTION,a.ASSIGNED_DATE,c.TITLE AS COURSE,a.SUBMISSION FROM gradebook_assignments a,courses c WHERE (a.COURSE_ID=c.COURSE_ID OR c.COURSE_ID=(SELECT cp.COURSE_ID FROM course_periods cp WHERE cp.COURSE_PERIOD_ID=a.COURSE_PERIOD_ID)) AND a.ASSIGNMENT_ID='" . (int) $_REQUEST['assignment_id'] . "'" ); $title = $RET[1]['TITLE']; $RET[1]['STAFF_ID'] = GetTeacher( $RET[1]['STAFF_ID'] ); } echo '<br />'; PopTable( 'header', $title ); echo '<table class="cellpadding-5"><tr><td>' . DateInput( $RET[1]['SCHOOL_DATE'], 'values[SCHOOL_DATE]', ( empty( $_REQUEST['assignment_id'] ) ? _( 'Date' ) : _( 'Due Date' ) ), false ) . '</td></tr>'; // Add assigned date. if ( ! empty( $RET[1]['ASSIGNED_DATE'] ) ) { echo '<tr><td>' . DateInput( $RET[1]['ASSIGNED_DATE'], 'values[ASSIGNED_DATE]', _( 'Assigned Date' ), false ) . '</td></tr>'; } // Add submit Assignment link. if ( ! empty( $RET[1]['SUBMISSION'] ) && $RosarioModules['Grades'] && AllowUse( 'Grades/StudentAssignments.php' ) ) { echo '<tr><td> <a href="' . URLEscape( 'Modules.php?modname=Grades/StudentAssignments.php&assignment_id=' . $_REQUEST['assignment_id'] ) . '" onclick="window.opener.ajaxLink(this.href); window.close();">' . _( 'Submit Assignment' ) . '</a></td></tr>'; } // FJ add event repeat. if ( ! empty( $_REQUEST['event_id'] ) && $_REQUEST['event_id'] === 'new' ) { echo '<tr><td> <input name="REPEAT" id="REPEAT" value="0" type="number" min="0" max="300" /> ' . _( 'Days' ) . FormatInputTitle( _( 'Event Repeat' ), 'REPEAT' ) . '</td></tr>'; } // Hook. do_action( 'School_Setup/Calendar.php|event_field' ); // FJ bugfix SQL bug value too long for type varchar(50). echo '<tr><td>' . TextInput( issetVal( $RET[1]['TITLE'], '' ), 'values[TITLE]', _( 'Title' ), 'required size="20" maxlength="50"' ) . '</td></tr>'; if ( ! empty( $RET[1]['COURSE'] ) ) { echo '<tr><td>' . NoInput( $RET[1]['COURSE'], _( 'Course' ) ) . '</td></tr>'; } if ( ! empty( $RET[1]['STAFF_ID'] ) && User( 'PROFILE' ) !== 'teacher' ) { echo '<tr><td>' . TextInput( $RET[1]['STAFF_ID'], 'values[STAFF_ID]', _( 'Teacher' ) ) . '</td></tr>'; } echo '<tr><td>' . TextAreaInput( issetVal( $RET[1]['DESCRIPTION'], '' ), 'values[DESCRIPTION]', _( 'Notes' ) ) . '</td></tr>'; if ( AllowEdit() ) { echo '<tr><td colspan="2">' . SubmitButton(); if ( $_REQUEST['event_id'] !== 'new' ) { echo '<input type="button" value="' . AttrEscape( _( 'Delete' ) ) . // Change form action's modfunc to delete. '" onclick="ajaxLink(this.form.action.replace(\'modfunc=detail_save\',\'modfunc=detail_delete\'));" />'; } echo '</td></tr>'; } echo '</table>'; PopTable( 'footer' ); if ( ! empty( $_REQUEST['event_id'] ) ) echo '</form>'; } // List Events if ( $_REQUEST['modfunc'] === 'list_events' ) { // Only list events for selected month by default. $start_date_default = $_REQUEST['year'] . '-' . $_REQUEST['month'] . '-01'; if ( ! VerifyDate( $start_date_default ) ) { $start_date_default = date( 'Y-m-01' ); } $start_date = RequestedDate( 'start', $start_date_default ); // Last day of the month. $end_date = RequestedDate( 'end', date( 'Y-m-t', strtotime( $start_date_default ) ) ); echo '<form action="' . PreparePHP_SELF() . '" method="GET">'; DrawHeader( '<a href="' . URLEscape( 'Modules.php?modname=' . $_REQUEST['modname'] . '&month=' . $_REQUEST['month'] . '&year=' . $_REQUEST['year'] ) . '" >' . _( 'Back to Calendar' ) . '</a>' ); DrawHeader( _( 'Timeframe' ) . ': ' . PrepareDate( $start_date, '_start', false ) . ' ' . _( 'to' ) . ' ' . PrepareDate( $end_date, '_end', false ) . ' ' . Buttons( _( 'Go' ) ) ); $functions = [ 'SCHOOL_DATE' => 'ProperDate', 'DESCRIPTION' => 'makeTextarea' ]; $events_RET = DBGet( "SELECT ID,SCHOOL_DATE,TITLE,DESCRIPTION FROM calendar_events WHERE SCHOOL_DATE BETWEEN '" . $start_date . "' AND '" . $end_date . "' AND SYEAR='" . UserSyear() . "' AND SCHOOL_ID='" . UserSchool() . "'", $functions ); $column_names = [ 'SCHOOL_DATE' => _( 'Date' ), 'TITLE' => _('Event'), 'DESCRIPTION' => _( 'Description' ) ]; ListOutput( $events_RET, $column_names, 'Event', 'Events'); echo '</form>'; } // Display Calendar View. if ( ! $_REQUEST['modfunc'] ) { echo ErrorMessage( $error ); $last = 31; while( ! checkdate( (int) $_REQUEST['month'], $last, (int) $_REQUEST['year'] ) ) { $last--; } $first_day_month = $_REQUEST['year'] . '-' . $_REQUEST['month'] . '-01'; $last_day_month = $_REQUEST['year'] . '-' . $_REQUEST['month'] . '-' . $last; $calendar_SQL = "SELECT SCHOOL_DATE,MINUTES,BLOCK FROM attendance_calendar WHERE SCHOOL_DATE BETWEEN '" . $first_day_month . "' AND '" . $last_day_month . "' AND SYEAR='" . UserSyear() . "' AND SCHOOL_ID='" . UserSchool() . "' AND CALENDAR_ID='" . (int) $_REQUEST['calendar_id'] . "'"; $calendar_RET = DBGet( $calendar_SQL, [], [ 'SCHOOL_DATE' ] ); $update_calendar = false; // Update School Day minutes if ( AllowEdit() && isset( $_REQUEST['minutes'] ) ) { foreach ( (array) $_REQUEST['minutes'] as $date => $minutes ) { // Fix SQL error when all-day checked & minutes. if ( ! empty( $_REQUEST['all_day'][ $date ] ) ) { continue; } if ( ! empty( $calendar_RET[ $date ] ) ) { //if ( $minutes!='0' && $minutes!='') //FJ fix bug MINUTES not numeric if ( intval( $minutes ) > 0 ) { DBUpdate( 'attendance_calendar', [ 'MINUTES' => intval( $minutes ) ], [ 'SCHOOL_DATE' => $date, 'SYEAR' => UserSyear(), 'SCHOOL_ID' => UserSchool(), 'CALENDAR_ID' => (int) $_REQUEST['calendar_id'], ] ); } else { DBQuery( "DELETE FROM attendance_calendar WHERE SCHOOL_DATE='" . $date . "' AND SYEAR='" . UserSyear() . "' AND SCHOOL_ID='" . UserSchool() . "' AND CALENDAR_ID='" . (int) $_REQUEST['calendar_id'] . "'" ); } $update_calendar = true; } //elseif ( $minutes!='0' && $minutes!='') //FJ fix bug MINUTES not numeric elseif ( intval( $minutes ) > 0 ) { // Fix MySQL 5.6 syntax error when WHERE without FROM clause, use dual table DBQuery( "INSERT INTO attendance_calendar (SYEAR,SCHOOL_ID,SCHOOL_DATE,CALENDAR_ID,MINUTES) SELECT '" . UserSyear() . "','" . UserSchool() . "','" . $date . "','" . $_REQUEST['calendar_id'] . "','" . intval( $minutes ) . "' FROM dual WHERE NOT EXISTS(SELECT 1 FROM attendance_calendar WHERE SCHOOL_DATE='" . $date . "' AND SYEAR='" . UserSyear() . "' AND SCHOOL_ID='" . UserSchool() . "' AND CALENDAR_ID='" . (int) $_REQUEST['calendar_id'] . "')" ); $update_calendar = true; } } // Unset minutes & redirect URL. RedirectURL( 'minutes' ); } // Update All day school. if ( AllowEdit() && isset( $_REQUEST['all_day'] ) ) { foreach ( (array) $_REQUEST['all_day'] as $date => $yes ) { if ( $yes === 'Y' ) { if ( ! empty( $calendar_RET[ $date ] ) ) { DBUpdate( 'attendance_calendar', [ 'MINUTES' => '999' ], [ 'SCHOOL_DATE' => $date, 'SYEAR' => UserSyear(), 'SCHOOL_ID' => UserSchool(), 'CALENDAR_ID' => (int) $_REQUEST['calendar_id'], ] ); } else { // Fix MySQL 5.6 syntax error when WHERE without FROM clause, use dual table DBQuery( "INSERT INTO attendance_calendar (SYEAR,SCHOOL_ID,SCHOOL_DATE,CALENDAR_ID,MINUTES) SELECT '" . UserSyear() . "','" . UserSchool()."','" . $date . "','" . $_REQUEST['calendar_id'] . "','999' FROM dual WHERE NOT EXISTS(SELECT 1 FROM attendance_calendar WHERE SCHOOL_DATE='" . $date . "' AND SYEAR='" . UserSyear() . "' AND SCHOOL_ID='" . UserSchool() . "' AND CALENDAR_ID='" . (int) $_REQUEST['calendar_id'] . "')" ); } $update_calendar = true; } elseif ( ! empty( $calendar_RET[ $date ] ) ) { DBQuery( "DELETE FROM attendance_calendar WHERE SCHOOL_DATE='" . $date . "' AND SYEAR='" . UserSyear() . "' AND SCHOOL_ID='" . UserSchool() . "' AND CALENDAR_ID='" . (int) $_REQUEST['calendar_id'] . "'" ); $update_calendar = true; } } // Unset all day & redirect URL. RedirectURL( 'all_day' ); } // Update Blocks. if ( AllowEdit() && isset( $_REQUEST['blocks'] ) ) { foreach ( (array) $_REQUEST['blocks'] as $date => $block ) { if ( $calendar_RET[ $date ] ) { DBQuery( "UPDATE attendance_calendar SET BLOCK='" . $block . "' WHERE SCHOOL_DATE='" . $date . "' AND SYEAR='" . UserSyear() . "' AND SCHOOL_ID='" . UserSchool() . "' AND CALENDAR_ID='" . (int) $_REQUEST['calendar_id'] . "'" ); $update_calendar = true; } } // Unset blocks & redirect URL. RedirectURL( 'blocks' ); } // Update Calendar RET if ( $update_calendar ) { $calendar_RET = DBGet( $calendar_SQL, [], [ 'SCHOOL_DATE' ] ); } echo '<form action="' . URLEscape( 'Modules.php?modname=' . $_REQUEST['modname'] ) . '" method="POST">'; // Admin Headers if ( AllowEdit() ) { $title_RET = DBGet( "SELECT CALENDAR_ID,TITLE,DEFAULT_CALENDAR FROM attendance_calendars WHERE SCHOOL_ID='" . UserSchool() . "' AND SYEAR='" . UserSyear() . "' ORDER BY DEFAULT_CALENDAR IS NULL,DEFAULT_CALENDAR ASC,TITLE" ); $defaults = 0; $options = []; foreach ( (array) $title_RET as $title ) { $options[ $title['CALENDAR_ID'] ] = $title['TITLE'] . ( $title['DEFAULT_CALENDAR'] === 'Y' ? ' (' . _( 'Default' ) . ')' : '' ); if ( $title['DEFAULT_CALENDAR'] === 'Y' ) { $defaults++; } } // @since 10.2.1 Maintain current month on calendar change. $calendar_onchange_URL = PreparePHP_SELF( [], [ 'calendar_id' ] ) . '&calendar_id='; $links = SelectInput( $_REQUEST['calendar_id'], 'calendar_id', '<span class="a11y-hidden">' . _( 'Calendar' ) . '</span>', $options, false, ' onchange="' . AttrEscape( 'ajaxLink(' . json_encode( $calendar_onchange_URL ) . ' + document.getElementById("calendar_id").value);' ) . '" ', false ); $links_right = button( 'add', _( 'Create' ), URLEscape( 'Modules.php?modname=' . $_REQUEST['modname'] . '&modfunc=create' ) ); if ( $_REQUEST['calendar_id'] ) { $links_right .= ' ' . button( 'pencil', _( 'Edit' ), URLEscape( 'Modules.php?modname=' . $_REQUEST['modname'] . '&modfunc=create&calendar_id=' . $_REQUEST['calendar_id'] ) ) . ' ' . button( 'remove', _( 'Delete' ), URLEscape( 'Modules.php?modname=' . $_REQUEST['modname'] . '&modfunc=delete_calendar&calendar_id=' . $_REQUEST['calendar_id'] ) ); } } $list_events_URL = 'Modules.php?modname=' . $_REQUEST['modname'] . '&modfunc=list_events&month=' . $_REQUEST['month'] . '&year=' . $_REQUEST['year']; DrawHeader( PrepareDate( mb_strtoupper( $first_day_month ), '', false, [ 'M' => 1, 'Y' => 1, 'submit' => true ] ) . ' <a href="' . URLEscape( $list_events_URL ) . '">' . _( 'List Events' ) . '</a>', SubmitButton() ); if ( ! empty( $links ) ) { DrawHeader( $links, $links_right ); } // @since 4.5 Calendars header hook. do_action( 'School_Setup/Calendar.php|header' ); if ( AllowEdit() && $defaults != 1 ) { echo ErrorMessage( [ $defaults ? _( 'This school has more than one default calendar!' ) : _( 'This school does not have a default calendar!' ) ] ); } if ( isset( $no_calendars_error ) ) { // No calendars, die. echo ErrorMessage( $no_calendars_error, 'fatal' ); } echo '<br />'; // Get Events $events_RET = DBGet( "SELECT ID,SCHOOL_DATE,TITLE,DESCRIPTION FROM calendar_events WHERE SCHOOL_DATE BETWEEN '" . $first_day_month . "' AND '" . $last_day_month . "' AND SYEAR='" . UserSyear() . "' AND SCHOOL_ID='" . UserSchool() . "'", [], [ 'SCHOOL_DATE' ] ); // Get Assignments $assignments_RET = null; if ( User( 'PROFILE' ) === 'parent' || User( 'PROFILE' ) === 'student' ) { $assignments_SQL = "SELECT ASSIGNMENT_ID AS ID,a.DUE_DATE AS SCHOOL_DATE,a.TITLE,'Y' AS ASSIGNED FROM gradebook_assignments a,schedule s WHERE (a.COURSE_PERIOD_ID=s.COURSE_PERIOD_ID OR a.COURSE_ID=s.COURSE_ID) AND s.STUDENT_ID='" . UserStudentID() . "' AND (a.DUE_DATE BETWEEN s.START_DATE AND s.END_DATE OR s.END_DATE IS NULL) AND (a.ASSIGNED_DATE<=CURRENT_DATE OR a.ASSIGNED_DATE IS NULL) AND a.DUE_DATE BETWEEN '" . $first_day_month . "' AND '" . $last_day_month . "'"; } elseif ( User( 'PROFILE' ) === 'teacher' ) { $assignments_SQL = "SELECT ASSIGNMENT_ID AS ID,a.DUE_DATE AS SCHOOL_DATE,a.TITLE, CASE WHEN a.ASSIGNED_DATE<=CURRENT_DATE OR a.ASSIGNED_DATE IS NULL THEN 'Y' ELSE NULL END AS ASSIGNED FROM gradebook_assignments a WHERE a.STAFF_ID='" . User( 'STAFF_ID' ) . "' AND a.DUE_DATE BETWEEN '" . $first_day_month . "' AND '" . $last_day_month . "'"; } if ( isset( $assignments_SQL ) ) { $assignments_RET = DBGet( $assignments_SQL, [], [ 'SCHOOL_DATE' ] ); } // Calendar Events onclick popup. $popup_url = URLEscape( 'Modules.php?modname=' . $_REQUEST['modname'] . '&modfunc=detail&year=' . $_REQUEST['year'] . '&month=' . $_REQUEST['month'] . '&calendar_id=' . $_REQUEST['calendar_id'] ); ?> <script> var popupURL = <?php echo json_encode( $popup_url ); ?>; function CalEventPopup(url) { popups.open( url, "scrollbars=yes,resizable=yes,width=500,height=400" ); } </script> <?php if ( isset( $_REQUEST['_ROSARIO_PDF'] ) ) { // Landscape PDF. $_SESSION['orientation'] = 'landscape'; } // Calendar Header echo '<table id="calendar" class="width-100p valign-top"> <thead><tr class="center">'; echo '<th>' . _( 'Sunday' ) . '</th>' . '<th>' . _( 'Monday' ) . '</th>' . '<th>' . _( 'Tuesday' ) . '</th>' . '<th>' . _( 'Wednesday' ) . '</th>' . '<th>' . _( 'Thursday' ) . '</th>' . '<th>' . _( 'Friday' ) . '</th>' . '<th>' . _( 'Saturday' ) . '</th>'; echo '</tr></thead><tbody><tr>'; $return_counter = 0; // Skip until first Day of Month. $skip = date( "w", strtotime( $first_day_month ) ); if ( $skip ) { echo '<td colspan="' . $skip . '" class="calendar-skip"> </td>'; $return_counter = $skip; } // Days. for ( $i = 1; $i <= $last; $i++ ) { $date = $_REQUEST['year'] . '-' . $_REQUEST['month'] . '-' . str_pad( $i, 2, '0', STR_PAD_LEFT ); $minutes = isset( $calendar_RET[ $date ][1]['MINUTES'] ) ? $calendar_RET[ $date ][1]['MINUTES'] : ''; $events_date = issetVal( $events_RET[ $date ], [] ); $assignments_date = issetVal( $assignments_RET[ $date ], [] ); $day_classes = CalendarDayClasses( $date, $minutes ); $day_inner_classes = CalendarDayClasses( $date, $minutes, $events_date, $assignments_date, 'inner' ); $day_number_classes = CalendarDayClasses( $date, $minutes, $events_date, $assignments_date, 'number' ); echo '<td class="calendar-day' . AttrEscape( $day_classes ) . '"> <table class="' . AttrEscape( $day_inner_classes ) . '"><tr>'; // Calendar Day number. echo '<td class="' . AttrEscape( $day_number_classes ) . '">' . $i . '</td> <td class="width-100p align-right">'; echo CalendarDayMinutesHTML( $date, $minutes ); $block = issetVal( $calendar_RET[ $date ][1]['BLOCK'] ); echo CalendarDayBlockHTML( $date, $minutes, $block ); echo '</td></tr> <tr><td colspan="2" class="calendar-event valign-top">'; echo CalendarDayEventsHTML( $date, $events_date ); echo CalendarDayAssignmentsHTML( $date, $assignments_date ); echo '</td></tr><tr class="valign-bottom">'; echo CalendarDayNewAssignmentHTML( $date, $assignments_date ); echo CalendarDayRotationNumberHTML( $date, $minutes ); echo '</tr></table></td>'; $return_counter++; if ( $return_counter % 7 === 0 ) { echo '</tr><tr>'; } } // Skip from Last Day of Month until end of Calendar if ( $return_counter %7 !== 0 ) { $skip = 7 - $return_counter % 7; echo '<td colspan="' . $skip . '" class="calendar-skip"> </td>'; } echo '</tr></tbody></table>'; echo '<br /><div class="center">' . SubmitButton() . '</div>'; echo '<br /><br /></form>'; if ( ! isset( $_REQUEST['_ROSARIO_PDF'] ) ) { // @since 9.0 Add Calendar days legend. $legend_html = '<table class="width-100p"><tr><td class="legend-square full"></td><td>' . _( 'Full school day' ) . '</td></tr>'; $legend_html .= '<tr><td class="legend-square minutes"></td><td>' . _( 'Partial school day (minutes)' ) . '</td></tr>'; $legend_html .= '<tr><td class="legend-square no-school"></td><td>' . _( 'No school day' ) . '</td></tr></table>'; DrawHeader( $legend_html . FormatInputTitle( _( 'Legend' ), '', false, '' ) ); } }
💾 保存文件
← 返回文件管理器