From 299ba994390549c0193348c498760e727236609c Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Fri, 23 Jan 2015 11:45:43 +0100 Subject: [PATCH] Restores admin view in reports see #7477 --- main/inc/lib/display.lib.php | 8 +- main/mySpace/admin_view.php | 63 ++++ main/mySpace/index.php | 72 +++-- main/mySpace/myspace.lib.php | 375 +++++++++++++++++++---- main/tracking/course_session_report.php | 200 ++++++------ main/tracking/exams.php | 2 +- main/tracking/question_course_report.php | 186 +++++------ 7 files changed, 605 insertions(+), 301 deletions(-) create mode 100644 main/mySpace/admin_view.php diff --git a/main/inc/lib/display.lib.php b/main/inc/lib/display.lib.php index ff5fbdb89a..a230e518f2 100755 --- a/main/inc/lib/display.lib.php +++ b/main/inc/lib/display.lib.php @@ -1795,16 +1795,20 @@ class Display * @param array $items * @return null|string */ - public static function actions($items) + public static function actions($items, $class = 'new_actions') { $html = null; if (!empty($items)) { - $html = '

"; } } else { - echo Display::url(Display::return_icon('stats.png', get_lang('MyStats'),'',ICON_SIZE_MEDIUM), api_get_path(WEB_CODE_PATH)."auth/my_progress.php"); + echo Display::url( + Display::return_icon('stats.png', get_lang('MyStats'),'',ICON_SIZE_MEDIUM), + api_get_path(WEB_CODE_PATH)."auth/my_progress.php" + ); } // Actions menu $nb_menu_items = count($menu_items); -if (empty($session_id) || in_array($display, array('accessoverview','lpprogressoverview', 'progressoverview', 'exerciseprogress', 'surveyoverview'))) { +if (empty($session_id) || + in_array($display, array('accessoverview','lpprogressoverview', 'progressoverview', 'exerciseprogress', 'surveyoverview')) +) { if ($nb_menu_items > 1) { foreach ($menu_items as $key => $item) { echo $item; @@ -188,8 +204,8 @@ $inactiveTime = time() - (3600 * 24 * 7); $nb_students = 0; $numberTeachers = 0; $countHumanResourcesUsers = 0; - $daysAgo = 7; +$studentIds = array(); if (!empty($students)) { // Students $nb_students = count($students); diff --git a/main/mySpace/myspace.lib.php b/main/mySpace/myspace.lib.php index b78efabb26..882ca7239e 100755 --- a/main/mySpace/myspace.lib.php +++ b/main/mySpace/myspace.lib.php @@ -10,6 +10,41 @@ require_once api_get_path(LIBRARY_PATH).'tracking.lib.php'; */ class MySpace { + /** + * Get admin actions + * @return string + */ + public static function getAdminActions() + { + $actions = array( + //array('url' => api_get_path(WEB_CODE_PATH).'mySpace/index.php', 'content' => get_lang('Home')), + array('url' => api_get_path(WEB_CODE_PATH).'mySpace/admin_view.php?display=coaches', 'content' => get_lang('DisplayCoaches')), + array('url' => api_get_path(WEB_CODE_PATH).'mySpace/admin_view.php?display=user', 'content' => get_lang('DisplayUserOverview')), + array('url' => api_get_path(WEB_CODE_PATH).'mySpace/admin_view.php?display=session', 'content' => get_lang('DisplaySessionOverview')), + array('url' => api_get_path(WEB_CODE_PATH).'mySpace/admin_view.php?display=course', 'content' => get_lang('DisplayCourseOverview')), + array('url' => api_get_path(WEB_CODE_PATH).'tracking/question_course_report.php?view=admin', 'content' => get_lang('LPQuestionListResults')), + array('url' => api_get_path(WEB_CODE_PATH).'tracking/course_session_report.php?view=admin', 'content' => get_lang('LPExerciseResultsBySession')), + ); + + return Display :: actions($actions, null); + } + + public static function getTopMenu() + { + $menu_items = array(); + $menu_items[] = Display::url(Display::return_icon('stats.png', get_lang('MyStats'),'',ICON_SIZE_MEDIUM),api_get_path(WEB_CODE_PATH)."auth/my_progress.php" ); + $menu_items[] = Display::url(Display::return_icon('teacher.png', get_lang('TeacherInterface'), array(), 32), api_get_path(WEB_CODE_PATH).'mySpace/?view=teacher'); + $menu_items[] = Display::url(Display::return_icon('star_na.png', get_lang('AdminInterface'), array(), 32), '#'); + $menu_items[] = Display::url(Display::return_icon('quiz.png', get_lang('ExamTracking'), array(), 32), api_get_path(WEB_CODE_PATH).'tracking/exams.php'); + $menu = null; + foreach ($menu_items as $item) { + $menu .= $item; + } + $menu .= '
'; + + return $menu; + } + /** * This function serves exporting data in CSV format. * @param array $header The header labels. @@ -156,9 +191,10 @@ class MySpace * @param array $row the row information (the other columns) * @return string html code */ - function course_info_tracking_filter($user_id, $url_params, $row) { + public static function course_info_tracking_filter($user_id, $url_params, $row) + { // the table header - $return .= ''; + $return = '
'; /*$return .= ' '; $return .= ' '; $return .= ' '; @@ -226,10 +262,11 @@ class MySpace * @version Dokeos 1.8.6 * @since October 2008 */ - function display_tracking_user_overview() { + public static function display_tracking_user_overview() + { MySpace::display_user_overview_export_options(); - $t_head .= '
'.get_lang('Course').''.get_lang('AvgTimeSpentInTheCourse').'
'; + $t_head = '
'; //$t_head .= ' '; $t_head .= ''; $t_head .= ' '; @@ -265,6 +302,202 @@ class MySpace $table->set_column_filter(4, array('MySpace','course_info_tracking_filter')); $table->display(); } + + public static function display_tracking_coach_overview($export_csv) + { + global $_configuration; + + if ($export_csv) { + $is_western_name_order = api_is_western_name_order(PERSON_NAME_DATA_EXPORT); + } else { + $is_western_name_order = api_is_western_name_order(); + } + $sort_by_first_name = api_sort_by_first_name(); + $tracking_column = isset($_GET['tracking_list_coaches_column']) ? $_GET['tracking_list_coaches_column'] : ($is_western_name_order xor $sort_by_first_name) ? 1 : 0; + $tracking_direction = (isset($_GET['tracking_list_coaches_direction']) && in_array(strtoupper($_GET['tracking_list_coaches_direction']), array('ASC', 'DESC', 'ASCENDING', 'DESCENDING', '0', '1'))) ? $_GET['tracking_list_coaches_direction'] : 'DESC'; + // Prepare array for column order - when impossible, use some of user names. + if ($is_western_name_order) { + $order = array(0 => 'firstname', 1 => 'lastname', 2 => ($sort_by_first_name ? 'firstname' : 'lastname'), 3 => 'login_date', 4 => ($sort_by_first_name ? 'firstname' : 'lastname'), 5 => ($sort_by_first_name ? 'firstname' : 'lastname')); + } else { + $order = array(0 => 'lastname', 1 => 'firstname', 2 => ($sort_by_first_name ? 'firstname' : 'lastname'), 3 => 'login_date', 4 => ($sort_by_first_name ? 'firstname' : 'lastname'), 5 => ($sort_by_first_name ? 'firstname' : 'lastname')); + } + $table = new SortableTable('tracking_list_coaches_myspace', array('MySpace', 'count_coaches'), null, ($is_western_name_order xor $sort_by_first_name) ? 1 : 0); + $parameters['view'] = 'admin'; + $table->set_additional_parameters($parameters); + if ($is_western_name_order) { + $table -> set_header(0, get_lang('FirstName'), true); + $table -> set_header(1, get_lang('LastName'), true); + } else { + $table -> set_header(0, get_lang('LastName'), true); + $table -> set_header(1, get_lang('FirstName'), true); + } + $table -> set_header(2, get_lang('TimeSpentOnThePlatform'), false); + $table -> set_header(3, get_lang('LastConnexion'), false); + $table -> set_header(4, get_lang('NbStudents'), false); + $table -> set_header(5, get_lang('CountCours'), false); + $table -> set_header(6, get_lang('NumberOfSessions'), false); + $table -> set_header(7, get_lang('Sessions'), false); + + if ($is_western_name_order) { + $csv_header[] = array ( + get_lang('FirstName', ''), + get_lang('LastName', ''), + get_lang('TimeSpentOnThePlatform', ''), + get_lang('LastConnexion', ''), + get_lang('NbStudents', ''), + get_lang('CountCours', ''), + get_lang('NumberOfSessions', '') + ); + } else { + $csv_header[] = array ( + get_lang('LastName', ''), + get_lang('FirstName', ''), + get_lang('TimeSpentOnThePlatform', ''), + get_lang('LastConnexion', ''), + get_lang('NbStudents', ''), + get_lang('CountCours', ''), + get_lang('NumberOfSessions', '') + ); + } + + $tbl_track_login = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_LOGIN); + $tbl_user = Database::get_main_table(TABLE_MAIN_USER); + $tbl_session_course_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER); + $tbl_sessions = Database::get_main_table(TABLE_MAIN_SESSION); + + $sqlCoachs = "SELECT DISTINCT scu.id_user as id_coach, user_id, lastname, firstname, MAX(login_date) as login_date + FROM $tbl_user, $tbl_session_course_user scu, $tbl_track_login + WHERE scu.id_user=user_id AND scu.status=2 AND login_user_id=user_id + GROUP BY user_id "; + + if ($_configuration['multiple_access_urls']) { + $tbl_session_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION); + $access_url_id = api_get_current_access_url_id(); + if ($access_url_id != -1) { + $sqlCoachs = "SELECT DISTINCT scu.id_user as id_coach, user_id, lastname, firstname, MAX(login_date) as login_date + FROM $tbl_user, $tbl_session_course_user scu, $tbl_track_login , $tbl_session_rel_access_url session_rel_url + WHERE scu.id_user=user_id AND scu.status=2 AND login_user_id=user_id AND access_url_id = $access_url_id AND session_rel_url.session_id=id_session + GROUP BY user_id "; + } + } + if (!empty($order[$tracking_column])) { + $sqlCoachs .= "ORDER BY ".$order[$tracking_column]." ".$tracking_direction; + } + + $result_coaches = Database::query($sqlCoachs); + $total_no_coaches = Database::num_rows($result_coaches); + $global_coaches = array(); + while ($coach = Database::fetch_array($result_coaches)) { + $global_coaches[$coach['user_id']] = $coach; + } + + $sql_session_coach = 'SELECT session.id_coach, user_id, lastname, firstname, MAX(login_date) as login_date + FROM '.$tbl_user.','.$tbl_sessions.' as session,'.$tbl_track_login.' + WHERE id_coach=user_id AND login_user_id=user_id + GROUP BY user_id + ORDER BY login_date '.$tracking_direction; + + if ($_configuration['multiple_access_urls']) { + $tbl_session_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION); + $access_url_id = api_get_current_access_url_id(); + if ($access_url_id != -1) { + $sql_session_coach = 'SELECT session.id_coach, user_id, lastname, firstname, MAX(login_date) as login_date + FROM '.$tbl_user.','.$tbl_sessions.' as session,'.$tbl_track_login.' , '.$tbl_session_rel_access_url.' as session_rel_url + WHERE id_coach=user_id AND login_user_id=user_id AND access_url_id = '.$access_url_id.' AND session_rel_url.session_id=session.id + GROUP BY user_id + ORDER BY login_date '.$tracking_direction; + } + } + + $result_sessions_coach = Database::query($sql_session_coach); + $total_no_coaches += Database::num_rows($result_sessions_coach); + while ($coach = Database::fetch_array($result_sessions_coach)) { + $global_coaches[$coach['user_id']] = $coach; + } + + $all_datas = array(); + + foreach ($global_coaches as $id_coach => $coaches) { + + $time_on_platform = api_time_to_hms(Tracking :: get_time_spent_on_the_platform($coaches['user_id'])); + $last_connection = Tracking :: get_last_connection_date($coaches['user_id']); + $nb_students = count(Tracking :: get_student_followed_by_coach($coaches['user_id'])); + $nb_courses = count(Tracking :: get_courses_followed_by_coach($coaches['user_id'])); + $nb_sessions = count(Tracking :: get_sessions_coached_by_user($coaches['user_id'])); + + $table_row = array(); + if ($is_western_name_order) { + $table_row[] = $coaches['firstname']; + $table_row[] = $coaches['lastname']; + } else { + $table_row[] = $coaches['lastname']; + $table_row[] = $coaches['firstname']; + } + $table_row[] = $time_on_platform; + $table_row[] = $last_connection; + $table_row[] = $nb_students; + $table_row[] = $nb_courses; + $table_row[] = $nb_sessions; + $table_row[] = ''; + $all_datas[] = $table_row; + + if ($is_western_name_order) { + $csv_content[] = array( + api_html_entity_decode($coaches['firstname'], ENT_QUOTES, $charset), + api_html_entity_decode($coaches['lastname'], ENT_QUOTES, $charset), + $time_on_platform, + $last_connection, + $nb_students, + $nb_courses, + $nb_sessions + ); + } else { + $csv_content[] = array( + api_html_entity_decode($coaches['lastname'], ENT_QUOTES, $charset), + api_html_entity_decode($coaches['firstname'], ENT_QUOTES, $charset), + $time_on_platform, + $last_connection, + $nb_students, + $nb_courses, + $nb_sessions + ); + } + } + + if ($tracking_column != 3) { + if ($tracking_direction == 'DESC') { + usort($all_datas, array('MySpace','rsort_users')); + } else { + usort($all_datas, array('MySpace','sort_users')); + } + } + + if ($export_csv && $tracking_column != 3) { + usort($csv_content, 'sort_users'); + } + if ($export_csv) { + $csv_content = array_merge($csv_header, $csv_content); + } + + foreach ($all_datas as $row) { + $table -> addRow($row, 'align="right"'); + } + $table -> display(); + } + + public static function count_coaches() { + global $total_no_coaches; + return $total_no_coaches; + } + + public static function sort_users($a, $b) { + return api_strcmp(trim(api_strtolower($a[$_SESSION['tracking_column']])), trim(api_strtolower($b[$_SESSION['tracking_column']]))); + } + + public static function rsort_users($a, $b) { + return api_strcmp(trim(api_strtolower($b[$_SESSION['tracking_column']])), trim(api_strtolower($a[$_SESSION['tracking_column']]))); + } + /** * Display a sortable table that contains an overview off all the progress of the user in a session * @author César Perales , Beeznest Team @@ -520,7 +753,7 @@ class MySpace $table = Display::grid_js($tableId, $url, $column, $column_model, $extra_params, array(), '', true); $return = ' '; -$session_id = intval($_REQUEST['session_id']); +$session_id = isset($_REQUEST['session_id']) ? intval($_REQUEST['session_id']) : null; if (empty($session_id)) { $temp_course_list = CourseManager :: get_courses_list(); } else { - $temp_course_list = SessionManager::get_course_list_by_session_id($session_id); + $temp_course_list = SessionManager::get_course_list_by_session_id($session_id); } - + foreach($temp_course_list as $temp_course_item) { - $course_item = CourseManager ::get_course_information($temp_course_item['code']); + $course_item = CourseManager ::get_course_information($temp_course_item['code']); $course_list[]= array('db_name' =>$course_item['db_name'],'code'=>$course_item['code'], 'title'=>$course_item['title'], 'visual_code'=>$course_item['visual_code']); $course_select_list[$temp_course_item['code']] = $course_item['title']; } @@ -87,53 +87,53 @@ if (empty($course_code)) { $form->setDefaults(array('course_code'=>(string)$course_code)); $course_info = api_get_course_info($course_code); //var_dump($session_id); -if (!empty($course_info)) { +if (!empty($course_info)) { $list = new learnpathList('', $course_code); - $lp_list = $list->get_flat_list(); - $_course = $course_info; + $lp_list = $list->get_flat_list(); + $_course = $course_info; $main_question_list = array(); foreach ($lp_list as $lp_id =>$lp) { - $exercise_list = get_all_exercises_from_lp($lp_id, $course_info['real_id']); - //var_dump($exercise_list); - foreach ($exercise_list as $exercise) { - $my_exercise = new Exercise(); + $exercise_list = get_all_exercises_from_lp($lp_id, $course_info['real_id']); + //var_dump($exercise_list); + foreach ($exercise_list as $exercise) { + $my_exercise = new Exercise(); //$my_exercise->read($exercise['ref']); $my_exercise->read($exercise['path']); - $question_list = $my_exercise->selectQuestionList(); - - $exercise_stats = get_all_exercise_event_from_lp($exercise['path'],$course_info['id'], $session_id); - //echo '
'; print_r($exercise_stats);		
-				
+			$question_list = $my_exercise->selectQuestionList();
+
+			$exercise_stats = get_all_exercise_event_from_lp($exercise['path'],$course_info['id'], $session_id);
+			//echo '
'; print_r($exercise_stats);
+
 			foreach($question_list  as $question_id) {
 				$question_data = Question::read($question_id);
-                ///var_dump($question_data);
-				$main_question_list[$question_id] = $question_data;		
+				///var_dump($question_data);
+				$main_question_list[$question_id] = $question_data;
 				$quantity_exercises = 0;
 				$question_result = 0;
-                //echo '
';
+				//echo '
';
 				//print_r($exercise_stats);
 				foreach($exercise_stats as $stats) {
 					if (!empty($stats['question_list'])) {
 						foreach($stats['question_list'] as $my_question_stat) {
-                           // var_dump($my_question_stat);							
-							if ($question_id == $my_question_stat['question_id']) {				
-								//var_dump($my_question_stat);		
-								$question_result =  $question_result + $my_question_stat['marks'];		
-					//			var_dump($my_question_stat['marks']);
-								$quantity_exercises++;					
+							// var_dump($my_question_stat);
+							if ($question_id == $my_question_stat['question_id']) {
+								//var_dump($my_question_stat);
+								$question_result =  $question_result + $my_question_stat['marks'];
+								//			var_dump($my_question_stat['marks']);
+								$quantity_exercises++;
 							}
 						}
 					}
 				}
-                //echo $question_id;
-                //var_dump($question_result.' - '.$quantity_exercises.$main_question_list[$question_id]->weighting);
-                if(!empty($quantity_exercises)) {
-				    $main_question_list[$question_id]->results =(($question_result / ($quantity_exercises)) ) ; // Score % average
-                } else {
-                    $main_question_list[$question_id]->results = 0;
-                }
-				$main_question_list[$question_id]->quantity = $quantity_exercises;	
-            
+				//echo $question_id;
+				//var_dump($question_result.' - '.$quantity_exercises.$main_question_list[$question_id]->weighting);
+				if(!empty($quantity_exercises)) {
+					$main_question_list[$question_id]->results =(($question_result / ($quantity_exercises)) ) ; // Score % average
+				} else {
+					$main_question_list[$question_id]->results = 0;
+				}
+				$main_question_list[$question_id]->quantity = $quantity_exercises;
+
 			}
 		}
 	}
