Просмотр исходного кода

Fix course list see BT#12458

- Add order in query
- Use function get_courses_list_by_user_id instead of custom query
- Use url id in query instead of custom query
- Add new parameter bool $loadSpecialCourses (true by default as before)
jmontoyaa 8 лет назад
Родитель
Сommit
862f7ec73d
2 измененных файлов с 56 добавлено и 46 удалено
  1. 14 17
      main/coursecopy/copy_course.php
  2. 42 29
      main/inc/lib/course.lib.php

+ 14 - 17
main/coursecopy/copy_course.php

@@ -48,7 +48,6 @@ if (Security::check_token('post') && (
 ) {
     // Clear token
     Security::clear_token();
-
     if (isset($_POST['action']) && $_POST['action'] == 'course_select_form') {
         $course = CourseSelectForm::get_posted_course('copy_course');
     } else {
@@ -85,24 +84,22 @@ if (Security::check_token('post') && (
     $table_cu = Database :: get_main_table(TABLE_MAIN_COURSE_USER);
     $user_info = api_get_user_info();
     $course_info = api_get_course_info();
-    $sql = 'SELECT *
-            FROM '.$table_c.' c, '.$table_cu.' cu
-            WHERE cu.c_id = c.id';
-    if (!api_is_platform_admin()) {
-        $sql .= ' AND cu.status=1 ';
-    }
-    $sql .= ' AND
-            cu.user_id = '.$user_info['user_id'].' AND
-            c.id != '."'".$course_info['real_id']."'".'
-            ORDER BY title ASC';
-    $res = Database::query($sql);
-    if (Database::num_rows($res) == 0) {
-        Display::display_normal_message(get_lang('NoDestinationCoursesAvailable'));
+    $courseList = CourseManager::get_courses_list_by_user_id(
+        $user_info['user_id'],
+        false,
+        false,
+        false
+    );
+
+    if (empty($courseList)) {
+        Display::addFlash(
+            Display::return_message(get_lang('NoDestinationCoursesAvailable'))
+        );
     } else {
         $options = array();
-        while ($obj = Database::fetch_object($res)) {
-            $courseInfo = api_get_course_info_by_id($obj->c_id);
-            $options[$courseInfo['code']] = $obj->title.' ('.$obj->code.')';
+        foreach ($courseList as $courseItem) {
+            $courseInfo = api_get_course_info_by_id($courseItem['real_id']);
+            $options[$courseInfo['code']] = $courseInfo['title'].' ('.$courseInfo['code'].')';
         }
 
         $form = new FormValidator(

+ 42 - 29
main/inc/lib/course.lib.php

@@ -2683,13 +2683,15 @@ class CourseManager
      * @param boolean $include_sessions Whether to include courses from session or not
      * @param boolean $adminGetsAllCourses If the user is platform admin,
      * whether he gets all the courses or just his. Note: This does *not* include all sessions
+     * @param bool $loadSpecialCourses
      * @return array    List of codes and db name
      * @author isaac flores paz
      */
     public static function get_courses_list_by_user_id(
         $user_id,
         $include_sessions = false,
-        $adminGetsAllCourses = false
+        $adminGetsAllCourses = false,
+        $loadSpecialCourses = true
     ) {
         $user_id = intval($user_id);
         $urlId = api_get_current_access_url_id();
@@ -2700,7 +2702,7 @@ class CourseManager
         $tbl_course_user = Database::get_main_table(TABLE_MAIN_COURSE_USER);
         $tbl_user_course_category = Database::get_main_table(TABLE_USER_COURSE_CATEGORY);
         $tableCourseUrl = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
-        $special_course_list = self::get_special_course_list();
+
         if ($adminGetsAllCourses && UserManager::is_admin($user_id)) {
             // get the whole courses list
             $sql = "SELECT DISTINCT(course.code), course.id as real_id
@@ -2710,32 +2712,41 @@ class CourseManager
                     WHERE url.access_url_id = $urlId      
                 ";
         } else {
-            $with_special_courses = $without_special_courses = '';
-            if (!empty($special_course_list)) {
-                $sc_string = '"' . implode('","', $special_course_list) . '"';
-                $with_special_courses = ' AND course.id IN (' . $sc_string . ')';
-                $without_special_courses = ' AND course.id NOT IN (' . $sc_string . ')';
-            }
-
-            if (!empty($with_special_courses)) {
-                $sql = "SELECT DISTINCT(course.code), course.id as real_id
-                        FROM $tbl_course_user course_rel_user
-                        LEFT JOIN $tbl_course course
-                        ON course.id = course_rel_user.c_id
-                        LEFT JOIN $tbl_user_course_category user_course_category
-                        ON course_rel_user.user_course_cat = user_course_category.id
-                        INNER JOIN $tableCourseUrl url 
-                        ON (course.id = url.c_id)  
-                        WHERE url.access_url_id = $urlId $with_special_courses                        
-                        GROUP BY course.code
-                        ORDER BY user_course_category.sort, course.title, course_rel_user.sort ASC
-                ";
-                $rs_special_course = Database::query($sql);
-                if (Database::num_rows($rs_special_course) > 0) {
-                    while ($result_row = Database::fetch_array($rs_special_course)) {
-                        $result_row['special_course'] = 1;
-                        $course_list[] = $result_row;
-                        $codes[] = $result_row['real_id'];
+            $withSpecialCourses = $withoutSpecialCourses = '';
+            if ($loadSpecialCourses) {
+                $specialCourseList = self::get_special_course_list();
+
+                if (!empty($specialCourseList)) {
+                    $specialCourseToString = '"'.implode(
+                            '","',
+                            $specialCourseList
+                        ).'"';
+                    $withSpecialCourses = ' AND course.id IN ('.$specialCourseToString.')';
+                    $withoutSpecialCourses = ' AND course.id NOT IN ('.$specialCourseToString.')';
+                }
+
+                if (!empty($withSpecialCourses)) {
+                    $sql = "SELECT DISTINCT(course.code), course.id as real_id
+                            FROM $tbl_course_user course_rel_user
+                            LEFT JOIN $tbl_course course
+                            ON course.id = course_rel_user.c_id
+                            LEFT JOIN $tbl_user_course_category user_course_category
+                            ON course_rel_user.user_course_cat = user_course_category.id
+                            INNER JOIN $tableCourseUrl url 
+                            ON (course.id = url.c_id)  
+                            WHERE url.access_url_id = $urlId $withSpecialCourses                        
+                            GROUP BY course.code
+                            ORDER BY user_course_category.sort, course.title, course_rel_user.sort ASC
+                    ";
+                    $rs_special_course = Database::query($sql);
+                    if (Database::num_rows($rs_special_course) > 0) {
+                        while ($result_row = Database::fetch_array(
+                            $rs_special_course
+                        )) {
+                            $result_row['special_course'] = 1;
+                            $course_list[] = $result_row;
+                            $codes[] = $result_row['real_id'];
+                        }
                     }
                 }
             }
@@ -2751,7 +2762,9 @@ class CourseManager
                     WHERE 
                         url.access_url_id = $urlId AND 
                         cru.user_id = '$user_id' 
-                        $without_special_courses";
+                        $withoutSpecialCourses
+                    ORDER BY course.title
+                    ";
         }
         $result = Database::query($sql);