From be5bc900c96e0ebdc889a9343e5aa83cca68efbf Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 26 Mar 2023 12:27:34 -0500 Subject: [PATCH 1/5] Course: Add filter to show courses in catalogue with extrafield - refs BT#20638 --- .../lib/CoursesAndSessionsCatalog.class.php | 66 ++++++++++++++++++- main/inc/lib/auth.lib.php | 2 + main/inc/lib/course_category.lib.php | 15 ++++- main/install/configuration.dist.php | 11 ++++ 4 files changed, 89 insertions(+), 5 deletions(-) diff --git a/main/inc/lib/CoursesAndSessionsCatalog.class.php b/main/inc/lib/CoursesAndSessionsCatalog.class.php index 39785f905e..40a46a387c 100644 --- a/main/inc/lib/CoursesAndSessionsCatalog.class.php +++ b/main/inc/lib/CoursesAndSessionsCatalog.class.php @@ -90,6 +90,55 @@ class CoursesAndSessionsCatalog return $courseListToAvoid; } + public static function getCoursesToShowInCatalogue() + { + if (true !== api_get_configuration_value('show_courses_in_catalogue')) { + return false; + } + + $tblCourseField = Database::get_main_table(TABLE_EXTRA_FIELD); + $tblCourseFieldValue = Database::get_main_table(TABLE_EXTRA_FIELD_VALUES); + $courseListToShow = []; + + // Checks "show_in_catalog" extra field + $extraFieldType = ExtraField::COURSE_FIELD_TYPE; + $sql = "SELECT item_id FROM $tblCourseFieldValue tcfv + INNER JOIN $tblCourseField tcf + ON tcfv.field_id = tcf.id + WHERE + tcf.extra_field_type = $extraFieldType AND + tcf.variable = 'show_in_catalogue' AND + tcfv.value = 1 + "; + + $result = Database::query($sql); + if (Database::num_rows($result) > 0) { + while ($row = Database::fetch_array($result)) { + $courseListToShow[] = $row['item_id']; + } + } + + return $courseListToShow; + } + + /** + * @return string + */ + public static function getCoursesToShowInCatalogueCondition() + { + $courseListToShow = self::getCoursesToShowInCatalogue(); + $condition = ''; + if (!empty($courseListToShow)) { + $courses = []; + foreach ($courseListToShow as $courseId) { + $courses[] = '"'.$courseId.'"'; + } + $condition = ' AND course.id IN ('.implode(',', $courses).')'; + } + + return $condition; + } + /** * @return string */ @@ -120,6 +169,7 @@ class CoursesAndSessionsCatalog $tableCourse = Database::get_main_table(TABLE_MAIN_COURSE); $tableCourseRelAccessUrl = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE); $courseToAvoidCondition = self::getAvoidCourseCondition(); + $courseToShowCondition = self::getCoursesToShowInCatalogueCondition(); $visibilityCondition = CourseManager::getCourseVisibilitySQLCondition('course', true); $accessUrlId = (int) $accessUrlId; @@ -136,6 +186,7 @@ class CoursesAndSessionsCatalog course.visibility != 0 AND course.visibility != 4 $courseToAvoidCondition + $courseToShowCondition $visibilityCondition "; @@ -239,6 +290,7 @@ class CoursesAndSessionsCatalog { $tbl_course = Database::get_main_table(TABLE_MAIN_COURSE); $avoidCoursesCondition = self::getAvoidCourseCondition(); + $showCoursesCondition = self::getCoursesToShowInCatalogueCondition(); $visibilityCondition = CourseManager::getCourseVisibilitySQLCondition('course', true); if (!empty($randomValue)) { @@ -262,7 +314,7 @@ class CoursesAndSessionsCatalog FROM $tbl_course course INNER JOIN $tbl_url_rel_course as url_rel_course ON (url_rel_course.c_id = course.id) - WHERE access_url_id = $urlId"; + WHERE access_url_id = $urlId $showCoursesCondition"; $result = Database::query($sql); list($num_records) = Database::fetch_row($result); @@ -274,6 +326,7 @@ class CoursesAndSessionsCatalog $urlCondition AND RAND()*$num_records< $randomValue $avoidCoursesCondition + $showCoursesCondition $visibilityCondition ORDER BY RAND() LIMIT 0, $randomValue"; @@ -283,6 +336,7 @@ class CoursesAndSessionsCatalog WHERE RAND()*$num_records< $randomValue $avoidCoursesCondition + $showCoursesCondition $visibilityCondition ORDER BY RAND() LIMIT 0, $randomValue"; @@ -326,6 +380,7 @@ class CoursesAndSessionsCatalog WHERE 1=1 $avoidCoursesCondition + $showCoursesCondition $visibilityCondition ORDER BY title $limitFilter "; } else { @@ -333,6 +388,7 @@ class CoursesAndSessionsCatalog WHERE $conditionCode $avoidCoursesCondition + $showCoursesCondition $visibilityCondition ORDER BY title $limitFilter "; } @@ -352,6 +408,7 @@ class CoursesAndSessionsCatalog $urlCondition AND $conditionCode $avoidCoursesCondition + $showCoursesCondition $visibilityCondition ORDER BY title $limitFilter"; } else { @@ -361,6 +418,7 @@ class CoursesAndSessionsCatalog WHERE $urlCondition $avoidCoursesCondition + $showCoursesCondition $visibilityCondition ORDER BY title $limitFilter"; } @@ -422,6 +480,7 @@ class CoursesAndSessionsCatalog $courseTable = Database::get_main_table(TABLE_MAIN_COURSE); $limitFilter = self::getLimitFilterFromArray($limit); $avoidCoursesCondition = self::getAvoidCourseCondition(); + $showCoursesCondition = self::getCoursesToShowInCatalogueCondition(); $visibilityCondition = $justVisible ? CourseManager::getCourseVisibilitySQLCondition('course', true) : ''; $keyword = Database::escape_string($keyword); @@ -469,6 +528,7 @@ class CoursesAndSessionsCatalog $sqlInjectWhere $courseLanguageWhere $avoidCoursesCondition + $showCoursesCondition $visibilityCondition ORDER BY title, visual_code ASC $limitFilter @@ -500,6 +560,7 @@ class CoursesAndSessionsCatalog $categoryFilter $sqlInjectWhere $avoidCoursesCondition + $showCoursesCondition $visibilityCondition ORDER BY title, visual_code ASC $limitFilter @@ -2099,7 +2160,8 @@ class CoursesAndSessionsCatalog true, true, $conditions, - $languageSelect + $languageSelect, + true ); } diff --git a/main/inc/lib/auth.lib.php b/main/inc/lib/auth.lib.php index e8c43b9183..a8920ad3f8 100755 --- a/main/inc/lib/auth.lib.php +++ b/main/inc/lib/auth.lib.php @@ -33,6 +33,7 @@ class Auth $TABLECOURS = Database::get_main_table(TABLE_MAIN_COURSE); $TABLECOURSUSER = Database::get_main_table(TABLE_MAIN_COURSE_USER); $avoidCoursesCondition = CoursesAndSessionsCatalog::getAvoidCourseCondition(); + $showCoursesCondition = CoursesAndSessionsCatalog::getCoursesToShowInCatalogueCondition(); $visibilityCondition = CourseManager::getCourseVisibilitySQLCondition('course', true, $hidePrivate); $sql = "SELECT @@ -47,6 +48,7 @@ class Auth course_rel_user.user_id = '".$user_id."' AND course_rel_user.relation_type <> ".COURSE_RELATION_TYPE_RRHH." $avoidCoursesCondition + $showCoursesCondition $visibilityCondition ORDER BY course_rel_user.user_course_cat, course_rel_user.sort ASC"; $result = Database::query($sql); diff --git a/main/inc/lib/course_category.lib.php b/main/inc/lib/course_category.lib.php index e1bcac3191..56d906b0e2 100755 --- a/main/inc/lib/course_category.lib.php +++ b/main/inc/lib/course_category.lib.php @@ -647,7 +647,8 @@ class CourseCategory $avoidCourses = true, $checkHidePrivate = true, $conditions = [], - $courseLanguageFilter = null + $courseLanguageFilter = null, + $filterShowInCatalogue = false ) { return self::getCoursesInCategory( $category_code, @@ -656,7 +657,8 @@ class CourseCategory $checkHidePrivate, $conditions, true, - $courseLanguageFilter + $courseLanguageFilter, + $filterShowInCatalogue ); } @@ -667,7 +669,8 @@ class CourseCategory $checkHidePrivate = true, $conditions = [], $getCount = false, - $courseLanguageFilter = null + $courseLanguageFilter = null, + $filterShowInCatalogue = false ) { $tbl_course = Database::get_main_table(TABLE_MAIN_COURSE); $categoryCode = Database::escape_string($category_code); @@ -679,6 +682,11 @@ class CourseCategory } $visibilityCondition = CourseManager::getCourseVisibilitySQLCondition('course', true, $checkHidePrivate); + $showInCatalogueCondition = ''; + if ($filterShowInCatalogue) { + $showInCatalogueCondition = CoursesAndSessionsCatalog::getCoursesToShowInCatalogueCondition(); + } + $sqlInjectJoins = ''; $courseLanguageWhere = ''; $where = ' AND 1 = 1 '; @@ -732,6 +740,7 @@ class CourseCategory $categoryFilter $searchFilter $avoidCoursesCondition + $showInCatalogueCondition $visibilityCondition $where $sqlInjectWhere diff --git a/main/install/configuration.dist.php b/main/install/configuration.dist.php index 42c54d3472..d8170bd0ac 100644 --- a/main/install/configuration.dist.php +++ b/main/install/configuration.dist.php @@ -2399,6 +2399,17 @@ ALTER TABLE c_wiki_category ADD CONSTRAINT FK_17F1099A727ACA70 FOREIGN KEY (pare // main URL (where the access_url_changeable field = 0) // $_configuration['multiple_url_hide_disabled_settings'] = false; +// Only courses with this option will be visible in catalogue +// Requires DB changes: +/* +INSERT INTO extra_field (extra_field_type, field_type, variable, display_text, default_value, field_order, visible_to_self, visible_to_others, changeable, filter, created_at) VALUES +(2, 3, 'show_in_catalogue', 'Show in catalogue', '', 0, 1, 1, 1, 0, NOW()); +SET @ef_id = LAST_INSERT_ID(); +INSERT INTO extra_field_options (field_id, option_value, display_text, priority, priority_message, option_order) VALUES +(@ef_id, '1', 'Yes', NULL, NULL, 1), +(@ef_id, '0', 'No', NULL, NULL, 2); +//$_configuration['show_courses_in_catalogue'] = false; + // KEEP THIS AT THE END // -------- Custom DB changes // Add user activation by confirmation email From 8f745a2b2b5d772616161f611cc60dffa20c5976 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 28 Mar 2023 21:55:00 -0500 Subject: [PATCH 2/5] Course: Add filter to show courses by categories - refs BT#20638 --- .../lib/CoursesAndSessionsCatalog.class.php | 24 +++++++++++++++++++ main/install/configuration.dist.php | 3 +++ 2 files changed, 27 insertions(+) diff --git a/main/inc/lib/CoursesAndSessionsCatalog.class.php b/main/inc/lib/CoursesAndSessionsCatalog.class.php index 40a46a387c..3e81164e63 100644 --- a/main/inc/lib/CoursesAndSessionsCatalog.class.php +++ b/main/inc/lib/CoursesAndSessionsCatalog.class.php @@ -126,11 +126,30 @@ class CoursesAndSessionsCatalog */ public static function getCoursesToShowInCatalogueCondition() { + $categoriesToShow = api_get_configuration_value('courses_catalogue_show_only_category'); + $coursesCategoryInCatalogue = []; + if (!empty($categoriesToShow)) { + foreach ($categoriesToShow as $categoryCode) { + $courseCategories = CourseCategory::getCoursesInCategory($categoryCode, '', false); + if (!empty($courseCategories)) { + foreach ($courseCategories as $course) { + $coursesCategoryInCatalogue[] = $course['id']; + } + } + } + } + $courseListToShow = self::getCoursesToShowInCatalogue(); + if (false === $courseListToShow) { + $courseListToShow = $coursesCategoryInCatalogue; + } $condition = ''; if (!empty($courseListToShow)) { $courses = []; foreach ($courseListToShow as $courseId) { + if (!empty($categoriesToShow) && !in_array($courseId, $coursesCategoryInCatalogue)) { + continue; + } $courses[] = '"'.$courseId.'"'; } $condition = ' AND course.id IN ('.implode(',', $courses).')'; @@ -222,8 +241,13 @@ class CoursesAndSessionsCatalog if (api_is_student()) { $categoryToAvoid = api_get_configuration_value('course_category_code_to_use_as_model'); } + + $showOnlyCategory = api_get_configuration_value('courses_catalogue_show_only_category'); foreach ($allCategories as $category) { $categoryCode = $category['code']; + if (!($showOnlyCategory && in_array($categoryCode, $showOnlyCategory))) { + continue; + } if (!empty($categoryToAvoid) && $categoryToAvoid == $categoryCode) { continue; } diff --git a/main/install/configuration.dist.php b/main/install/configuration.dist.php index d8170bd0ac..727af2bcba 100644 --- a/main/install/configuration.dist.php +++ b/main/install/configuration.dist.php @@ -2410,6 +2410,9 @@ INSERT INTO extra_field_options (field_id, option_value, display_text, priority, (@ef_id, '0', 'No', NULL, NULL, 2); //$_configuration['show_courses_in_catalogue'] = false; +// Allows defining one or several categories of courses that will be visible in the course catalog +// $_configuration['courses_catalogue_show_only_category'] = ['Cat1','Cat2']; + // KEEP THIS AT THE END // -------- Custom DB changes // Add user activation by confirmation email From 3612b7001c64656f66a5997ce068dc1b3c2aab1a Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 3 Apr 2023 13:44:11 -0500 Subject: [PATCH 3/5] Course: Improve filter to show courses in catalogue with extrafield - refs BT#20638 --- .../lib/CoursesAndSessionsCatalog.class.php | 34 +++++++++++++------ main/install/configuration.dist.php | 1 + 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/main/inc/lib/CoursesAndSessionsCatalog.class.php b/main/inc/lib/CoursesAndSessionsCatalog.class.php index 3e81164e63..fe4039fd8e 100644 --- a/main/inc/lib/CoursesAndSessionsCatalog.class.php +++ b/main/inc/lib/CoursesAndSessionsCatalog.class.php @@ -92,10 +92,6 @@ class CoursesAndSessionsCatalog public static function getCoursesToShowInCatalogue() { - if (true !== api_get_configuration_value('show_courses_in_catalogue')) { - return false; - } - $tblCourseField = Database::get_main_table(TABLE_EXTRA_FIELD); $tblCourseFieldValue = Database::get_main_table(TABLE_EXTRA_FIELD_VALUES); $courseListToShow = []; @@ -127,6 +123,7 @@ class CoursesAndSessionsCatalog public static function getCoursesToShowInCatalogueCondition() { $categoriesToShow = api_get_configuration_value('courses_catalogue_show_only_category'); + $coursesToShow = api_get_configuration_value('show_courses_in_catalogue'); $coursesCategoryInCatalogue = []; if (!empty($categoriesToShow)) { foreach ($categoriesToShow as $categoryCode) { @@ -140,18 +137,31 @@ class CoursesAndSessionsCatalog } $courseListToShow = self::getCoursesToShowInCatalogue(); - if (false === $courseListToShow) { - $courseListToShow = $coursesCategoryInCatalogue; + $courses = []; + if (!empty($coursesCategoryInCatalogue)) { + foreach ($coursesCategoryInCatalogue as $courseId) { + if ($coursesToShow && !in_array($courseId, $courseListToShow)) { + continue; + } + $courses[] = '"'.$courseId.'"'; + } } - $condition = ''; - if (!empty($courseListToShow)) { - $courses = []; + + if ($coursesToShow && !empty($courseListToShow)) { foreach ($courseListToShow as $courseId) { - if (!empty($categoriesToShow) && !in_array($courseId, $coursesCategoryInCatalogue)) { + $courseInfo = api_get_course_info_by_id($courseId); + if (!empty($courseInfo['category_code']) && + !empty($categoriesToShow) && + !in_array($courseId, $coursesCategoryInCatalogue) + ) { continue; } $courses[] = '"'.$courseId.'"'; } + } + + $condition = ''; + if (!empty($courses)) { $condition = ' AND course.id IN ('.implode(',', $courses).')'; } @@ -170,7 +180,9 @@ class CoursesAndSessionsCatalog foreach ($courseListToAvoid as $courseId) { $courses[] = '"'.$courseId.'"'; } - $condition = ' AND course.id NOT IN ('.implode(',', $courses).')'; + if (!empty($courses)) { + $condition = ' AND course.id NOT IN ('.implode(',', $courses).')'; + } } return $condition; diff --git a/main/install/configuration.dist.php b/main/install/configuration.dist.php index 727af2bcba..8e10476fc9 100644 --- a/main/install/configuration.dist.php +++ b/main/install/configuration.dist.php @@ -2408,6 +2408,7 @@ SET @ef_id = LAST_INSERT_ID(); INSERT INTO extra_field_options (field_id, option_value, display_text, priority, priority_message, option_order) VALUES (@ef_id, '1', 'Yes', NULL, NULL, 1), (@ef_id, '0', 'No', NULL, NULL, 2); +*/ //$_configuration['show_courses_in_catalogue'] = false; // Allows defining one or several categories of courses that will be visible in the course catalog From 7812c65ae44cff0452adca1f0293e4e8f454b3f7 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 3 Apr 2023 16:27:38 -0500 Subject: [PATCH 4/5] Course: Add filter to show courses in catalogue - refs BT#20638 --- main/inc/lib/CoursesAndSessionsCatalog.class.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/main/inc/lib/CoursesAndSessionsCatalog.class.php b/main/inc/lib/CoursesAndSessionsCatalog.class.php index fe4039fd8e..2787cd4a35 100644 --- a/main/inc/lib/CoursesAndSessionsCatalog.class.php +++ b/main/inc/lib/CoursesAndSessionsCatalog.class.php @@ -149,11 +149,7 @@ class CoursesAndSessionsCatalog if ($coursesToShow && !empty($courseListToShow)) { foreach ($courseListToShow as $courseId) { - $courseInfo = api_get_course_info_by_id($courseId); - if (!empty($courseInfo['category_code']) && - !empty($categoriesToShow) && - !in_array($courseId, $coursesCategoryInCatalogue) - ) { + if (!empty($categoriesToShow) && !in_array($courseId, $coursesCategoryInCatalogue)) { continue; } $courses[] = '"'.$courseId.'"'; From 5bb00f8d7394a0758d859682c5c2b1c9c6592e4d Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 4 Apr 2023 09:37:14 -0500 Subject: [PATCH 5/5] Course: Improve filter for courses in catalogue - refs BT#20638 --- main/inc/lib/CoursesAndSessionsCatalog.class.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/main/inc/lib/CoursesAndSessionsCatalog.class.php b/main/inc/lib/CoursesAndSessionsCatalog.class.php index 2787cd4a35..819d16dc3f 100644 --- a/main/inc/lib/CoursesAndSessionsCatalog.class.php +++ b/main/inc/lib/CoursesAndSessionsCatalog.class.php @@ -156,6 +156,12 @@ class CoursesAndSessionsCatalog } } + if (empty($courses)) { + if ($categoriesToShow || (!$categoriesToShow && $coursesToShow)) { + $courses[] = 0; + } + } + $condition = ''; if (!empty($courses)) { $condition = ' AND course.id IN ('.implode(',', $courses).')';