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