From be5bc900c96e0ebdc889a9343e5aa83cca68efbf Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 26 Mar 2023 12:27:34 -0500 Subject: [PATCH] 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