getCoursesInCategory(false); // Only authorized actions $authorizedActions = [ 'edit_category', 'edit_course_category', 'deletecoursecategory', 'createcoursecategory', 'set_collapsable', 'unsubscribe', ]; $action = $httpRequest->query->get('action', $httpRequest->request->get('action', '')); if (!in_array($action, $authorizedActions)) { $action = ''; } $currentUrl = api_get_self(); $interbreadcrumb[] = [ 'url' => api_get_self(), 'name' => get_lang('SortMyCourses'), ]; // We are moving the course of the user to a different user defined course category (=Sort My Courses). if ($httpRequest->request->has('submit_change_course_category')) { $course2EditCategory = Security::remove_XSS($httpRequest->request->get('course_2_edit_category')); $courseCategories = Security::remove_XSS($httpRequest->request->get('course_categories')); $result = $auth->updateCourseCategory($course2EditCategory, $courseCategories); if ($result) { Display::addFlash( Display::return_message(get_lang('EditCourseCategorySucces')) ); } header('Location: '.api_get_self()); exit; } // We edit course category if ($httpRequest->request->has('submit_edit_course_category') && $httpRequest->request->has('title_course_category') && Security::check_token('post') ) { $titleCourseCategory = Security::remove_XSS($httpRequest->request->get('title_course_category')); $categoryId = Security::remove_XSS($httpRequest->request->get('category_id')); $categoryInfo = $auth->getUserCourseCategory($categoryId); if ($categoryInfo) { $result = $auth->store_edit_course_category($titleCourseCategory, $categoryId); if ($result) { Display::addFlash( Display::return_message(get_lang('CourseCategoryEditStored')) ); } } header('Location: '.api_get_self()); exit; } // We are creating a new user defined course category (= Create Course Category). if ($httpRequest->request->has('create_course_category') && $titleCourseCategory = $httpRequest->request->get('title_course_category') ) { $titleCourseCategory = Security::remove_XSS($titleCourseCategory); $result = $auth->store_course_category($titleCourseCategory); if ($result) { Display::addFlash( Display::return_message(get_lang('CourseCategoryStored')) ); } else { Display::addFlash( Display::return_message( get_lang('ACourseCategoryWithThisNameAlreadyExists'), 'error' ) ); } header('Location: '.api_get_self()); exit; } // We are moving a course or category of the user up/down the list (=Sort My Courses). if ($getMove = $httpRequest->query->get('move')) { $getCourse = Security::remove_XSS($httpRequest->query->get('course')); $getMove = Security::remove_XSS($getMove); $getCategory = Security::remove_XSS($httpRequest->query->get('category')); if (!empty($getCourse)) { $result = $auth->move_course($getMove, $getCourse, $getCategory); if ($result) { Display::addFlash( Display::return_message(get_lang('CourseSortingDone')) ); } } if (!empty($getCategory) && empty($getCourse)) { $result = $auth->move_category($getMove, $getCategory); if ($result) { Display::addFlash( Display::return_message(get_lang('CategorySortingDone')) ); } } header('Location: '.api_get_self()); exit; } switch ($action) { case 'edit_category': $categoryId = $httpRequest->query->getInt('category_id'); $categoryInfo = $auth->getUserCourseCategory($categoryId); if ($categoryInfo) { $categoryName = $categoryInfo['title']; $form = new FormValidator( 'edit_course_category', 'post', $currentUrl.'?action=edit_category' ); $form->addText('title_course_category', get_lang('Name')); $form->addHidden('category_id', $categoryId); $form->addHidden('sec_token', Security::get_token()); $form->addButtonSave(get_lang('Edit'), 'submit_edit_course_category'); $form->setDefaults(['title_course_category' => $categoryName]); $form->display(); } exit; case 'edit_course_category': $edit_course = $httpRequest->query->getInt('course_id'); $defaultCategoryId = $httpRequest->query->getInt('category_id'); $courseInfo = api_get_course_info_by_id($edit_course); if (empty($courseInfo)) { exit; } $form = new FormValidator( 'edit_course_category', 'post', $currentUrl.'?action=edit_course_category' ); $form->addHeader($courseInfo['title']); $options = []; foreach ($user_course_categories as $row) { $options[$row['id']] = $row['title']; } asort($options); $form->addSelect( 'course_categories', get_lang('Categories'), $options, ['disable_js' => true, 'placeholder' => get_lang('SelectAnOption')] ); $form->addHidden('course_2_edit_category', $edit_course); if (!empty($defaultCategoryId)) { $form->setDefaults(['course_categories' => $defaultCategoryId]); } $form->addButtonSave(get_lang('Save'), 'submit_change_course_category'); $form->display(); exit; case 'deletecoursecategory': // we are deleting a course category if ($getId = $httpRequest->query->getInt('id')) { if (Security::check_token('get')) { $result = $auth->delete_course_category($getId); if ($result) { Display::addFlash( Display::return_message(get_lang('CourseCategoryDeleted')) ); } } } header('Location: '.api_get_self()); exit; case 'createcoursecategory': $form = new FormValidator( 'create_course_category', 'post', $currentUrl.'?action=createcoursecategory' ); $form->addText('title_course_category', get_lang('Name')); $form->addButtonSave(get_lang('AddCategory'), 'create_course_category'); $form->display(); exit; case 'set_collapsable': if (!api_get_configuration_value('allow_user_course_category_collapsable')) { api_not_allowed(true); } $userId = api_get_user_id(); $categoryId = $httpRequest->query->getInt('categoryid', $httpRequest->request->getInt('categoryid')); $option = $httpRequest->query->get('option', $httpRequest->request->getInt('option')); $redirect = $httpRequest->query->get('redirect', $httpRequest->request->get('redirect', '')); if (empty($userId) || empty($categoryId)) { api_not_allowed(true); } $table = Database::get_main_table(TABLE_USER_COURSE_CATEGORY); $sql = "UPDATE $table SET collapsed = $option WHERE user_id = $userId AND id = $categoryId"; Database::query($sql); Display::addFlash(Display::return_message(get_lang('Updated'))); if ($redirect === 'home') { $url = api_get_path(WEB_PATH).'user_portal.php'; header('Location: '.$url); exit; } $url = api_get_self(); header('Location: '.$url); exit; } function generateUnsubscribeForm(string $courseCode, string $secToken): string { $alertMessage = api_htmlentities(get_lang("ConfirmUnsubscribeFromCourse"), ENT_QUOTES); $form = new FormValidator( 'frm_unsubscribe', 'get', api_get_path(WEB_CODE_PATH).'auth/courses.php', '', [ 'onsubmit' => 'javascript: if (!confirm(\''.addslashes($alertMessage).'\')) return false;', ], FormValidator::LAYOUT_INLINE ); $form->addHidden('action', 'unsubscribe'); $form->addHidden('sec_token', $secToken); $form->addHidden('course_code', $courseCode); $form->addButton('unsub', get_lang('Unsubscribe')); return $form->returnForm(); } Display::display_header(); $stok = Security::get_token(); $courses_without_category = isset($courses_in_category[0]) ? $courses_in_category[0] : null; echo '
'; if ($action != 'createcoursecategory') { echo ''; echo Display::return_icon('new_folder.png', get_lang('CreateCourseCategory'), '', '32'); echo ''; } echo '
'; if (!empty($message)) { echo Display::return_message($message, 'confirm', false); } $allowCollapsable = api_get_configuration_value('allow_user_course_category_collapsable'); $teachersIcon = Display::return_icon('teacher.png', get_lang('Teachers'), null, ICON_SIZE_TINY); // COURSES WITH CATEGORIES if (!empty($user_course_categories)) { $counter = 0; $last = end($user_course_categories); foreach ($user_course_categories as $row) { echo Display::page_subheader($row['title']); echo ''; $url = $currentUrl.'?categoryid='.$row['id'].'&sec_token='.$stok; if ($allowCollapsable) { if (isset($row['collapsed']) && $row['collapsed'] == 0) { echo Display::url( '', $url.'&action=set_collapsable&option=1' ); } else { echo Display::url( '', $url.'&action=set_collapsable&option=0' ); } } echo Display::url( Display::return_icon('edit.png', get_lang('Edit'), '', 22), $currentUrl.'?action=edit_category&category_id='.$row['id'].'&sec_token='.$stok, ['class' => 'ajax'] ); if (0 != $counter) { echo Display::url( Display::return_icon('up.png', get_lang('Up'), '', 22), $currentUrl.'?move=up&category='.$row['id'].'&sec_token='.$stok ); } else { echo Display::return_icon('up_na.png', get_lang('Up'), '', 22); } if ($row['id'] != $last['id']) { echo Display::url( Display::return_icon('down.png', get_lang('Down'), '', 22), $currentUrl.'?move=down&category='.$row['id'].'&sec_token='.$stok ); } else { echo Display::return_icon('down_na.png', get_lang('Down'), '', 22); } echo Display::url( Display::return_icon( 'delete.png', get_lang('Delete'), [ 'onclick' => "javascript: if (!confirm('".addslashes( api_htmlentities( get_lang('CourseCategoryAbout2bedeleted'), ENT_QUOTES, api_get_system_encoding() ) )."')) return false;", ], 22 ), $currentUrl.'?action=deletecoursecategory&id='.$row['id'].'&sec_token='.$stok ); $counter++; echo '