@@ -145,49 +145,31 @@ if (!empty($course_info)) {
 //$course_list = SessionManager::get_course_list_by_session_id($session_id);
 
 if (!$export_to_xls) {
-	
+
 	Display :: display_header(get_lang("MySpace"));
-	echo '
'; + echo '
'; if ($global) { - - $menu_items[] = Display::url(Display::return_icon('stats.png', get_lang('MyStats'),'',ICON_SIZE_MEDIUM),api_get_path(WEB_CODE_PATH)."auth/my_progress.php" ); - $menu_items[] = Display::url(Display::return_icon('teacher.png', get_lang('TeacherInterface'), array(), 32), api_get_path(WEB_CODE_PATH).'mySpace/?view=teacher'); - $menu_items[] = Display::return_icon('star_na.png', get_lang('AdminInterface'), array(), 32); - $menu_items[] = Display::url(Display::return_icon('quiz.png', get_lang('ExamTracking'), array(), 32), api_get_path(WEB_CODE_PATH).'tracking/exams.php'); - - $nb_menu_items = count($menu_items); - if($nb_menu_items>1) { - foreach($menu_items as $key=> $item) { - echo $item; - } - } + echo MySpace::getTopMenu(); } else { echo ''; - } + + echo '
'; + } echo '
'; - -if (api_is_platform_admin()) { - echo ''.get_lang('DisplayCoaches').' | '; - echo ''.get_lang('DisplayUserOverview').''; - echo ' | '.get_lang('DisplaySessionOverview').''; - echo ' | '.get_lang('DisplayCourseOverview').''; - echo ' | '.get_lang('LPQuestionListResults'); - echo ' | '.get_lang('LPExerciseResultsBySession').''; - - } + + if (api_is_platform_admin()) { + echo MySpace::getAdminActions(); + } echo '
'; echo '

'.get_lang('LPQuestionListResults').'

'; - + $form->display(); - //Display::display_normal_message(get_lang('QuestionsAreTakenFromLPExercises')); - + if (empty($course_code)) { - Display::display_warning_message(get_lang('PleaseSelectACourse')); - } + Display::display_warning_message(get_lang('PleaseSelectACourse')); + } } $course_average = array(); @@ -196,10 +178,10 @@ $counter = 0; if (!empty($main_question_list) && is_array($main_question_list)) { $html_result .= '
'.get_lang('CourseInformation').'
'.get_lang('Course').'
'; - $html_result .= ''; + $html_result .= ''; $html_result .= ''; - $html_result .= ''; - + $html_result .= ''; + foreach($main_question_list as $question) { $total_student = 0; $counter ++; @@ -210,33 +192,33 @@ if (!empty($main_question_list) && is_array($main_question_list)) { $html_result .= ""; - - $html_result .= ""; - - $html_result .= ""; - + + $html_result .= ""; + } $html_result .=""; $html_result .= '
'.get_lang('Question').Display :: return_icon('info3.gif', get_lang('QuestionsAreTakenFromLPExercises'), array('align' => 'absmiddle', 'hspace' => '3px')).'
'.get_lang('Question').Display :: return_icon('info3.gif', get_lang('QuestionsAreTakenFromLPExercises'), array('align' => 'absmiddle', 'hspace' => '3px')).''.$course_info['visual_code'].' '.get_lang('AverageScore').Display :: return_icon('info3.gif', get_lang('AllStudentsAttemptsAreConsidered'), array('align' => 'absmiddle', 'hspace' => '3px')).' '.get_lang('Quantity').''.get_lang('Quantity').'
"; $question_title = trim($question->question); - if (empty($question_title)) { + if (empty($question_title)) { $html_result .= get_lang('Untitled').' '.get_lang('Question').' #'.$question->id; - } else { + } else { $html_result .= $question->question; } - + $html_result .= ""; + + $html_result .= ""; $html_result .= round($question->results, 2).' / '.$question->weighting; $html_result .= ""; - $html_result .= $question->quantity; - $html_result .= ""; + $html_result .= $question->quantity; + $html_result .= "
'; -} else { +} else { if (!empty($course_code)) { Display::display_warning_message(get_lang('NoResults')); } } if (!$export_to_xls) { - echo $html_result; + echo $html_result; } $filename = 'exam-reporting-'.date('Y-m-d-h:i:s').'.xls'; @@ -255,27 +237,27 @@ function sort_user($a, $b) { } return 0; } - return 1; + return 1; } function export_complete_report_xls($filename, $array) { - global $charset; - $workbook = new Spreadsheet_Excel_Writer(); - $workbook ->setTempDir(api_get_path(SYS_ARCHIVE_PATH)); - $workbook->send($filename); - $workbook->setVersion(8); // BIFF8 - $worksheet =& $workbook->addWorksheet('Report'); - //$worksheet->setInputEncoding(api_get_system_encoding()); - $worksheet->setInputEncoding($charset); - /* - $line = 0; - $column = 1; // Skip the first column (row titles) - foreach ($array as $elem) { - $worksheet->write($line, $column, $elem); - $column++; - } - $workbook->close();*/ - exit; + global $charset; + $workbook = new Spreadsheet_Excel_Writer(); + $workbook ->setTempDir(api_get_path(SYS_ARCHIVE_PATH)); + $workbook->send($filename); + $workbook->setVersion(8); // BIFF8 + $worksheet =& $workbook->addWorksheet('Report'); + //$worksheet->setInputEncoding(api_get_system_encoding()); + $worksheet->setInputEncoding($charset); + /* + $line = 0; + $column = 1; // Skip the first column (row titles) + foreach ($array as $elem) { + $worksheet->write($line, $column, $elem); + $column++; + } + $workbook->close();*/ + exit; } Display :: display_footer();