From 1f162d6fba9f960ec59e86fd4075fa06e746768f Mon Sep 17 00:00:00 2001 From: Julio Montoya <gugli100@gmail.com> Date: Fri, 25 Oct 2013 18:02:57 +0200 Subject: [PATCH] Adding support for multiple URL for course categories see BT#6195 --- main/admin/configure_homepage.php | 14 ++-- main/admin/course_category.php | 2 - main/course_info/infocours.php | 1 + main/inc/lib/course_category.lib.php | 72 ++++++++++++++++--- main/inc/lib/database.constants.inc.php | 2 +- main/inc/lib/urlmanager.lib.php | 91 +++++++++++++++++++++---- 6 files changed, 150 insertions(+), 32 deletions(-) diff --git a/main/admin/configure_homepage.php b/main/admin/configure_homepage.php index 324deadfd3..2a39a437ad 100644 --- a/main/admin/configure_homepage.php +++ b/main/admin/configure_homepage.php @@ -19,11 +19,11 @@ api_protect_admin_script(); require_once api_get_path(LIBRARY_PATH).'WCAG/WCAG_rendering.php'; require_once api_get_path(LIBRARY_PATH).'fileUpload.lib.php'; +require_once api_get_path(LIBRARY_PATH).'course_category.lib.php'; global $_configuration; $action = isset($_GET['action']) ? Security::remove_XSS($_GET['action']) : null; -$tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY); $tool_name = get_lang('ConfigureHomePage'); $_languages = api_get_languages(); @@ -198,7 +198,7 @@ if (!empty($action)) { $fp = fopen($homep.$topf.'_'.$lang_name.$ext, 'w'); fputs($fp, $home_top); fclose($fp); - + } } } @@ -234,7 +234,7 @@ if (!empty($action)) { } } } - + } else { fputs($fp, ''); if ($_POST['all_langs']) { @@ -460,9 +460,9 @@ if (!empty($action)) { $fp = fopen($homep.$menuf.'_'.$lang_name.$ext, 'w'); fputs($fp, $home_menu); fclose($fp); - + } - } + } } } } @@ -687,7 +687,7 @@ if (!empty($action)) { }// end of "else" in if($_POST['formSent']) condition } else { //if $action is empty, then prepare a list of the course categories to display (?) - $Categories = Database::store_result(Database::query("SELECT name FROM $tbl_category WHERE parent_id IS NULL ORDER BY tree_pos")); + $Categories = getCategoriesToDisplayInHomePage(); } // Display section @@ -896,7 +896,7 @@ switch ($action) { </tr> <tr> <?php - + $access_url_id = 1; // we only show the category options for the main chamilo installation if (api_is_multiple_url_enabled()) { diff --git a/main/admin/course_category.php b/main/admin/course_category.php index cb240134bd..2ca8388064 100644 --- a/main/admin/course_category.php +++ b/main/admin/course_category.php @@ -2,7 +2,6 @@ /* For licensing terms, see /license.txt */ /** * @package chamilo.admin - * @todo use formvalidator for the form */ /** * Code @@ -123,7 +122,6 @@ if ($action == 'add' || $action == 'edit') { echo Display::page_subheader($parentInfo['name']); } echo listCategories($category); - } Display::display_footer(); diff --git a/main/course_info/infocours.php b/main/course_info/infocours.php index bc37f70501..868b0726cf 100644 --- a/main/course_info/infocours.php +++ b/main/course_info/infocours.php @@ -66,6 +66,7 @@ $tbl_course_user = Database :: get_main_table(TABLE_MAIN_COURSE_USER); $tbl_course = Database :: get_main_table(TABLE_MAIN_COURSE); // Get all course categories + $sql = "SELECT code,name FROM ".$table_course_category." WHERE auth_course_child ='TRUE' OR code = '".Database::escape_string($_course['categoryCode'])."' ORDER BY tree_pos"; diff --git a/main/inc/lib/course_category.lib.php b/main/inc/lib/course_category.lib.php index 1978f05f6a..0bad3c6d1e 100644 --- a/main/inc/lib/course_category.lib.php +++ b/main/inc/lib/course_category.lib.php @@ -13,6 +13,10 @@ function isMultipleUrlSupport() return false; } +/** + * @param string $category + * @return array + */ function getCategory($category) { global $tbl_category; @@ -26,17 +30,33 @@ function getCategory($category) } /** - * @param $category + * @param string $category * @return array */ function getCategories($category) { global $tbl_category, $tbl_course; $category = Database::escape_string($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 LEFT JOIN $tbl_category t2 ON t1.code=t2.parent_id LEFT JOIN $tbl_course t3 ON t3.category_code=t1.code - WHERE t1.parent_id " . (empty($category) ? "IS NULL" : "='$category'") . " - GROUP BY t1.name,t1.code,t1.parent_id,t1.tree_pos,t1.children_count ORDER BY t1.tree_pos"; + $conditions = null; + 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)"; + } + $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 + t1.parent_id " . (empty($category) ? "IS NULL" : "='$category'") . " + GROUP BY t1.name,t1.code,t1.parent_id,t1.tree_pos,t1.children_count + ORDER BY t1.tree_pos"; $result = Database::query($sql); return Database::store_result($result); } @@ -66,6 +86,13 @@ function deleteNode($node) } } +/** + * @param string $code + * @param string $name + * @param string $canHaveCourses + * @param int $parent_id + * @return bool + */ function addNode($code, $name, $canHaveCourses, $parent_id) { global $tbl_category; @@ -86,8 +113,14 @@ function addNode($code, $name, $canHaveCourses, $parent_id) $sql = "INSERT INTO $tbl_category(name,code,parent_id,tree_pos,children_count,auth_course_child) VALUES('$name','$code'," . (empty($parent_id) ? "NULL" : "'$parent_id'") . ",'$tree_pos','0','$canHaveCourses')"; Database::query($sql); + $categoryId = Database::insert_id(); + updateFils($parent_id); - return true; + + if (isMultipleUrlSupport()) { + addToUrl($categoryId); + } + return $categoryId; } function editNode($code, $name, $canHaveCourses, $old_code) @@ -190,10 +223,10 @@ function listCategories($categorySource) foreach ($categories as $category) { $editUrl = $mainUrl.'&id='.$category['code'].'&action=edit'; - $deleteUrl = $mainUrl.'&id='.$category['code'].'&action=delete'; $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($deleteIcon, $deleteUrl).Display::url($moveIcon, $moveUrl); + $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'], @@ -203,7 +236,6 @@ function listCategories($categorySource) $title, $category['children_count'], $category['nbr_courses'], - $actions ); $column = 0; @@ -218,3 +250,25 @@ function listCategories($categorySource) return Display::return_message(get_lang("NoCategories"), 'warning'); } } + +function getCategoriesToDisplayInHomePage() +{ + global $tbl_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())); +} +/** + * 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)); + */ \ No newline at end of file diff --git a/main/inc/lib/database.constants.inc.php b/main/inc/lib/database.constants.inc.php index 18daac53ae..2093bcaf62 100644 --- a/main/inc/lib/database.constants.inc.php +++ b/main/inc/lib/database.constants.inc.php @@ -83,6 +83,7 @@ define('TABLE_MAIN_ACCESS_URL_REL_USER', 'access_url_rel_user'); define('TABLE_MAIN_ACCESS_URL_REL_COURSE', 'access_url_rel_course'); define('TABLE_MAIN_ACCESS_URL_REL_SESSION', 'access_url_rel_session'); define('TABLE_MAIN_ACCESS_URL_REL_USERGROUP', 'access_url_rel_usergroup'); +define('TABLE_MAIN_ACCESS_URL_REL_COURSE_CATEGORY', 'access_url_rel_course_category'); // Global calendar define('TABLE_MAIN_SYSTEM_CALENDAR', 'sys_calendar'); @@ -143,7 +144,6 @@ define('TABLE_STATISTIC_TRACK_C_REFERERS', 'track_c_referers'); define('TABLE_STATISTIC_TRACK_COURSE_RANKING', 'track_course_ranking'); define('TABLE_MAIN_USER_REL_COURSE_VOTE', 'user_rel_course_vote'); - // SCORM database tables this is used only during the migration from 1.6 to 1.8 see update-db-scorm-1.6.x-1.8.0.inc define('TABLE_SCORM_MAIN', 'scorm_main'); define('TABLE_SCORM_SCO_DATA', 'scorm_sco_data'); diff --git a/main/inc/lib/urlmanager.lib.php b/main/inc/lib/urlmanager.lib.php index c505af356e..170f8b807a 100644 --- a/main/inc/lib/urlmanager.lib.php +++ b/main/inc/lib/urlmanager.lib.php @@ -11,16 +11,16 @@ */ class UrlManager { - /** - * Creates a new url access - * - * @author Julio Montoya <gugli100@gmail.com>, - * - * @param string The URL of the site - * @param string The description of the site - * @param int is active or not - * @return boolean if success - */ + /** + * Creates a new url access + * + * @author Julio Montoya <gugli100@gmail.com>, + * + * @param string The URL of the site + * @param string The description of the site + * @param int is active or not + * @return boolean if success + */ public static function add($url, $description, $active) { $tms = time(); @@ -407,7 +407,7 @@ class UrlManager if (is_array($course_list) && is_array($url_list)){ foreach ($url_list as $url_id) { foreach ($course_list as $course_code) { - $count = UrlManager::relation_url_course_exist($course_code,$url_id); + $count = self::relation_url_course_exist($course_code,$url_id); if ($count==0) { $sql = "INSERT INTO $table_url_rel_course SET course_code = '".Database::escape_string($course_code)."', access_url_id = ".Database::escape_string($url_id); @@ -436,7 +436,7 @@ class UrlManager if (is_array($userGroupList) && is_array($urlList)) { foreach ($urlList as $urlId) { foreach ($userGroupList as $userGroupId) { - $count = UrlManager::relation_url_usergroup_exist($userGroupId, $urlId); + $count = self::relation_url_usergroup_exist($userGroupId, $urlId); if ($count == 0) { $result = self::addUserGroupToUrl($userGroupId, $urlId); if ($result) { @@ -452,6 +452,71 @@ class UrlManager return $resultArray; } + /** + * Add a group of user group into a group of URLs + * @author Julio Montoya + * @param array of course ids + * @param array of url_ids + * @return array + **/ + public static function addCourseCategoryListToUrl($courseCategoryList, $urlList) + { + $resultArray = array(); + if (is_array($courseCategoryList) && is_array($urlList)) { + foreach ($urlList as $urlId) { + foreach ($courseCategoryList as $categoryCourseId) { + $count = self::relationUrlCourseCategoryExist($categoryCourseId, $urlId); + if ($count == 0) { + $result = self::addCourseCategoryToUrl($categoryCourseId, $urlId); + if ($result) { + $resultArray[$urlId][$categoryCourseId] = 1; + } else { + $resultArray[$urlId][$categoryCourseId] = 0; + } + } + } + } + } + + return $resultArray; + } + + /** + * Checks the relationship between an URL and a UserGr + * oup (return the num_rows) + * @author Julio Montoya + * @param int $categoryCourseId + * @param int $urlId + * @return boolean true if success + * */ + public static function relationUrlCourseCategoryExist($categoryCourseId, $urlId) + { + $table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE_CATEGORY); + $sql= "SELECT course_category_id FROM $table + WHERE access_url_id = ".Database::escape_string($urlId)." AND + course_category_id = ".Database::escape_string($categoryCourseId); + $result = Database::query($sql); + $num = Database::num_rows($result); + return $num; + } + + /** + * @param int $categoryCourseId + * @param int $urlId + * @return int + */ + public static function addCourseCategoryToUrl($categoryCourseId, $urlId) + { + $table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE_CATEGORY); + $sql = "INSERT INTO $table + SET + course_category_id = '".intval($categoryCourseId)."', + access_url_id = ".intval($urlId); + Database::query($sql); + return Database::insert_id(); + } + + /** * @param int $userGroupId * @param int $urlId @@ -778,7 +843,7 @@ class UrlManager // Deleting old users foreach($existing_sessions as $existing_session) { - if(!in_array($existing_session, $session_list)) { + if (!in_array($existing_session, $session_list)) { if (!empty($existing_session) && !empty($access_url_id)) { UrlManager::delete_url_rel_session($existing_session,$access_url_id); }