My courses: Move sort courses in new page add ajax actions BT#15677

pull/3023/head
Julio Montoya 6 years ago
parent 9aaf70ca9d
commit dd4416488f
  1. 111
      main/auth/courses.php
  2. 181
      main/auth/courses_controller.php
  3. 323
      main/auth/courses_list.php
  4. 460
      main/auth/sort_my_courses.php
  5. 30
      main/inc/lib/auth.lib.php
  6. 2
      main/inc/lib/course.lib.php
  7. 33
      main/inc/lib/course_category.lib.php
  8. 2
      main/inc/lib/userportal.lib.php

@ -42,10 +42,7 @@ if (api_is_platform_admin() || api_is_course_admin() || api_is_allowed_to_create
// filter actions
$actions = [
'sortmycourses',
'createcoursecategory',
'subscribe',
'deletecoursecategory',
'display_courses',
'display_random_courses',
'subscribe_user_with_password',
@ -53,7 +50,6 @@ $actions = [
'subscribe_to_session',
'search_tag',
'search_session',
'set_collapsable',
'subscribe_course_validation',
'subscribe_course',
];
@ -72,73 +68,19 @@ if (empty($nameTools)) {
} else {
if (!in_array(
$action,
['sortmycourses', 'createcoursecategory', 'display_random_courses', 'display_courses', 'subscribe']
['display_random_courses', 'display_courses', 'subscribe']
)) {
$interbreadcrumb[] = [
'url' => api_get_path(WEB_CODE_PATH).'auth/courses.php',
'name' => get_lang('CourseManagement'),
];
}
if ($action === 'createcoursecategory') {
$interbreadcrumb[] = [
'url' => api_get_path(WEB_CODE_PATH).'auth/courses.php?action=sortmycourses',
'name' => get_lang('SortMyCourses'),
];
}
$interbreadcrumb[] = ['url' => '#', 'name' => $nameTools];
}
// course description controller object
$courseController = new CoursesController();
// We are moving a course or category of the user up/down the list (=Sort My Courses).
if (isset($_GET['move'])) {
if (isset($_GET['course'])) {
$courseController->move_course(
$_GET['move'],
$_GET['course'],
$_GET['category']
);
}
if (isset($_GET['category']) && !isset($_GET['course'])) {
$courseController->move_category($_GET['move'], $_GET['category']);
}
}
// We are moving the course of the user to a different user defined course category (=Sort My Courses).
if (isset($_POST['submit_change_course_category'])) {
if (!empty($_POST['sec_token']) && $ctok == $_POST['sec_token']) {
$courseController->change_course_category(
$_POST['course_2_edit_category'],
$_POST['course_categories']
);
}
}
// We edit course category
if (isset($_POST['submit_edit_course_category']) &&
isset($_POST['title_course_category']) &&
strlen(trim($_POST['title_course_category'])) > 0
) {
if (!empty($_POST['sec_token']) && $ctok == $_POST['sec_token']) {
$courseController->edit_course_category(
$_POST['title_course_category'],
$_POST['edit_course_category']
);
}
}
// We are creating a new user defined course category (= Create Course Category).
if (isset($_POST['create_course_category']) &&
isset($_POST['title_course_category']) &&
strlen(trim($_POST['title_course_category'])) > 0
) {
if (!empty($_POST['sec_token']) && $ctok == $_POST['sec_token']) {
$courseController->addCourseCategory($_POST['title_course_category']);
}
}
// search courses
if (isset($_REQUEST['search_course'])) {
if (!empty($_REQUEST['sec_token']) && $ctok == $_REQUEST['sec_token']) {
@ -173,18 +115,6 @@ if (isset($_POST['unsubscribe'])) {
}
switch ($action) {
case 'deletecoursecategory':
// we are deleting a course category
if (isset($_GET['id'])) {
if (Security::check_token('get')) {
$courseController->delete_course_category($_GET['id']);
header('Location: '.api_get_self());
exit;
}
}
$courseController->courseList($action);
break;
case 'subscribe_course':
if (api_is_anonymous()) {
header('Location: '.api_get_path(WEB_CODE_PATH).'auth/inscription.php?c='.$courseCodeToSubscribe);
@ -237,12 +167,6 @@ switch ($action) {
$template->assign('content', $content);
$template->display_one_col_template();
break;
case 'createcoursecategory':
$courseController->categoryList();
break;
case 'sortmycourses':
$courseController->courseList($action);
break;
case 'subscribe':
if (!$user_can_view_page) {
api_not_allowed(true);
@ -366,37 +290,4 @@ switch ($action) {
$courseController->sessionListBySearch($limit);
break;
case 'set_collapsable':
api_block_anonymous_users();
if (!api_get_configuration_value('allow_user_course_category_collapsable')) {
api_not_allowed(true);
}
$userId = api_get_user_id();
$categoryId = isset($_REQUEST['categoryid']) ? (int) $_REQUEST['categoryid'] : 0;
$option = isset($_REQUEST['option']) ? (int) $_REQUEST['option'] : 0;
$redirect = isset($_REQUEST['redirect']) ? $_REQUEST['redirect'] : 0;
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_path(WEB_CODE_PATH).'auth/courses.php?action=sortmycourses';
header('Location: '.$url);
exit;
break;
}

@ -33,57 +33,6 @@ class CoursesController
$this->model = new Auth();
}
/**
* It's used for listing courses,
* render to courses_list view.
*
* @param string $action
* @param string $message confirmation message(optional)
*/
public function courseList($action, $message = '')
{
$data = [];
$data['user_courses'] = $this->model->get_courses_of_user(api_get_user_id());
$data['user_course_categories'] = CourseManager::get_user_course_categories(api_get_user_id());
$data['courses_in_category'] = $this->model->get_courses_in_category();
$data['action'] = $action;
$data['message'] = $message;
// render to the view
$this->view->set_data($data);
$this->view->set_layout('catalog_layout');
$this->view->set_template('courses_list');
$this->view->render();
}
/**
* It's used for listing categories, render to categories_list view.
*/
public function categoryList()
{
api_block_anonymous_users();
$stok = Security::get_token();
$actions = Display::url(
Display::return_icon('back.png', get_lang('Back'), '', '32'),
api_get_path(WEB_CODE_PATH).'auth/courses.php?action=sortmycourses'
);
$actions = Display::toolbarAction('toolbar-forum', [$actions]);
$form = new FormValidator(
'create_course_category',
'post',
api_get_path(WEB_CODE_PATH).'auth/courses.php?action=createcoursecategory'
);
$form->addHidden('sec_token', $stok);
$form->addText('title_course_category', get_lang('Name'));
$form->addButtonSave(get_lang('AddCategory'), 'create_course_category');
$tpl = new Template();
$tpl->assign('content', $form->returnForm());
$tpl->assign('actions', $actions);
$tpl->display_one_col_template();
}
/**
* It's used for listing courses with categories,
* render to courses_categories view.
@ -218,129 +167,6 @@ class CoursesController
$this->view->render();
}
/**
* Create a category
* render to listing view.
*
* @param string $title
*/
public function addCourseCategory($title)
{
$result = $this->model->store_course_category($title);
if ($result) {
Display::addFlash(
Display::return_message(get_lang('CourseCategoryStored'))
);
} else {
Display::addFlash(
Display::return_message(
get_lang('ACourseCategoryWithThisNameAlreadyExists'),
'error'
)
);
}
header('Location: '.api_get_path(WEB_CODE_PATH).'auth/courses.php?action=sortmycourses');
exit;
}
/**
* Change course category
* render to listing view.
*
* @param string $course_code
* @param int $category_id
*/
public function change_course_category($course_code, $category_id)
{
$courseInfo = api_get_course_info($course_code);
$courseId = $courseInfo['real_id'];
$result = $this->model->updateCourseCategory($courseId, $category_id);
if ($result) {
Display::addFlash(
Display::return_message(get_lang('EditCourseCategorySucces'))
);
}
$action = 'sortmycourses';
$this->courseList($action);
}
/**
* Move up/down courses inside a category
* render to listing view.
*
* @param string $move move to up or down
* @param string $course_code
* @param int $category_id Category id
*/
public function move_course($move, $course_code, $category_id)
{
$result = $this->model->move_course($move, $course_code, $category_id);
if ($result) {
Display::addFlash(
Display::return_message(get_lang('CourseSortingDone'))
);
}
$action = 'sortmycourses';
$this->courseList($action);
}
/**
* Move up/down categories
* render to listing view.
*
* @param string $move move to up or down
* @param int $category_id Category id
*/
public function move_category($move, $category_id)
{
$result = $this->model->move_category($move, $category_id);
if ($result) {
Display::addFlash(
Display::return_message(get_lang('CategorySortingDone'))
);
}
$action = 'sortmycourses';
$this->courseList($action);
}
/**
* Edit course category
* render to listing view.
*
* @param string $title Category title
* @param int $category Category id
*/
public function edit_course_category($title, $category)
{
$result = $this->model->store_edit_course_category($title, $category);
if ($result) {
Display::addFlash(
Display::return_message(get_lang('CourseCategoryEditStored'))
);
}
$action = 'sortmycourses';
$this->courseList($action);
}
/**
* Delete a course category
* render to listing view.
*
* @param int Category id
*/
public function delete_course_category($category_id)
{
$result = $this->model->delete_course_category($category_id);
if ($result) {
Display::addFlash(
Display::return_message(get_lang('CourseCategoryDeleted'))
);
}
$action = 'sortmycourses';
$this->courseList($action);
}
/**
* Unsubscribe user from a course
* render to listing view.
@ -512,6 +338,7 @@ class CoursesController
$includeText = false,
$btnBing = false
) {
$sessionId = (int) $sessionId;
if ($btnBing) {
$btnBing = 'btn-lg btn-block';
} else {
@ -522,7 +349,7 @@ class CoursesController
$url .= 'sequence.ajax.php?';
$url .= http_build_query([
'a' => 'get_requirements',
'id' => intval($sessionId),
'id' => $sessionId,
'type' => SequenceResource::SESSION_TYPE,
]);
@ -552,7 +379,7 @@ class CoursesController
$url .= 'auth/courses.php?';
$url .= http_build_query([
'action' => 'subscribe_to_session',
'session_id' => intval($sessionId),
'session_id' => $sessionId,
]);
$result = Display::toolbarButton(
@ -588,7 +415,7 @@ class CoursesController
$hook = HookResubscribe::create();
if (!empty($hook)) {
$hook->setEventData([
'session_id' => intval($sessionId),
'session_id' => $sessionId,
]);
try {
$hook->notifyResubscribe(HOOK_EVENT_TYPE_PRE);

@ -1,323 +0,0 @@
<?php
/* For licensing terms, see /license.txt */
/**
* View (MVC patter) for courses.
*
* @todo fix this. use twig templates
*
* @author Christian Fasanando <christian1827@gmail.com> - Beeznest
*
* @package chamilo.auth
*/
// Access rights: anonymous users can't do anything usefull here.
api_block_anonymous_users();
$stok = Security::get_token();
$courses_without_category = isset($courses_in_category[0]) ? $courses_in_category[0] : null;
echo '<div id="actions" class="actions">';
if ($action != 'createcoursecategory') {
echo '<a href="'.api_get_self().'?action=createcoursecategory">';
echo Display::return_icon('new_folder.png', get_lang('CreateCourseCategory'), '', '32');
echo '</a>';
}
echo '</div>';
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 '<a name="category'.$row['id'].'"></a>';
$url = api_get_path(WEB_CODE_PATH).'auth/courses.php?categoryid='.$row['id'].'&sec_token='.$stok;
if (isset($_GET['categoryid']) && $_GET['categoryid'] == $row['id']) {
?>
<!-- We display the edit form for the category -->
<form name="edit_course_category" method="post" action="courses.php?action=<?php echo $action; ?>">
<input type="hidden" name="edit_course_category" value="<?php echo $row['id']; ?>" />
<input type="hidden" name="sec_token" value="<?php echo $stok; ?>">
<input type="text" name="title_course_category" value="<?php echo $row['title']; ?>" />
<button class="save" type="submit" name="submit_edit_course_category"><?php echo get_lang('Ok'); ?></button>
</form>
<?php
}
if ($action != 'unsubscribe') {
if ($allowCollapsable) {
if (isset($row['collapsed']) && $row['collapsed'] == 0) {
echo Display::url(
'<i class="fa fa-folder-open"></i>',
$url.'&action=set_collapsable&option=1'
);
} else {
echo Display::url(
'<i class="fa fa-folder"></i>',
$url.'&action=set_collapsable&option=0'
);
}
} ?>
<a href="courses.php?action=sortmycourses&amp;categoryid=<?php echo $row['id']; ?>&amp;sec_token=<?php echo $stok; ?>#category<?php echo $row['id']; ?>">
<?php echo Display::display_icon('edit.png', get_lang('Edit'), '', 22); ?>
</a>
<?php if (0 != $counter) {
?>
<a href="courses.php?action=<?php echo $action; ?>&amp;move=up&amp;category=<?php echo $row['id']; ?>&amp;sec_token=<?php echo $stok; ?>">
<?php echo Display::return_icon('up.png', get_lang('Up'), '', 22); ?>
</a>
<?php
} else {
?>
<?php echo Display::return_icon('up_na.png', get_lang('Up'), '', 22); ?>
<?php
}
if ($row['id'] != $last['id']) {
?>
<a href="courses.php?action=<?php echo $action; ?>&amp;move=down&amp;category=<?php echo $row['id']; ?>&amp;sec_token=<?php echo $stok; ?>">
<?php echo Display::return_icon('down.png', get_lang('Down'), '', 22); ?>
</a>
<?php
} else {
echo Display::return_icon('down_na.png', get_lang('Down'), '', 22); ?>
<?php
} ?>
<a href="courses.php?action=deletecoursecategory&amp;id=<?php echo $row['id']; ?>&amp;sec_token=<?php echo $stok; ?>">
<?php echo Display::display_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
); ?>
</a>
<?php
}
$counter++;
echo '<br /><br />';
// Show the courses inside this category
echo '<table class="data_table">';
$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 '<tr><td>';
echo '<a name="course'.$course['code'].'"></a>';
echo '<strong>'.$course['title'].'</strong>';
echo ' ('.$course['visual_code'].')';
echo '<br />';
echo $teachersIcon;
echo '&nbsp;';
echo CourseManager::getTeacherListFromCourseCodeToString($course['code']);
echo '<br />';
if (api_get_setting('display_teacher_in_courselist') === 'true') {
echo $course['tutor'];
}
echo '</td><td valign="top">';
if (isset($_GET['edit']) && $course['code'] == $_GET['edit']) {
$edit_course = Security::remove_XSS($_GET['edit']); ?>
<form name="edit_course_category" method="post" action="courses.php?action=<?php echo $action; ?>">
<input type="hidden" name="sec_token" value="<?php echo $stok; ?>">
<input type="hidden" name="course_2_edit_category" value="<?php echo $edit_course; ?>" />
<select name="course_categories">
<option value="0"><?php echo get_lang('NoCourseCategory'); ?></option>
<?php foreach ($user_course_categories as $row) {
?>
<option value="<?php echo $row['id']; ?>"><?php echo $row['title']; ?></option>
<?php
} ?>
</select>
<button class="save" type="submit" name="submit_change_course_category"><?php echo get_lang('Ok'); ?></button>
</form>
<?php
} ?>
<div style="float:left;width:110px;">
<?php
if (api_get_setting('show_courses_descriptions_in_catalog') == 'true') {
$icon_title = get_lang('CourseDetails').' - '.$course['title']; ?>
<a href="<?php echo api_get_path(WEB_CODE_PATH); ?>inc/ajax/course_home.ajax.php?a=show_course_information&code=<?php echo $course['code']; ?>" data-title="<?php echo $icon_title; ?>" title="<?php echo $icon_title; ?>" class="ajax">
<?php echo Display::return_icon('info.png', $icon_title, '', '22'); ?>
<?php
} ?>
</a>
<?php if (isset($_GET['edit']) && $course['code'] == $_GET['edit']) {
?>
<?php echo Display::display_icon('edit_na.png', get_lang('Edit'), '', 22); ?>
<?php
} else {
?>
<a href="courses.php?action=<?php echo $action; ?>&amp;edit=<?php echo $course['code']; ?>&amp;sec_token=<?php echo $stok; ?>">
<?php echo Display::display_icon('edit.png', get_lang('Edit'), '', 22); ?>
</a>
<?php
} ?>
<?php if ($key > 0) {
?>
<a href="courses.php?action=<?php echo $action; ?>&amp;move=up&amp;course=<?php echo $course['code']; ?>&amp;category=<?php echo $course['user_course_cat']; ?>&amp;sec_token=<?php echo $stok; ?>">
<?php echo Display::display_icon('up.png', get_lang('Up'), '', 22); ?>
</a>
<?php
} else {
?>
<?php echo Display::display_icon('up_na.png', get_lang('Up'), '', 22); ?>
<?php
} ?>
<?php if ($key < $number_of_courses - 1) {
?>
<a href="courses.php?action=<?php echo $action; ?>&amp;move=down&amp;course=<?php echo $course['code']; ?>&amp;category=<?php echo $course['user_course_cat']; ?>&amp;sec_token=<?php echo $stok; ?>">
<?php echo Display::display_icon('down.png', get_lang('Down'), '', 22); ?>
</a>
<?php
} else {
?>
<?php echo Display::display_icon('down_na.png', get_lang('Down'), '', 22); ?>
<?php
} ?>
</div>
<div style="float:left; margin-right:10px;">
<?php
if ($course['status'] != 1) {
if ($course['unsubscr'] == 1) {
?>
<form action="<?php echo api_get_self(); ?>" method="post" onsubmit="javascript: if (!confirm('<?php echo addslashes(api_htmlentities(get_lang("ConfirmUnsubscribeFromCourse"), ENT_QUOTES, api_get_system_encoding())); ?>')) return false">
<input type="hidden" name="sec_token" value="<?php echo $stok; ?>">
<input type="hidden" name="unsubscribe" value="<?php echo $course['code']; ?>" />
<button class="btn btn-default" value="<?php echo get_lang('Unsubscribe'); ?>" name="unsub">
<?php echo get_lang('Unsubscribe'); ?>
</button>
</form>
</div>
<?php
}
}
$key++;
}
echo '</table>';
}
}
}
echo Display::page_subheader(get_lang('NoCourseCategory'));
echo '<table class="data_table">';
// COURSES WITHOUT CATEGORY
if (!empty($courses_without_category)) {
$number_of_courses = count($courses_without_category);
$key = 0;
foreach ($courses_without_category as $course) {
echo '<tr><td>';
echo '<a name="course'.$course['code'].'"></a>';
echo '<strong>'.$course['title'].'</strong>';
echo ' ('.$course['visual_code'].')';
echo '<br />';
echo $teachersIcon;
echo '&nbsp;';
echo CourseManager::getTeacherListFromCourseCodeToString($course['code']);
echo '<br />';
if (api_get_setting('display_teacher_in_courselist') === 'true') {
echo $course['tutor'];
}
echo '</td><td valign="top">';
// the edit icon OR the edit dropdown list
if (isset($_GET['edit']) && $course['code'] == $_GET['edit']) {
$edit_course = Security::remove_XSS($_GET['edit']); ?>
<div style="float:left;">
<form name="edit_course_category" method="post" action="courses.php?action=<?php echo $action; ?>">
<input type="hidden" name="sec_token" value="<?php echo $stok; ?>">
<input type="hidden" name="course_2_edit_category" value="<?php echo $edit_course; ?>" />
<select name="course_categories">
<option value="0"><?php echo get_lang("NoCourseCategory"); ?></option>
<?php foreach ($user_course_categories as $row) {
?>
<option value="<?php echo $row['id']; ?>"><?php echo $row['title']; ?></option>
<?php
} ?>
</select>
<button class="save" type="submit" name="submit_change_course_category"><?php echo get_lang('Ok'); ?></button>
</form><br />
</div>
<?php
} ?>
<div style="float:left; width:110px">
<?php
if (api_get_setting('show_courses_descriptions_in_catalog') == 'true') {
$icon_title = get_lang('CourseDetails').' - '.$course['title']; ?>
<a href="<?php echo api_get_path(WEB_CODE_PATH); ?>inc/ajax/course_home.ajax.php?a=show_course_information&code=<?php echo $course['code']; ?>" data-title="<?php echo $icon_title; ?>" title="<?php echo $icon_title; ?>" class="ajax">
<?php echo Display::return_icon('info.png', $icon_title, '', '22'); ?>
</a>
<?php
}
if (isset($_GET['edit']) && $course['code'] == $_GET['edit']) {
echo Display::display_icon('edit_na.png', get_lang('Edit'), '', 22);
} else {
?>
<a href="courses.php?action=<?php echo $action; ?>&amp;edit=<?php echo $course['code']; ?>&amp;sec_token=<?php echo $stok; ?>">
<?php echo Display::display_icon('edit.png', get_lang('Edit'), '', 22); ?>
</a>
<?php
}
if ($key > 0) {
?>
<a href="courses.php?action=<?php echo $action; ?>&amp;move=up&amp;course=<?php echo $course['code']; ?>&amp;category=<?php echo $course['user_course_cat']; ?>&amp;sec_token=<?php echo $stok; ?>">
<?php echo Display::display_icon('up.png', get_lang('Up'), '', 22); ?>
</a>
<?php
} else {
echo Display::display_icon('up_na.png', get_lang('Up'), '', 22);
}
if ($key < $number_of_courses - 1) {
?>
<a href="courses.php?action=<?php echo $action; ?>&amp;move=down&amp;course=<?php echo $course['code']; ?>&amp;category=<?php echo $course['user_course_cat']; ?>&amp;sec_token=<?php echo $stok; ?>">
<?php echo Display::display_icon('down.png', get_lang('Down'), '', 22); ?>
</a>
<?php
} else {
echo Display::display_icon('down_na.png', get_lang('Down'), '', 22);
} ?>
</div>
<div style="float:left; margin-right:10px;">
<!-- cancel subscrioption-->
<?php
if ($course['status'] != 1) {
if ($course['unsubscr'] == 1) {
?>
<!-- changed link to submit to avoid action by the search tool indexer -->
<form action="<?php echo api_get_self(); ?>" method="post" onsubmit="javascript: if (!confirm('<?php echo addslashes(api_htmlentities(get_lang("ConfirmUnsubscribeFromCourse"), ENT_QUOTES, api_get_system_encoding())); ?>')) return false;">
<input type="hidden" name="sec_token" value="<?php echo $stok; ?>">
<input type="hidden" name="unsubscribe" value="<?php echo $course['code']; ?>" />
<button class="btn btn-default" value="<?php echo get_lang('Unsubscribe'); ?>" name="unsub">
<?php echo get_lang('Unsubscribe'); ?>
</button>
</form>
</div>
<?php
}
} ?>
</td>
</tr>
<?php
$key++;
}
}
?>
</table>

@ -0,0 +1,460 @@
<?php
/* For licensing terms, see /license.txt */
$cidReset = true; // Flag forcing the 'current course' reset
require_once __DIR__.'/../inc/global.inc.php';
api_block_anonymous_users();
$auth = new Auth();
$user_course_categories = CourseManager::get_user_course_categories(api_get_user_id());
$courses_in_category = $auth->get_courses_in_category();
$action = isset($_REQUEST['action']) ? $_REQUEST['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 (isset($_POST['submit_change_course_category'])) {
$result = $auth->updateCourseCategory($_POST['course_2_edit_category'], $_POST['course_categories']);
if ($result) {
Display::addFlash(
Display::return_message(get_lang('EditCourseCategorySucces'))
);
}
header('Location: '.api_get_self());
exit;
}
// We edit course category
if (isset($_POST['submit_edit_course_category']) &&
isset($_POST['title_course_category'])
) {
$result = $auth->store_edit_course_category($_POST['title_course_category'], $_POST['category_id']);
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 (isset($_POST['create_course_category']) &&
isset($_POST['title_course_category']) &&
strlen(trim($_POST['title_course_category'])) > 0
) {
$result = $auth->store_course_category($_POST['title_course_category']);
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 (isset($_GET['move'])) {
if (isset($_GET['course'])) {
$result = $auth->move_course($_GET['move'], $_GET['course'], $_GET['category']);
if ($result) {
Display::addFlash(
Display::return_message(get_lang('CourseSortingDone'))
);
}
}
if (isset($_GET['category']) && !isset($_GET['course'])) {
$result = $auth->move_category($_GET['move'], $_GET['category']);
if ($result) {
Display::addFlash(
Display::return_message(get_lang('CategorySortingDone'))
);
}
}
header('Location: '.api_get_self());
exit;
}
switch ($action) {
case 'edit_category':
$categoryId = isset($_GET['category_id']) ? (int) $_GET['category_id'] : 0;
$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->addButtonSave(get_lang('Edit'), 'submit_edit_course_category');
$form->setDefaults(['title_course_category' => $categoryName]);
$form->display();
}
exit;
break;
case 'edit_course_category':
$edit_course = (int) $_GET['course_id'];
$defaultCategoryId = isset($_GET['category_id']) ? (int) $_GET['category_id'] : 0;
$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;
break;
case 'deletecoursecategory':
// we are deleting a course category
if (isset($_GET['id'])) {
if (Security::check_token('get')) {
$result = $auth->delete_course_category($_GET['id']);
if ($result) {
Display::addFlash(
Display::return_message(get_lang('CourseCategoryDeleted'))
);
}
}
}
header('Location: '.api_get_self());
exit;
break;
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;
break;
case 'set_collapsable':
if (!api_get_configuration_value('allow_user_course_category_collapsable')) {
api_not_allowed(true);
}
$userId = api_get_user_id();
$categoryId = isset($_REQUEST['categoryid']) ? (int) $_REQUEST['categoryid'] : 0;
$option = isset($_REQUEST['option']) ? (int) $_REQUEST['option'] : 0;
$redirect = isset($_REQUEST['redirect']) ? $_REQUEST['redirect'] : 0;
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;
break;
}
Display::display_header();
$stok = Security::get_token();
$courses_without_category = isset($courses_in_category[0]) ? $courses_in_category[0] : null;
echo '<div id="actions" class="actions">';
if ($action != 'createcoursecategory') {
echo '<a class="ajax" href="'.$currentUrl.'?action=createcoursecategory">';
echo Display::return_icon('new_folder.png', get_lang('CreateCourseCategory'), '', '32');
echo '</a>';
}
echo '</div>';
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 '<a name="category'.$row['id'].'"></a>';
$url = $currentUrl.'?categoryid='.$row['id'].'&sec_token='.$stok;
if ($allowCollapsable) {
if (isset($row['collapsed']) && $row['collapsed'] == 0) {
echo Display::url(
'<i class="fa fa-folder-open"></i>',
$url.'&action=set_collapsable&option=1'
);
} else {
echo Display::url(
'<i class="fa fa-folder"></i>',
$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 '<br /><br />';
// Show the courses inside this category
echo '<table class="data_table">';
$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 '<tr><td>';
echo '<a name="course'.$course['code'].'"></a>';
echo '<strong>'.$course['title'].'</strong>';
echo ' ('.$course['visual_code'].')';
echo '<br />';
echo $teachersIcon;
echo '&nbsp;';
echo CourseManager::getTeacherListFromCourseCodeToString($course['code']);
echo '<br />';
if (api_get_setting('display_teacher_in_courselist') === 'true') {
echo $course['tutor'];
}
echo '</td><td valign="top">';
?>
<div style="float:left;width:110px;">
<?php
if (api_get_setting('show_courses_descriptions_in_catalog') == 'true') {
$icon_title = get_lang('CourseDetails').' - '.$course['title']; ?>
<a href="<?php echo api_get_path(WEB_CODE_PATH); ?>inc/ajax/course_home.ajax.php?a=show_course_information&code=<?php echo $course['code']; ?>" data-title="<?php echo $icon_title; ?>" title="<?php echo $icon_title; ?>" class="ajax">
<?php
echo Display::return_icon('info.png', $icon_title, '', '22');
} ?>
</a>
<?php
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) {
?>
<a href="<?php echo $currentUrl; ?>?action=<?php echo $action; ?>&amp;move=up&amp;course=<?php echo $course['code']; ?>&amp;category=<?php echo $course['user_course_cat']; ?>&amp;sec_token=<?php echo $stok; ?>">
<?php echo Display::display_icon('up.png', get_lang('Up'), '', 22); ?>
</a>
<?php
} else {
echo Display::display_icon('up_na.png', get_lang('Up'), '', 22);
}
if ($key < $number_of_courses - 1) {
?>
<a href="<?php echo $currentUrl; ?>?action=<?php echo $action; ?>&amp;move=down&amp;course=<?php echo $course['code']; ?>&amp;category=<?php echo $course['user_course_cat']; ?>&amp;sec_token=<?php echo $stok; ?>">
<?php echo Display::return_icon('down.png', get_lang('Down'), '', 22); ?>
</a>
<?php
} else {
echo Display::return_icon('down_na.png', get_lang('Down'), '', 22);
} ?>
</div>
<div style="float:left; margin-right:10px;">
<?php
if ($course['status'] != 1) {
if ($course['unsubscr'] == 1) {
?>
<form action="<?php echo api_get_self(); ?>" method="post" onsubmit="javascript: if (!confirm('<?php echo addslashes(api_htmlentities(get_lang("ConfirmUnsubscribeFromCourse"), ENT_QUOTES, api_get_system_encoding())); ?>')) return false">
<input type="hidden" name="sec_token" value="<?php echo $stok; ?>">
<input type="hidden" name="unsubscribe" value="<?php echo $course['code']; ?>" />
<button class="btn btn-default" value="<?php echo get_lang('Unsubscribe'); ?>" name="unsub">
<?php echo get_lang('Unsubscribe'); ?>
</button>
</form>
</div>
<?php
}
}
$key++;
}
echo '</table>';
}
}
}
echo Display::page_subheader(get_lang('NoCourseCategory'));
echo '<table class="data_table">';
// COURSES WITHOUT CATEGORY
if (!empty($courses_without_category)) {
$number_of_courses = count($courses_without_category);
$key = 0;
foreach ($courses_without_category as $course) {
echo '<tr><td>';
echo '<a name="course'.$course['code'].'"></a>';
echo '<strong>'.$course['title'].'</strong>';
echo ' ('.$course['visual_code'].')';
echo '<br />';
echo $teachersIcon;
echo '&nbsp;';
echo CourseManager::getTeacherListFromCourseCodeToString($course['code']);
echo '<br />';
if (api_get_setting('display_teacher_in_courselist') === 'true') {
echo $course['tutor'];
}
echo '</td><td valign="top">';
?>
<div style="float:left; width:110px">
<?php
if (api_get_setting('show_courses_descriptions_in_catalog') == 'true') {
$icon_title = get_lang('CourseDetails').' - '.$course['title']; ?>
<a href="<?php echo api_get_path(WEB_CODE_PATH); ?>inc/ajax/course_home.ajax.php?a=show_course_information&code=<?php echo $course['code']; ?>" data-title="<?php echo $icon_title; ?>" title="<?php echo $icon_title; ?>" class="ajax">
<?php echo Display::return_icon('info.png', $icon_title, '', '22'); ?>
</a>
<?php
}
echo '';
if (isset($_GET['edit']) && $course['code'] == $_GET['edit']) {
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) {
?>
<a href="<?php echo $currentUrl; ?>?action=<?php echo $action; ?>&amp;move=up&amp;course=<?php echo $course['code']; ?>&amp;category=<?php echo $course['user_course_cat']; ?>&amp;sec_token=<?php echo $stok; ?>">
<?php echo Display::display_icon('up.png', get_lang('Up'), '', 22); ?>
</a>
<?php
} else {
echo Display::return_icon('up_na.png', get_lang('Up'), '', 22);
}
if ($key < $number_of_courses - 1) {
?>
<a href="<?php echo $currentUrl; ?>?action=<?php echo $action; ?>&amp;move=down&amp;course=<?php echo $course['code']; ?>&amp;category=<?php echo $course['user_course_cat']; ?>&amp;sec_token=<?php echo $stok; ?>">
<?php echo Display::display_icon('down.png', get_lang('Down'), '', 22); ?>
</a>
<?php
} else {
echo Display::return_icon('down_na.png', get_lang('Down'), '', 22);
} ?>
</div>
<div style="float:left; margin-right:10px;">
<?php
if ($course['status'] != 1) {
if ($course['unsubscr'] == 1) {
?>
<!-- changed link to submit to avoid action by the search tool indexer -->
<form action="<?php echo api_get_self(); ?>" method="post" onsubmit="javascript: if (!confirm('<?php echo addslashes(api_htmlentities(get_lang("ConfirmUnsubscribeFromCourse"), ENT_QUOTES, api_get_system_encoding())); ?>')) return false;">
<input type="hidden" name="sec_token" value="<?php echo $stok; ?>">
<input type="hidden" name="unsubscribe" value="<?php echo $course['code']; ?>" />
<button class="btn btn-default" value="<?php echo get_lang('Unsubscribe'); ?>" name="unsub">
<?php echo get_lang('Unsubscribe'); ?>
</button>
</form>
</div>
<?php
}
} ?>
</td>
</tr>
<?php
$key++;
}
}
?>
</table>
<?php
Display::display_footer();

@ -96,6 +96,7 @@ class Auth
$visibilityCondition = CourseManager::getCourseVisibilitySQLCondition('course', true);
$sql = "SELECT
course.id as real_id,
course.code, course.visual_code, course.subscribe subscr, course.unsubscribe unsubscr,
course.title title, course.tutor_name tutor, course.directory, course_rel_user.status status,
course_rel_user.sort sort, course_rel_user.user_course_cat user_course_cat
@ -128,8 +129,8 @@ class Auth
*/
public function updateCourseCategory($courseId, $newcategory)
{
$courseId = intval($courseId);
$newcategory = intval($newcategory);
$courseId = (int) $courseId;
$newcategory = (int) $newcategory;
$current_user = api_get_user_id();
$table = Database::get_main_table(TABLE_MAIN_COURSE_USER);
@ -289,7 +290,7 @@ class Auth
{
// protect data
$title = Database::escape_string($title);
$category_id = intval($category_id);
$category_id = (int) $category_id;
$result = false;
$table = Database::get_main_table(TABLE_USER_COURSE_CATEGORY);
$sql = "UPDATE $table
@ -315,7 +316,7 @@ class Auth
$current_user_id = api_get_user_id();
$tucc = Database::get_main_table(TABLE_USER_COURSE_CATEGORY);
$TABLECOURSUSER = Database::get_main_table(TABLE_MAIN_COURSE_USER);
$category_id = intval($category_id);
$category_id = (int) $category_id;
$result = false;
$sql = "DELETE FROM $tucc
WHERE
@ -336,6 +337,27 @@ class Auth
return $result;
}
/**
* @param int $categoryId
*
* @return array|mixed
*/
public function getUserCourseCategory($categoryId)
{
$userId = api_get_user_id();
$tucc = Database::get_main_table(TABLE_USER_COURSE_CATEGORY);
$categoryId = (int) $categoryId;
$sql = "SELECT * FROM $tucc
WHERE
id= $categoryId AND
user_id= $userId";
$resultQuery = Database::query($sql);
$result = Database::fetch_array($resultQuery, 'ASSOC');
return $result;
}
/**
* unsubscribe the user from a given course.
*

@ -3650,7 +3650,7 @@ class CourseManager
$collapsableLink = '';
if ($collapsable) {
$url = api_get_path(WEB_CODE_PATH).
'auth/courses.php?categoryid='.$row['id'].'&sec_token='.$stok.'&redirect=home';
'auth/sort_my_courses.php?categoryid='.$row['id'].'&sec_token='.$stok.'&redirect=home';
$collapsed = isset($row['collapsed']) && $row['collapsed'] ? 1 : 0;
if ($collapsed === 0) {
$collapsableLink = Display::url(

@ -16,7 +16,7 @@ class CourseCategory
public static function getCategoryById($categoryId)
{
$table = Database::get_main_table(TABLE_MAIN_CATEGORY);
$categoryId = intval($categoryId);
$categoryId = (int) $categoryId;
$sql = "SELECT * FROM $table WHERE id = $categoryId";
$result = Database::query($sql);
if (Database::num_rows($result)) {
@ -29,7 +29,7 @@ class CourseCategory
/**
* Get category details from a simple category code.
*
* @param string $category The literal category code
* @param string $categoryCode The literal category code
*
* @return array
*/
@ -41,16 +41,18 @@ class CourseCategory
$result = Database::query($sql);
if (Database::num_rows($result)) {
$category = Database::fetch_array($result, 'ASSOC');
// Get access url id
$table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE_CATEGORY);
$sql = "SELECT * FROM $table WHERE course_category_id = ".$category['id'];
$result = Database::query($sql);
$result = Database::fetch_array($result);
if ($result) {
$category['access_url_id'] = $result['access_url_id'];
}
if ($category) {
// Get access url id
$table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE_CATEGORY);
$sql = "SELECT * FROM $table WHERE course_category_id = ".$category['id'];
$result = Database::query($sql);
$result = Database::fetch_array($result);
if ($result) {
$category['access_url_id'] = $result['access_url_id'];
}
return $category;
return $category;
}
}
return [];
@ -901,21 +903,14 @@ class CourseCategory
*/
public static function getCourseCatalogNameTools($action)
{
$nameTools = get_lang('SortMyCourses');
$nameTools = get_lang('MyCourses');
if (empty($action)) {
return $nameTools; //should never happen
}
switch ($action) {
case 'createcoursecategory':
$nameTools = get_lang('CreateCourseCategory');
break;
case 'subscribe':
$nameTools = get_lang('CourseManagement');
break;
case 'subscribe_user_with_password':
$nameTools = get_lang('CourseManagement');
break;
case 'display_random_courses':
case 'display_courses':
$nameTools = get_lang('CourseManagement');

@ -1053,7 +1053,7 @@ class IndexManager
$items[] = [
'class' => 'order-course',
'icon' => Display::return_icon('order-course.png', get_lang('SortMyCourses')),
'link' => api_get_path(WEB_CODE_PATH).'auth/courses.php?action=sortmycourses',
'link' => api_get_path(WEB_CODE_PATH).'auth/sort_my_courses.php',
'title' => get_lang('SortMyCourses'),
];
}

Loading…
Cancel
Save