'; // Show the courses inside this category echo ''; $number_of_courses = isset($courses_in_category[$row['id']]) ? count($courses_in_category[$row['id']]) : 0; $key = 0; if (!empty($courses_in_category[$row['id']])) { foreach ($courses_in_category[$row['id']] as $course) { echo ''; } echo '
'; echo ''; echo ''.$course['title'].''; echo ' ('.$course['visual_code'].')'; echo '
'; echo $teachersIcon; echo ' '; echo CourseManager::getTeacherListFromCourseCodeToString($course['code']); echo '
'; if (api_get_setting('display_teacher_in_courselist') === 'true') { echo $course['tutor']; } echo '
'; if (api_get_setting('show_courses_descriptions_in_catalog') === 'true') { $icon_title = get_lang('CourseDetails').' - '.$course['title']; $url = api_get_path( WEB_CODE_PATH ).'inc/ajax/course_home.ajax.php?a=show_course_information&code='.$course['code']; echo Security::remove_XSS( Display::url( Display::return_icon('info.png', $icon_title, '', '22'), $url, ['class' => 'ajax', 'data-title' => $icon_title, 'title' => $icon_title] ) ); echo Display::url( Display::return_icon('edit.png', get_lang('Edit'), '', 22), $currentUrl.'?action=edit_course_category&category_id='.$row['id'].'&course_id='.$course['real_id'].'&sec_token='.$stok, ['class' => 'ajax'] ); } if ($key > 0) { ?>
'; } } } echo Display::page_subheader(get_lang('NoCourseCategory')); echo ''; // COURSES WITHOUT CATEGORY if (!empty($courses_without_category)) { $number_of_courses = count($courses_without_category); $key = 0; foreach ($courses_without_category as $course) { echo ''; $key++; } } ?>
'; echo ''; echo ''.$course['title'].''; echo ' ('.$course['visual_code'].')'; echo '
'; echo $teachersIcon; echo ' '; echo CourseManager::getTeacherListFromCourseCodeToString($course['code']); echo '
'; if (api_get_setting('display_teacher_in_courselist') === 'true') { echo $course['tutor']; } echo '
'; if (api_get_setting('show_courses_descriptions_in_catalog') === 'true') { $icon_title = get_lang('CourseDetails').' - '.$course['title']; $url = api_get_path(WEB_CODE_PATH).'inc/ajax/course_home.ajax.php?a=show_course_information&code='.$course['code']; echo Security::remove_XSS( Display::url( Display::return_icon('info.png', $icon_title, '', '22'), $url, ['class' => 'ajax', 'data-title' => $icon_title, 'title' => $icon_title] ) ); } echo ''; if ($httpRequest->query->has('edit') && $httpRequest->query->get('edit') === $course['code'] ) { echo Display::return_icon('edit_na.png', get_lang('Edit'), '', 22); } else { echo Display::url( Display::return_icon('edit.png', get_lang('Edit'), '', 22), $currentUrl.'?action=edit_course_category&course_id='.$course['real_id'].'&'.$stok, ['class' => 'ajax'] ); } if ($key > 0) { ?>