Merge pull request #4660 from christianbeeznest/FS-20638

Course: Add filter to show courses in catalogue with extrafield - refs BT#20638
pull/4669/head
Nicolas Ducoulombier 3 years ago committed by GitHub
commit 30cd2deffa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 106
      main/inc/lib/CoursesAndSessionsCatalog.class.php
  2. 2
      main/inc/lib/auth.lib.php
  3. 15
      main/inc/lib/course_category.lib.php
  4. 15
      main/install/configuration.dist.php

@ -90,6 +90,86 @@ class CoursesAndSessionsCatalog
return $courseListToAvoid;
}
public static function getCoursesToShowInCatalogue()
{
$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()
{
$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) {
$courseCategories = CourseCategory::getCoursesInCategory($categoryCode, '', false);
if (!empty($courseCategories)) {
foreach ($courseCategories as $course) {
$coursesCategoryInCatalogue[] = $course['id'];
}
}
}
}
$courseListToShow = self::getCoursesToShowInCatalogue();
$courses = [];
if (!empty($coursesCategoryInCatalogue)) {
foreach ($coursesCategoryInCatalogue as $courseId) {
if ($coursesToShow && !in_array($courseId, $courseListToShow)) {
continue;
}
$courses[] = '"'.$courseId.'"';
}
}
if ($coursesToShow && !empty($courseListToShow)) {
foreach ($courseListToShow as $courseId) {
if (!empty($categoriesToShow) && !in_array($courseId, $coursesCategoryInCatalogue)) {
continue;
}
$courses[] = '"'.$courseId.'"';
}
}
if (empty($courses)) {
if ($categoriesToShow || (!$categoriesToShow && $coursesToShow)) {
$courses[] = 0;
}
}
$condition = '';
if (!empty($courses)) {
$condition = ' AND course.id IN ('.implode(',', $courses).')';
}
return $condition;
}
/**
* @return string
*/
@ -102,7 +182,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;
@ -120,6 +202,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 +219,7 @@ class CoursesAndSessionsCatalog
course.visibility != 0 AND
course.visibility != 4
$courseToAvoidCondition
$courseToShowCondition
$visibilityCondition
";
@ -171,8 +255,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;
}
@ -239,6 +328,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 +352,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 +364,7 @@ class CoursesAndSessionsCatalog
$urlCondition AND
RAND()*$num_records< $randomValue
$avoidCoursesCondition
$showCoursesCondition
$visibilityCondition
ORDER BY RAND()
LIMIT 0, $randomValue";
@ -283,6 +374,7 @@ class CoursesAndSessionsCatalog
WHERE
RAND()*$num_records< $randomValue
$avoidCoursesCondition
$showCoursesCondition
$visibilityCondition
ORDER BY RAND()
LIMIT 0, $randomValue";
@ -326,6 +418,7 @@ class CoursesAndSessionsCatalog
WHERE
1=1
$avoidCoursesCondition
$showCoursesCondition
$visibilityCondition
ORDER BY title $limitFilter ";
} else {
@ -333,6 +426,7 @@ class CoursesAndSessionsCatalog
WHERE
$conditionCode
$avoidCoursesCondition
$showCoursesCondition
$visibilityCondition
ORDER BY title $limitFilter ";
}
@ -352,6 +446,7 @@ class CoursesAndSessionsCatalog
$urlCondition AND
$conditionCode
$avoidCoursesCondition
$showCoursesCondition
$visibilityCondition
ORDER BY title $limitFilter";
} else {
@ -361,6 +456,7 @@ class CoursesAndSessionsCatalog
WHERE
$urlCondition
$avoidCoursesCondition
$showCoursesCondition
$visibilityCondition
ORDER BY title $limitFilter";
}
@ -422,6 +518,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 +566,7 @@ class CoursesAndSessionsCatalog
$sqlInjectWhere
$courseLanguageWhere
$avoidCoursesCondition
$showCoursesCondition
$visibilityCondition
ORDER BY title, visual_code ASC
$limitFilter
@ -500,6 +598,7 @@ class CoursesAndSessionsCatalog
$categoryFilter
$sqlInjectWhere
$avoidCoursesCondition
$showCoursesCondition
$visibilityCondition
ORDER BY title, visual_code ASC
$limitFilter
@ -2099,7 +2198,8 @@ class CoursesAndSessionsCatalog
true,
true,
$conditions,
$languageSelect
$languageSelect,
true
);
}

@ -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);

@ -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

@ -2409,6 +2409,21 @@ INSERT INTO extra_field (extra_field_type, field_type, variable, display_text, d
// 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;
// Allows defining one or several categories of courses that will be visible in the course catalog
// $_configuration['courses_catalogue_show_only_category'] = ['Cat1','Cat2'];
//Hides the link to the course catalog in the menu when the catalog is public.
// $_configuration['catalog_hide_public_link'] = false;

Loading…
Cancel
Save