You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1151 lines
36 KiB
1151 lines
36 KiB
<?php
|
|
/* For licensing terms, see /license.txt */
|
|
|
|
/**
|
|
* Returns whether we are in a mode where multiple URLs are configured to work
|
|
* with course categories
|
|
* @return bool
|
|
*/
|
|
function isMultipleUrlSupport()
|
|
{
|
|
return api_get_configuration_value('enable_multiple_url_support_for_course_category');
|
|
}
|
|
|
|
/**
|
|
* Returns the category fields from the database from an int ID
|
|
* @param int $categoryId The category ID
|
|
* @return array
|
|
*/
|
|
function getCategoryById($categoryId)
|
|
{
|
|
$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
$categoryId = intval($categoryId);
|
|
$sql = "SELECT * FROM $tbl_category WHERE id = $categoryId";
|
|
$result = Database::query($sql);
|
|
if (Database::num_rows($result)) {
|
|
return Database::fetch_array($result, 'ASSOC');
|
|
}
|
|
|
|
return array();
|
|
}
|
|
|
|
/**
|
|
* Get category details from a simple category code
|
|
* @param string $category The literal category code
|
|
* @return array
|
|
*/
|
|
function getCategory($category)
|
|
{
|
|
$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
$category = Database::escape_string($category);
|
|
$sql = "SELECT * FROM $tbl_category WHERE code ='$category'";
|
|
$result = Database::query($sql);
|
|
if (Database::num_rows($result)) {
|
|
return Database::fetch_array($result, 'ASSOC');
|
|
}
|
|
|
|
return array();
|
|
}
|
|
|
|
/**
|
|
* @param string $category
|
|
*
|
|
* @return array
|
|
*/
|
|
function getCategories($category)
|
|
{
|
|
$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
|
|
$category = Database::escape_string($category);
|
|
$conditions = null;
|
|
$whereCondition = '';
|
|
|
|
if (isMultipleUrlSupport()) {
|
|
$table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE_CATEGORY);
|
|
$conditions = " INNER JOIN $table a ON (t1.id = a.course_category_id)";
|
|
$whereCondition = " AND a.access_url_id = ".api_get_current_access_url_id();
|
|
}
|
|
|
|
$parentIdCondition = " AND (t1.parent_id IS NULL OR t1.parent_id = '' )";
|
|
if (!empty($category)) {
|
|
$parentIdCondition = " AND t1.parent_id = '$category' ";
|
|
}
|
|
|
|
$sql = "SELECT
|
|
t1.name,
|
|
t1.code,
|
|
t1.parent_id,
|
|
t1.tree_pos,
|
|
t1.children_count,
|
|
COUNT(DISTINCT t3.code) AS nbr_courses
|
|
FROM $tbl_category t1
|
|
$conditions
|
|
LEFT JOIN $tbl_category t2
|
|
ON t1.code = t2.parent_id
|
|
LEFT JOIN $tbl_course t3
|
|
ON t3.category_code=t1.code
|
|
WHERE
|
|
1 = 1
|
|
$parentIdCondition
|
|
$whereCondition
|
|
GROUP BY t1.name,
|
|
t1.code,
|
|
t1.parent_id,
|
|
t1.tree_pos,
|
|
t1.children_count
|
|
ORDER BY t1.tree_pos";
|
|
|
|
$result = Database::query($sql);
|
|
|
|
$categories = Database::store_result($result);
|
|
foreach ($categories as $category) {
|
|
$category['nbr_courses'] = 1;
|
|
}
|
|
|
|
return $categories;
|
|
}
|
|
|
|
/**
|
|
* @param string $code
|
|
* @param string $name
|
|
* @param string $canHaveCourses
|
|
* @param int $parent_id
|
|
*
|
|
* @return bool
|
|
*/
|
|
function addNode($code, $name, $canHaveCourses, $parent_id)
|
|
{
|
|
$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
$code = trim($code);
|
|
$name = trim($name);
|
|
$parent_id = trim($parent_id);
|
|
|
|
$code = CourseManager::generate_course_code($code);
|
|
$sql = "SELECT 1 FROM $tbl_category
|
|
WHERE code = '".Database::escape_string($code)."'";
|
|
$result = Database::query($sql);
|
|
if (Database::num_rows($result)) {
|
|
return false;
|
|
}
|
|
$result = Database::query("SELECT MAX(tree_pos) AS maxTreePos FROM $tbl_category");
|
|
$row = Database::fetch_array($result);
|
|
$tree_pos = $row['maxTreePos'] + 1;
|
|
|
|
$params = [
|
|
'name' => $name,
|
|
'code' => $code,
|
|
'parent_id' => empty($parent_id) ? '' : $parent_id,
|
|
'tree_pos' => $tree_pos,
|
|
'children_count' => 0,
|
|
'auth_course_child' => $canHaveCourses,
|
|
'auth_cat_child' => 'TRUE'
|
|
];
|
|
|
|
$categoryId = Database::insert($tbl_category, $params);
|
|
|
|
updateParentCategoryChildrenCount($parent_id, 1);
|
|
|
|
if (isMultipleUrlSupport()) {
|
|
addToUrl($categoryId);
|
|
}
|
|
|
|
return $categoryId;
|
|
}
|
|
|
|
/**
|
|
* Recursive function that updates the count of children in the parent
|
|
* @param string $categoryId Category ID
|
|
* @param int $delta The number to add or delete (1 to add one, -1 to remove one)
|
|
*/
|
|
function updateParentCategoryChildrenCount($categoryId, $delta = 1)
|
|
{
|
|
$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
$categoryId = Database::escape_string($categoryId);
|
|
$delta = intval($delta);
|
|
// First get to the highest level possible in the tree
|
|
$result = Database::query("SELECT parent_id FROM $tbl_category WHERE code = '$categoryId'");
|
|
$row = Database::fetch_array($result);
|
|
if ($row !== false and $row['parent_id'] != 0) {
|
|
// if a parent was found, enter there to see if he's got one more parent
|
|
updateParentCategoryChildrenCount($row['parent_id'], $delta);
|
|
}
|
|
// Now we're at the top, get back down to update each child
|
|
//$children_count = courseCategoryChildrenCount($categoryId);
|
|
if ($delta >= 0) {
|
|
$sql = "UPDATE $tbl_category SET children_count = (children_count + $delta)
|
|
WHERE code = '$categoryId'";
|
|
} else {
|
|
$sql = "UPDATE $tbl_category SET children_count = (children_count - ".abs($delta).")
|
|
WHERE code = '$categoryId'";
|
|
}
|
|
Database::query($sql);
|
|
}
|
|
|
|
/**
|
|
* @param string $node
|
|
*/
|
|
function deleteNode($node)
|
|
{
|
|
$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
|
|
$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
|
|
$node = Database::escape_string($node);
|
|
|
|
$result = Database::query("SELECT parent_id, tree_pos FROM $tbl_category WHERE code='$node'");
|
|
|
|
if ($row = Database::fetch_array($result)) {
|
|
if (!empty($row['parent_id'])) {
|
|
Database::query("UPDATE $tbl_course SET category_code = '".$row['parent_id']."' WHERE category_code='$node'");
|
|
Database::query("UPDATE $tbl_category SET parent_id='" . $row['parent_id'] . "' WHERE parent_id='$node'");
|
|
} else {
|
|
Database::query("UPDATE $tbl_course SET category_code='' WHERE category_code='$node'");
|
|
Database::query("UPDATE $tbl_category SET parent_id=NULL WHERE parent_id='$node'");
|
|
}
|
|
|
|
Database::query("UPDATE $tbl_category SET tree_pos=tree_pos-1 WHERE tree_pos > '" . $row['tree_pos'] . "'");
|
|
Database::query("DELETE FROM $tbl_category WHERE code='$node'");
|
|
|
|
if (!empty($row['parent_id'])) {
|
|
updateParentCategoryChildrenCount($row['parent_id'], -1);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param string $code
|
|
* @param string $name
|
|
* @param string $canHaveCourses
|
|
* @param string $old_code
|
|
* @return bool
|
|
*/
|
|
function editNode($code, $name, $canHaveCourses, $old_code)
|
|
{
|
|
$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
|
|
$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
|
|
$code = trim(Database::escape_string($code));
|
|
$name = trim(Database::escape_string($name));
|
|
$old_code = Database::escape_string($old_code);
|
|
$canHaveCourses = Database::escape_string($canHaveCourses);
|
|
|
|
$code = CourseManager::generate_course_code($code);
|
|
// Updating category
|
|
$sql = "UPDATE $tbl_category SET name='$name', code='$code', auth_course_child = '$canHaveCourses'
|
|
WHERE code = '$old_code'";
|
|
Database::query($sql);
|
|
|
|
// Updating children
|
|
$sql = "UPDATE $tbl_category SET parent_id = '$code'
|
|
WHERE parent_id = '$old_code'";
|
|
Database::query($sql);
|
|
|
|
// Updating course category
|
|
$sql = "UPDATE $tbl_course SET category_code = '$code'
|
|
WHERE category_code = '$old_code' ";
|
|
Database::query($sql);
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Move a node up on display
|
|
* @param string $code
|
|
* @param int $tree_pos
|
|
* @param string $parent_id
|
|
*
|
|
* @return bool
|
|
*/
|
|
function moveNodeUp($code, $tree_pos, $parent_id)
|
|
{
|
|
$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
$code = Database::escape_string($code);
|
|
$tree_pos = intval($tree_pos);
|
|
$parent_id = Database::escape_string($parent_id);
|
|
|
|
$parentIdCondition = " AND (parent_id IS NULL OR parent_id = '' )";
|
|
if (!empty($parent_id)) {
|
|
$parentIdCondition = " AND parent_id = '$parent_id' ";
|
|
}
|
|
|
|
$sql = "SELECT code,tree_pos
|
|
FROM $tbl_category
|
|
WHERE
|
|
tree_pos < $tree_pos
|
|
$parentIdCondition
|
|
ORDER BY tree_pos DESC
|
|
LIMIT 0,1";
|
|
|
|
$result = Database::query($sql);
|
|
if (!$row = Database::fetch_array($result)) {
|
|
$sql = "SELECT code, tree_pos
|
|
FROM $tbl_category
|
|
WHERE
|
|
tree_pos > $tree_pos
|
|
$parentIdCondition
|
|
ORDER BY tree_pos DESC
|
|
LIMIT 0,1";
|
|
$result2 = Database::query($sql);
|
|
if (!$row = Database::fetch_array($result2)) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
$sql = "UPDATE $tbl_category
|
|
SET tree_pos ='" . $row['tree_pos'] . "'
|
|
WHERE code='$code'";
|
|
Database::query($sql);
|
|
|
|
$sql = "UPDATE $tbl_category
|
|
SET tree_pos = '$tree_pos'
|
|
WHERE code= '" . $row['code'] . "'";
|
|
Database::query($sql);
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Counts the number of children categories a category has
|
|
* @param int $categoryId The ID of the category of which we want to count the children
|
|
* @param int $count The number of subcategories we counted this far
|
|
* @return mixed The number of subcategories this category has
|
|
*/
|
|
function courseCategoryChildrenCount($categoryId)
|
|
{
|
|
$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
$categoryId = intval($categoryId);
|
|
$count = 0;
|
|
if (empty($categoryId)) {
|
|
return 0;
|
|
}
|
|
$sql = "SELECT id, code FROM $tbl_category WHERE parent_id = $categoryId";
|
|
$result = Database::query($sql);
|
|
while ($row = Database::fetch_array($result)) {
|
|
$count += courseCategoryChildrenCount($row['id']);
|
|
}
|
|
$sql = "UPDATE $tbl_category SET children_count = $count WHERE id = $categoryId";
|
|
Database::query($sql);
|
|
|
|
return $count + 1;
|
|
}
|
|
|
|
/**
|
|
* @param string $categoryCode
|
|
*
|
|
* @return array
|
|
*/
|
|
function getChildren($categoryCode)
|
|
{
|
|
$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
$categoryCode = Database::escape_string($categoryCode);
|
|
$result = Database::query("SELECT code, id FROM $tbl_category WHERE parent_id = '$categoryCode'");
|
|
$children = array();
|
|
while ($row = Database::fetch_array($result, 'ASSOC')) {
|
|
$children[] = $row;
|
|
$subChildren = getChildren($row['code']);
|
|
$children = array_merge($children, $subChildren);
|
|
}
|
|
|
|
return $children;
|
|
}
|
|
|
|
/**
|
|
* @param string $categoryCode
|
|
*
|
|
* @return array
|
|
*/
|
|
function getParents($categoryCode)
|
|
{
|
|
if (empty($categoryCode)) {
|
|
return array();
|
|
}
|
|
|
|
$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
$categoryCode = Database::escape_string($categoryCode);
|
|
$sql = "SELECT code, parent_id FROM $tbl_category
|
|
WHERE code = '$categoryCode'";
|
|
|
|
$result = Database::query($sql);
|
|
$children = array();
|
|
while ($row = Database::fetch_array($result, 'ASSOC')) {
|
|
$parent = getCategory($row['parent_id']);
|
|
$children[] = $row;
|
|
$subChildren = getParents($parent['code']);
|
|
$children = array_merge($children, $subChildren);
|
|
}
|
|
|
|
return $children;
|
|
}
|
|
|
|
/**
|
|
* @param string $categoryCode
|
|
* @return null|string
|
|
*/
|
|
function getParentsToString($categoryCode)
|
|
{
|
|
$parents = getParents($categoryCode);
|
|
|
|
if (!empty($parents)) {
|
|
$parents = array_reverse($parents);
|
|
$categories = array();
|
|
foreach ($parents as $category) {
|
|
$categories[] = $category['code'];
|
|
}
|
|
$categoriesInString = implode(' > ', $categories).' > ';
|
|
|
|
return $categoriesInString;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* @param string $categorySource
|
|
*
|
|
* @return string
|
|
*/
|
|
function listCategories($categorySource)
|
|
{
|
|
$categorySource = isset($categorySource) ? $categorySource : null;
|
|
$categories = getCategories($categorySource);
|
|
|
|
if (count($categories) > 0) {
|
|
$table = new HTML_Table(array('class' => 'data_table'));
|
|
$column = 0;
|
|
$row = 0;
|
|
$headers = array(
|
|
get_lang('Category'), get_lang('CategoriesNumber'), get_lang('Courses'), get_lang('Actions')
|
|
);
|
|
foreach ($headers as $header) {
|
|
$table->setHeaderContents($row, $column, $header);
|
|
$column++;
|
|
}
|
|
$row++;
|
|
$mainUrl = api_get_path(WEB_CODE_PATH).'admin/course_category.php?category='.$categorySource;
|
|
|
|
$editIcon = Display::return_icon('edit.png', get_lang('EditNode'), null, ICON_SIZE_SMALL);
|
|
$deleteIcon = Display::return_icon('delete.png', get_lang('DeleteNode'), null, ICON_SIZE_SMALL);
|
|
$moveIcon = Display::return_icon('up.png', get_lang('UpInSameLevel'), null, ICON_SIZE_SMALL);
|
|
|
|
foreach ($categories as $category) {
|
|
|
|
$editUrl = $mainUrl.'&id='.$category['code'].'&action=edit';
|
|
$moveUrl = $mainUrl.'&id='.$category['code'].'&action=moveUp&tree_pos='.$category['tree_pos'];
|
|
$deleteUrl = $mainUrl.'&id='.$category['code'].'&action=delete';
|
|
|
|
$actions = Display::url($editIcon, $editUrl).Display::url($moveIcon, $moveUrl).Display::url($deleteIcon, $deleteUrl);
|
|
$url = api_get_path(WEB_CODE_PATH).'admin/course_category.php?category='.$category['code'];
|
|
$title = Display::url(
|
|
Display::return_icon('folder_document.gif', get_lang('OpenNode'), null, ICON_SIZE_SMALL).' '.$category['name'],
|
|
$url
|
|
);
|
|
$content = array(
|
|
$title,
|
|
$category['children_count'],
|
|
$category['nbr_courses'],
|
|
$actions
|
|
);
|
|
$column = 0;
|
|
foreach ($content as $value) {
|
|
$table->setCellContents($row, $column, $value);
|
|
$column++;
|
|
}
|
|
$row++;
|
|
}
|
|
|
|
return $table->toHtml();
|
|
} else {
|
|
return Display::return_message(get_lang("NoCategories"), 'warning');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
function getCategoriesToDisplayInHomePage()
|
|
{
|
|
$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
$sql = "SELECT name FROM $tbl_category
|
|
WHERE parent_id IS NULL
|
|
ORDER BY tree_pos";
|
|
|
|
return Database::store_result(Database::query($sql));
|
|
}
|
|
|
|
/**
|
|
* @param int $id
|
|
*
|
|
* @return bool
|
|
*/
|
|
function addToUrl($id)
|
|
{
|
|
if (!isMultipleUrlSupport()) {
|
|
return false;
|
|
}
|
|
UrlManager::addCourseCategoryListToUrl(array($id), array(api_get_current_access_url_id()));
|
|
}
|
|
|
|
/**
|
|
* @param string $categoryCode
|
|
*
|
|
* @return array
|
|
*/
|
|
function getCategoriesCanBeAddedInCourse($categoryCode)
|
|
{
|
|
$conditions = null;
|
|
$whereCondition = null;
|
|
if (isMultipleUrlSupport()) {
|
|
$table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE_CATEGORY);
|
|
$conditions = " INNER JOIN $table a ON (c.id = a.course_category_id)";
|
|
$whereCondition = " AND a.access_url_id = ".api_get_current_access_url_id();
|
|
}
|
|
|
|
$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
$sql = "SELECT code, name
|
|
FROM $tbl_category c
|
|
$conditions
|
|
WHERE (auth_course_child = 'TRUE' OR code = '".Database::escape_string($categoryCode)."')
|
|
$whereCondition
|
|
ORDER BY tree_pos";
|
|
$res = Database::query($sql);
|
|
|
|
$categories[''] = '-';
|
|
while ($cat = Database::fetch_array($res)) {
|
|
$categories[$cat['code']] = '('.$cat['code'].') '.$cat['name'];
|
|
ksort($categories);
|
|
}
|
|
return $categories;
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
function browseCourseCategories()
|
|
{
|
|
$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
$conditions = null;
|
|
$whereCondition = null;
|
|
|
|
if (isMultipleUrlSupport()) {
|
|
$table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE_CATEGORY);
|
|
$conditions = " INNER JOIN $table a ON (c.id = a.course_category_id)";
|
|
$whereCondition = " WHERE a.access_url_id = ".api_get_current_access_url_id();
|
|
}
|
|
$sql = "SELECT c.* FROM $tbl_category c
|
|
$conditions
|
|
$whereCondition
|
|
ORDER BY tree_pos ASC";
|
|
$result = Database::query($sql);
|
|
$url_access_id = 1;
|
|
if (api_is_multiple_url_enabled()) {
|
|
$url_access_id = api_get_current_access_url_id();
|
|
}
|
|
$countCourses = CourseManager :: countAvailableCourses($url_access_id);
|
|
|
|
$categories = array();
|
|
$categories[0][0] = array(
|
|
'id' => 0,
|
|
'name' => get_lang('DisplayAll'),
|
|
'code' => 'ALL',
|
|
'parent_id' => null,
|
|
'tree_pos' => 0,
|
|
'count_courses' => $countCourses
|
|
|
|
);
|
|
while ($row = Database::fetch_array($result)) {
|
|
$count_courses = countCoursesInCategory($row['code']);
|
|
$row['count_courses'] = $count_courses;
|
|
if (!isset($row['parent_id'])) {
|
|
$categories[0][$row['tree_pos']] = $row;
|
|
} else {
|
|
$categories[$row['parent_id']][$row['tree_pos']] = $row;
|
|
}
|
|
}
|
|
|
|
$count_courses = countCoursesInCategory();
|
|
|
|
$categories[0][count($categories[0])+1] = array(
|
|
'id' =>0,
|
|
'name' => get_lang('None'),
|
|
'code' => 'NONE',
|
|
'parent_id' => null,
|
|
'tree_pos' => $row['tree_pos']+1,
|
|
'children_count' => 0,
|
|
'auth_course_child' => true,
|
|
'auth_cat_child' => true,
|
|
'count_courses' => $count_courses
|
|
);
|
|
|
|
return $categories;
|
|
}
|
|
|
|
/**
|
|
* @param string $category_code
|
|
* @param string $searchTerm
|
|
* @return int
|
|
*/
|
|
function countCoursesInCategory($category_code="", $searchTerm = '')
|
|
{
|
|
$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
|
|
$categoryCode = Database::escape_string($category_code);
|
|
$searchTerm = Database::escape_string($searchTerm);
|
|
$categoryFilter = '';
|
|
$searchFilter = '';
|
|
|
|
$specialCourseList = CourseManager::get_special_course_list();
|
|
|
|
$without_special_courses = '';
|
|
if (!empty($specialCourseList)) {
|
|
$without_special_courses = ' AND course.code NOT IN (' . implode(',', $specialCourseList) . ')';
|
|
}
|
|
|
|
$visibilityCondition = null;
|
|
$hidePrivate = api_get_setting('course_catalog_hide_private');
|
|
if ($hidePrivate === 'true') {
|
|
$courseInfo = api_get_course_info();
|
|
$courseVisibility = $courseInfo['visibility'];
|
|
$visibilityCondition = ' AND course.visibility <> 1';
|
|
}
|
|
|
|
if ($categoryCode == 'ALL') {
|
|
// Nothing to do
|
|
} elseif ($categoryCode == 'NONE') {
|
|
$categoryFilter = ' AND category_code = "" ';
|
|
} else {
|
|
$categoryFilter = ' AND category_code = "' . $categoryCode . '" ';
|
|
}
|
|
|
|
if (!empty($searchTerm)) {
|
|
$searchFilter = ' AND (code LIKE "%' . $searchTerm . '%"
|
|
OR title LIKE "%' . $searchTerm . '%"
|
|
OR tutor_name LIKE "%' . $searchTerm . '%") ';
|
|
}
|
|
|
|
$sql = "SELECT * FROM $tbl_course
|
|
WHERE
|
|
visibility != '0' AND
|
|
visibility != '4'
|
|
$categoryFilter
|
|
$searchFilter
|
|
$without_special_courses
|
|
$visibilityCondition
|
|
";
|
|
// Showing only the courses of the current portal access_url_id.
|
|
|
|
if (api_is_multiple_url_enabled()) {
|
|
$url_access_id = api_get_current_access_url_id();
|
|
if ($url_access_id != -1) {
|
|
$tbl_url_rel_course = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
|
|
$sql = "SELECT * FROM $tbl_course as course
|
|
INNER JOIN $tbl_url_rel_course as url_rel_course
|
|
ON (url_rel_course.c_id = course.id)
|
|
WHERE
|
|
access_url_id = $url_access_id AND
|
|
course.visibility != '0' AND
|
|
course.visibility != '4' AND
|
|
category_code = '$category_code'
|
|
$searchTerm
|
|
$without_special_courses
|
|
$visibilityCondition
|
|
";
|
|
}
|
|
}
|
|
|
|
return Database::num_rows(Database::query($sql));
|
|
}
|
|
|
|
/**
|
|
* @param string $category_code
|
|
* @param int $random_value
|
|
* @param array $limit will be used if $random_value is not set.
|
|
* This array should contains 'start' and 'length' keys
|
|
* @return array
|
|
*/
|
|
function browseCoursesInCategory($category_code, $random_value = null, $limit = array())
|
|
{
|
|
$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
|
|
|
|
$specialCourseList = CourseManager::get_special_course_list();
|
|
|
|
$without_special_courses = '';
|
|
if (!empty($specialCourseList)) {
|
|
$without_special_courses = ' AND course.code NOT IN (' . implode(',', $specialCourseList) . ')';
|
|
}
|
|
$visibilityCondition = null;
|
|
$hidePrivate = api_get_setting('course_catalog_hide_private');
|
|
if ($hidePrivate === 'true') {
|
|
$courseInfo = api_get_course_info();
|
|
$courseVisibility = $courseInfo['visibility'];
|
|
$visibilityCondition = ' AND course.visibility <> 1';
|
|
}
|
|
if (!empty($random_value)) {
|
|
$random_value = intval($random_value);
|
|
|
|
$sql = "SELECT COUNT(*) FROM $tbl_course";
|
|
$result = Database::query($sql);
|
|
list($num_records) = Database::fetch_row($result);
|
|
|
|
if (api_is_multiple_url_enabled()) {
|
|
|
|
$url_access_id = api_get_current_access_url_id();
|
|
$tbl_url_rel_course = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
|
|
|
|
$sql = "SELECT COUNT(*) 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 = $url_access_id ";
|
|
$result = Database::query($sql);
|
|
list($num_records) = Database::fetch_row($result);
|
|
|
|
$sql = "SELECT course.id 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 = $url_access_id AND
|
|
RAND()*$num_records< $random_value
|
|
$without_special_courses $visibilityCondition
|
|
ORDER BY RAND()
|
|
LIMIT 0, $random_value";
|
|
} else {
|
|
$sql = "SELECT id FROM $tbl_course course
|
|
WHERE RAND()*$num_records< $random_value $without_special_courses $visibilityCondition
|
|
ORDER BY RAND()
|
|
LIMIT 0, $random_value";
|
|
}
|
|
|
|
$result = Database::query($sql);
|
|
$id_in = null;
|
|
while (list($id) = Database::fetch_row($result)) {
|
|
if ($id_in) {
|
|
$id_in.=",$id";
|
|
} else {
|
|
$id_in = "$id";
|
|
}
|
|
}
|
|
if ($id_in === null) {
|
|
return array();
|
|
}
|
|
$sql = "SELECT * FROM $tbl_course WHERE id IN($id_in)";
|
|
} else {
|
|
$limitFilter = getLimitFilterFromArray($limit);
|
|
$category_code = Database::escape_string($category_code);
|
|
if (empty($category_code) || $category_code == "ALL") {
|
|
$sql = "SELECT * FROM $tbl_course
|
|
WHERE
|
|
1=1
|
|
$without_special_courses
|
|
$visibilityCondition
|
|
ORDER BY title $limitFilter ";
|
|
} else {
|
|
if ($category_code == 'NONE') {
|
|
$category_code = '';
|
|
}
|
|
$sql = "SELECT * FROM $tbl_course
|
|
WHERE
|
|
category_code='$category_code'
|
|
$without_special_courses
|
|
$visibilityCondition
|
|
ORDER BY title $limitFilter ";
|
|
}
|
|
|
|
//showing only the courses of the current Chamilo access_url_id
|
|
if (api_is_multiple_url_enabled()) {
|
|
$url_access_id = api_get_current_access_url_id();
|
|
$tbl_url_rel_course = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
|
|
if ($category_code != "ALL") {
|
|
$sql = "SELECT * FROM $tbl_course as course
|
|
INNER JOIN $tbl_url_rel_course as url_rel_course
|
|
ON (url_rel_course.c_id = course.id)
|
|
WHERE
|
|
access_url_id = $url_access_id AND
|
|
category_code='$category_code'
|
|
$without_special_courses
|
|
$visibilityCondition
|
|
ORDER BY title $limitFilter";
|
|
} else {
|
|
$sql = "SELECT * FROM $tbl_course as course
|
|
INNER JOIN $tbl_url_rel_course as url_rel_course
|
|
ON (url_rel_course.c_id = course.id)
|
|
WHERE
|
|
access_url_id = $url_access_id
|
|
$without_special_courses
|
|
$visibilityCondition
|
|
ORDER BY title $limitFilter";
|
|
}
|
|
}
|
|
}
|
|
|
|
$result = Database::query($sql);
|
|
$courses = array();
|
|
while ($row = Database::fetch_array($result)) {
|
|
$row['registration_code'] = !empty($row['registration_code']);
|
|
$count_users = CourseManager::get_users_count_in_course($row['code']);
|
|
$count_connections_last_month = Tracking::get_course_connections_count(
|
|
$row['id'],
|
|
0,
|
|
api_get_utc_datetime(time() - (30 * 86400))
|
|
);
|
|
|
|
if ($row['tutor_name'] == '0') {
|
|
$row['tutor_name'] = get_lang('NoManager');
|
|
}
|
|
$point_info = CourseManager::get_course_ranking($row['id'], 0);
|
|
$courses[] = array(
|
|
'real_id' => $row['id'],
|
|
'point_info' => $point_info,
|
|
'code' => $row['code'],
|
|
'directory' => $row['directory'],
|
|
'visual_code' => $row['visual_code'],
|
|
'title' => $row['title'],
|
|
'tutor' => $row['tutor_name'],
|
|
'subscribe' => $row['subscribe'],
|
|
'unsubscribe' => $row['unsubscribe'],
|
|
'registration_code' => $row['registration_code'],
|
|
'creation_date' => $row['creation_date'],
|
|
'visibility' => $row['visibility'],
|
|
'count_users' => $count_users,
|
|
'count_connections' => $count_connections_last_month
|
|
);
|
|
}
|
|
|
|
return $courses;
|
|
}
|
|
|
|
/**
|
|
* create recursively all categories as option of the select passed in parameter.
|
|
*
|
|
* @param HTML_QuickForm_Element $element
|
|
* @param string $defaultCode the option value to select by default (used mainly for edition of courses)
|
|
* @param string $parentCode the parent category of the categories added (default=null for root category)
|
|
* @param string $padding the indent param (you shouldn't indicate something here)
|
|
*/
|
|
function setCategoriesInForm($element, $defaultCode = null, $parentCode = null, $padding = null)
|
|
{
|
|
$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
$conditions = null;
|
|
$whereCondition = null;
|
|
if (isMultipleUrlSupport()) {
|
|
$table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE_CATEGORY);
|
|
$conditions = " INNER JOIN $table a ON (c.id = a.course_category_id)";
|
|
$whereCondition = " AND a.access_url_id = ".api_get_current_access_url_id();
|
|
}
|
|
|
|
$sql = "SELECT code, name, auth_course_child, auth_cat_child
|
|
FROM ".$tbl_category." c
|
|
$conditions
|
|
WHERE parent_id ".(empty($parentCode) ? "IS NULL" : "='".Database::escape_string($parentCode)."'")."
|
|
$whereCondition
|
|
ORDER BY name, code";
|
|
$res = Database::query($sql);
|
|
|
|
while ($cat = Database::fetch_array($res, 'ASSOC')) {
|
|
$params = $cat['auth_course_child'] == 'TRUE' ? '' : 'disabled';
|
|
$params .= ($cat['code'] == $defaultCode) ? ' selected' : '';
|
|
$option = $padding.' '.$cat['name'].' ('.$cat['code'].')';
|
|
|
|
$element->addOption($option, $cat['code'], $params);
|
|
if ($cat['auth_cat_child'] == 'TRUE') {
|
|
setCategoriesInForm($element, $defaultCode, $cat['code'], $padding.' - ');
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param array $list
|
|
* @return array
|
|
*/
|
|
function getCourseCategoryNotInList($list)
|
|
{
|
|
$table = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
if (empty($list)) {
|
|
return array();
|
|
}
|
|
|
|
$list = array_map('intval', $list);
|
|
$listToString = implode("','", $list);
|
|
|
|
$sql = "SELECT * FROM $table
|
|
WHERE id NOT IN ('$listToString') AND (parent_id IS NULL) ";
|
|
$result = Database::query($sql);
|
|
|
|
return Database::store_result($result, 'ASSOC');
|
|
}
|
|
|
|
/**
|
|
* @param string $keyword
|
|
* @return array|null
|
|
*/
|
|
function searchCategoryByKeyword($keyword)
|
|
{
|
|
if (empty($keyword)) {
|
|
return null;
|
|
}
|
|
|
|
$tableCategory = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
$conditions = null;
|
|
$whereCondition = null;
|
|
if (isMultipleUrlSupport()) {
|
|
$table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE_CATEGORY);
|
|
$conditions = " INNER JOIN $table a ON (c.id = a.course_category_id)";
|
|
$whereCondition = " AND a.access_url_id = ".api_get_current_access_url_id();
|
|
}
|
|
|
|
$keyword = Database::escape_string($keyword);
|
|
|
|
$sql = "SELECT c.*, c.name as text
|
|
FROM $tableCategory c $conditions
|
|
WHERE
|
|
(
|
|
c.code LIKE '%$keyword%' OR name LIKE '%$keyword%'
|
|
) AND
|
|
auth_course_child = 'TRUE'
|
|
$whereCondition ";
|
|
$result = Database::query($sql);
|
|
return Database::store_result($result, 'ASSOC');
|
|
}
|
|
|
|
/**
|
|
* @param array $list
|
|
* @return array
|
|
*/
|
|
function searchCategoryById($list)
|
|
{
|
|
if (empty($list)) {
|
|
return array();
|
|
} else {
|
|
$list = array_map('intval', $list);
|
|
$list = implode("','", $list);
|
|
}
|
|
|
|
$tableCategory = Database::get_main_table(TABLE_MAIN_CATEGORY);
|
|
$conditions = null;
|
|
$whereCondition = null;
|
|
if (isMultipleUrlSupport()) {
|
|
$table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE_CATEGORY);
|
|
$conditions = " INNER JOIN $table a ON (c.id = a.course_category_id)";
|
|
$whereCondition = " AND a.access_url_id = ".api_get_current_access_url_id();
|
|
}
|
|
|
|
$sql = "SELECT c.*, c.name as text FROM $tableCategory c $conditions
|
|
WHERE c.id IN $list $whereCondition";
|
|
$result = Database::query($sql);
|
|
return Database::store_result($result, 'ASSOC');
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
function getLimitArray()
|
|
{
|
|
$pageCurrent = isset($_REQUEST['pageCurrent']) ?
|
|
intval($_GET['pageCurrent']) :
|
|
1;
|
|
$pageLength = isset($_REQUEST['pageLength']) ?
|
|
intval($_GET['pageLength']) :
|
|
10;
|
|
return array(
|
|
'start' => ($pageCurrent - 1) * $pageLength,
|
|
'current' => $pageCurrent,
|
|
'length' => $pageLength,
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Return LIMIT to filter SQL query
|
|
* @param array $limit
|
|
* @return string
|
|
*/
|
|
function getLimitFilterFromArray($limit)
|
|
{
|
|
$limitFilter = '';
|
|
if (!empty($limit) && is_array($limit)) {
|
|
$limitStart = isset($limit['start']) ? $limit['start'] : 0;
|
|
$limitLength = isset($limit['length']) ? $limit['length'] : 10;
|
|
$limitFilter = 'LIMIT ' . $limitStart . ', ' . $limitLength;
|
|
}
|
|
|
|
return $limitFilter;
|
|
}
|
|
|
|
/**
|
|
* Get Pagination HTML div
|
|
* @param $pageCurrent
|
|
* @param $pageLength
|
|
* @param $pageTotal
|
|
* @return string
|
|
*/
|
|
function getCataloguePagination($pageCurrent, $pageLength, $pageTotal)
|
|
{
|
|
// Start empty html
|
|
$pageDiv = '';
|
|
$html='';
|
|
$pageBottom = max(1, $pageCurrent - 3);
|
|
$pageTop = min($pageTotal, $pageCurrent + 3);
|
|
|
|
if ($pageBottom > 1) {
|
|
$pageDiv .= getPageNumberItem(1, $pageLength);
|
|
if ($pageBottom > 2) {
|
|
$pageDiv .= getPageNumberItem($pageBottom - 1, $pageLength, null, '...');
|
|
}
|
|
} else {
|
|
// Nothing to do
|
|
}
|
|
|
|
// For each page add its page button to html
|
|
for (
|
|
$i = $pageBottom;
|
|
$i <= $pageTop;
|
|
$i++
|
|
) {
|
|
if ($i === $pageCurrent) {
|
|
$pageItemAttributes = array('class' => 'active');
|
|
} else {
|
|
$pageItemAttributes = array();
|
|
}
|
|
$pageDiv .= getPageNumberItem($i, $pageLength, $pageItemAttributes);
|
|
|
|
}
|
|
// Check if current page is the last page
|
|
|
|
if ($pageTop < $pageTotal) {
|
|
if ($pageTop < ($pageTotal - 1)) {
|
|
$pageDiv .= getPageNumberItem($pageTop + 1, $pageLength, null, '...');
|
|
}
|
|
$pageDiv .= getPageNumberItem($pageTotal, $pageLength);
|
|
}
|
|
|
|
// Complete pagination html
|
|
$pageDiv = Display::tag('ul', $pageDiv, array('class' => 'pagination'));
|
|
|
|
|
|
$html .= '<nav>'.$pageDiv.'</nav>';
|
|
return $html;
|
|
}
|
|
|
|
/**
|
|
* Return URL to course catalog
|
|
* @param int $pageCurrent
|
|
* @param int $pageLength
|
|
* @param string $categoryCode
|
|
* @param int $hiddenLinks
|
|
* @param string $action
|
|
* @return string
|
|
*/
|
|
function getCourseCategoryUrl(
|
|
$pageCurrent,
|
|
$pageLength,
|
|
$categoryCode = null,
|
|
$hiddenLinks = null,
|
|
$action = null
|
|
) {
|
|
$requestAction = isset($_REQUEST['action']) ? Security::remove_XSS($_REQUEST['action']) : null;
|
|
$action = isset($action) ? Security::remove_XSS($action) : $requestAction;
|
|
$searchTerm = isset($_REQUEST['search_term']) ? Security::remove_XSS($_REQUEST['search_term']) : null;
|
|
|
|
$categoryCodeRequest = isset($_REQUEST['category_code']) ? Security::remove_XSS($_REQUEST['category_code']) : null;
|
|
$categoryCode = isset($categoryCode) ? Security::remove_XSS($categoryCode) : $categoryCodeRequest;
|
|
|
|
$hiddenLinksRequest = isset($_REQUEST['hidden_links']) ? Security::remove_XSS($_REQUEST['hidden_links']) : null;
|
|
$hiddenLinks = isset($hiddenLinks) ? Security::remove_XSS($hiddenLinksRequest) : $categoryCodeRequest;
|
|
|
|
// Start URL with params
|
|
$pageUrl = api_get_self() .
|
|
'?action=' . $action .
|
|
'&category_code=' .$categoryCode.
|
|
'&hidden_links=' .$hiddenLinks.
|
|
'&pageCurrent=' . $pageCurrent .
|
|
'&pageLength=' . $pageLength
|
|
;
|
|
|
|
switch ($action) {
|
|
case 'subscribe' :
|
|
// for search
|
|
$pageUrl .=
|
|
'&search_term=' . $searchTerm .
|
|
'&search_course=1' .
|
|
'&sec_token=' . $_SESSION['sec_token'];
|
|
break;
|
|
case 'display_courses' :
|
|
// No break
|
|
default :
|
|
break;
|
|
|
|
}
|
|
|
|
return $pageUrl;
|
|
}
|
|
|
|
/**
|
|
* Get li HTML of page number
|
|
* @param $pageNumber
|
|
* @param $pageLength
|
|
* @param array $liAttributes
|
|
* @param string $content
|
|
* @return string
|
|
*/
|
|
function getPageNumberItem($pageNumber, $pageLength, $liAttributes = array(), $content = '')
|
|
{
|
|
// Get page URL
|
|
$url = getCourseCategoryUrl(
|
|
$pageNumber,
|
|
$pageLength
|
|
);
|
|
|
|
// If is current page ('active' class) clear URL
|
|
if (isset($liAttributes) && is_array($liAttributes) && isset($liAttributes['class'])) {
|
|
if (strpos('active', $liAttributes['class']) !== false) {
|
|
$url = '';
|
|
}
|
|
}
|
|
|
|
$content = !empty($content) ? $content : $pageNumber;
|
|
|
|
return Display::tag(
|
|
'li',
|
|
Display::url(
|
|
$content,
|
|
$url
|
|
),
|
|
$liAttributes
|
|
);
|
|
}
|
|
/**
|
|
* Return the name tool by action
|
|
* @param string $action
|
|
* @return string
|
|
*/
|
|
function getCourseCatalogNameTools($action)
|
|
{
|
|
$nameTools = get_lang('SortMyCourses');
|
|
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' :
|
|
// No break
|
|
case 'display_courses' :
|
|
$nameTools = get_lang('CourseManagement');
|
|
break;
|
|
case 'display_sessions' :
|
|
$nameTools = get_lang('Sessions');
|
|
break;
|
|
default :
|
|
// Nothing to do
|
|
break;
|
|
}
|
|
|
|
return $nameTools;
|
|
}
|
|
|
|
/**
|
|
CREATE TABLE IF NOT EXISTS access_url_rel_course_category (access_url_id int unsigned NOT NULL, course_category_id int unsigned NOT NULL, PRIMARY KEY (access_url_id, course_category_id));
|
|
*/
|
|
|