course_category.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. <?php // $Id: course_category.php 9246 2006-09-25 13:24:53Z bmol $
  2. /*
  3. ==============================================================================
  4. Dokeos - elearning and course management software
  5. Copyright (c) 2004 Dokeos S.A.
  6. Copyright (c) 2003 Ghent University (UGent)
  7. Copyright (c) 2001 Universite catholique de Louvain (UCL)
  8. Copyright (c) Olivier Brouckaert
  9. For a full list of contributors, see "credits.txt".
  10. The full license can be read in "license.txt".
  11. This program is free software; you can redistribute it and/or
  12. modify it under the terms of the GNU General Public License
  13. as published by the Free Software Foundation; either version 2
  14. of the License, or (at your option) any later version.
  15. See the GNU General Public License for more details.
  16. Contact: Dokeos, 181 rue Royale, B-1000 Brussels, Belgium, info@dokeos.com
  17. ==============================================================================
  18. */
  19. /**
  20. ==============================================================================
  21. * @package dokeos.admin
  22. ==============================================================================
  23. */
  24. $langFile='admin';
  25. $cidReset=true;
  26. require('../inc/global.inc.php');
  27. $this_section=SECTION_PLATFORM_ADMIN;
  28. api_protect_admin_script();
  29. $category=$_GET['category'];
  30. $action=$_GET['action'];
  31. $tbl_course = Database::get_main_table(MAIN_COURSE_TABLE);
  32. $tbl_category = Database::get_main_table(MAIN_CATEGORY_TABLE);
  33. $errorMsg='';
  34. if(!empty($action))
  35. {
  36. if($action == 'delete')
  37. {
  38. deleteNode($_GET['id']);
  39. header('Location: '.$_SERVER['PHP_SELF'].'?category='.$category);
  40. exit();
  41. }
  42. elseif(($action == 'add' || $action == 'edit') && $_POST['formSent'])
  43. {
  44. $_POST['categoryCode']=trim($_POST['categoryCode']);
  45. $_POST['categoryName']=trim($_POST['categoryName']);
  46. if(!empty($_POST['categoryCode']) && !empty($_POST['categoryName']))
  47. {
  48. if($action == 'add')
  49. {
  50. $ret=addNode($_POST['categoryCode'],$_POST['categoryName'],$_POST['canHaveCourses'],$category);
  51. }
  52. else
  53. {
  54. $ret=editNode($_POST['categoryCode'],$_POST['categoryName'],$_POST['canHaveCourses'],$_GET['id']);
  55. }
  56. if($ret)
  57. {
  58. $action='';
  59. }
  60. else
  61. {
  62. $errorMsg=get_lang('CatCodeAlreadyUsed');
  63. }
  64. }
  65. else
  66. {
  67. $errorMsg=get_lang('PleaseEnterCategoryInfo');
  68. }
  69. }
  70. elseif($action == 'edit')
  71. {
  72. $categoryCode=$_GET['id'];
  73. $result=api_sql_query("SELECT name,auth_course_child FROM $tbl_category WHERE code='$categoryCode'",__FILE__,__LINE__);
  74. list($categoryName,$canHaveCourses)=mysql_fetch_row($result);
  75. $canHaveCourses=($canHaveCourses == 'FALSE')?0:1;
  76. }
  77. elseif($action == 'moveUp')
  78. {
  79. moveNodeUp($_GET['id'],$_GET['tree_pos'],$category);
  80. header('Location: '.$_SERVER['PHP_SELF'].'?category='.$category);
  81. exit();
  82. }
  83. }
  84. $tool_name=get_lang('AdminCategories');
  85. //$interbreadcrumb[]=array("url" => "index.php","name" => get_lang('PlatformAdmin'));
  86. Display::display_header($tool_name);
  87. //api_display_tool_title($tool_name);
  88. if(empty($action))
  89. {
  90. $result=api_sql_query("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",__FILE__,__LINE__);
  91. $Categories=api_store_result($result);
  92. }
  93. if(!empty($category) && empty($action))
  94. {
  95. $result=api_sql_query("SELECT parent_id FROM $tbl_category WHERE code='$category'",__FILE__,__LINE__);
  96. list($parent_id)=mysql_fetch_row($result);
  97. ?>
  98. <a href="<?php echo $_SERVER['PHP_SELF']; ?>?category=<?php echo urlencode($parent_id); ?>">&lt;&lt; <?php echo get_lang("Back"); if(!empty($parent_id)) echo ' ('.$parent_id.')'; ?></a>
  99. <?php
  100. }
  101. if($action == 'add' || $action == 'edit')
  102. {
  103. ?>
  104. <a href="<?php echo $_SERVER['PHP_SELF']; ?>?category=<?php echo urlencode($category); ?>">&lt;&lt; <?php echo get_lang("Back"); if(!empty($category)) echo ' ('.$category.')'; ?></a>
  105. <h3><?php echo ($action == 'add')?get_lang('AddACategory'):get_lang('EditNode'); if(!empty($category)) echo ' '.get_lang('Into').' '.$category; ?></h3>
  106. <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>?action=<?php echo $action; ?>&category=<?php echo urlencode($category); ?>&amp;id=<?php echo urlencode(stripslashes($_GET['id'])); ?>">
  107. <input type="hidden" name="formSent" value="1" />
  108. <table border="0" cellpadding="5" cellspacing="0">
  109. <?php
  110. if(!empty($errorMsg))
  111. {
  112. ?>
  113. <tr>
  114. <td colspan="2">
  115. <?php
  116. Display::display_normal_message($errorMsg); //main API
  117. ?>
  118. </td>
  119. </tr>
  120. <?php
  121. }
  122. ?>
  123. <tr>
  124. <td nowrap="nowrap"><?php echo get_lang("CategoryCode"); ?> :</td>
  125. <td><input type="text" name="categoryCode" size="20" maxlength="20" value="<?php echo htmlentities(stripslashes($categoryCode)); ?>" /></td>
  126. </tr>
  127. <tr>
  128. <td nowrap="nowrap"><?php echo get_lang("CategoryName"); ?> :</td>
  129. <td><input type="text" name="categoryName" size="20" maxlength="100" value="<?php echo htmlentities(stripslashes($categoryName)); ?>" /></td>
  130. </tr>
  131. <tr>
  132. <td nowrap="nowrap"><?php echo get_lang("AllowCoursesInCategory"); ?></td>
  133. <td>
  134. <input class="checkbox" type="radio" name="canHaveCourses" value="0" <?php if(($action == 'edit' && !$canHaveCourses) || ($action == 'add' && $formSent && !$canHaveCourses)) echo 'checked="checked"'; ?> /><?php echo get_lang("No"); ?>
  135. <input class="checkbox" type="radio" name="canHaveCourses" value="1" <?php if(($action == 'edit' && $canHaveCourses) || ($action == 'add' && !$formSent || $canHaveCourses)) echo 'checked="checked"'; ?> /><?php echo get_lang("Yes"); ?>
  136. </td>
  137. </tr>
  138. <tr>
  139. <td>&nbsp;</td>
  140. <td><input type="submit" value="<?php echo get_lang("Ok"); ?>" /></td>
  141. </tr>
  142. </table>
  143. </form>
  144. <?php
  145. }
  146. else
  147. {
  148. ?>
  149. <ul>
  150. <?php
  151. if(sizeof($Categories))
  152. {
  153. foreach($Categories as $enreg)
  154. {
  155. ?>
  156. <li>
  157. <a href="<?php echo $_SERVER['PHP_SELF']; ?>?category=<?php echo urlencode($enreg['code']); ?>"><img src="../img/opendir.gif" border="0" title="<?php echo get_lang("OpenNode"); ?>" alt="" /></a>
  158. <a href="<?php echo $_SERVER['PHP_SELF']; ?>?category=<?php echo urlencode($category); ?>&amp;action=edit&amp;id=<?php echo urlencode($enreg['code']); ?>"><img src="../img/edit.gif" border="0" title="<?php echo get_lang("EditNode"); ?>" alt ="" /></a>
  159. <a href="<?php echo $_SERVER['PHP_SELF']; ?>?category=<?php echo urlencode($category); ?>&amp;action=delete&amp;id=<?php echo urlencode($enreg['code']); ?>" onclick="javascript:if(!confirm('<?php echo addslashes(htmlentities(get_lang('ConfirmYourChoice'))); ?>')) return false;"><img src="../img/delete.gif" border="0" title="<?php echo get_lang("DeleteNode"); ?>" alt="" /></a>
  160. <a href="<?php echo $_SERVER['PHP_SELF']; ?>?category=<?php echo urlencode($category); ?>&amp;action=moveUp&amp;id=<?php echo urlencode($enreg['code']); ?>&amp;tree_pos=<?php echo $enreg['tree_pos']; ?>"><img src="../img/up.gif" border="0" title="<?php echo get_lang("UpInSameLevel"); ?>" alt="" /></a>
  161. <?php echo $enreg['name']; ?>
  162. (<?php echo $enreg['children_count']; ?> <?php echo get_lang("Categories"); ?> - <?php echo $enreg['nbr_courses']; ?> <?php echo get_lang("Courses"); ?>)
  163. </li>
  164. <?php
  165. }
  166. unset($Categories);
  167. }
  168. else
  169. {
  170. echo get_lang("NoCategories");
  171. }
  172. ?>
  173. </ul>
  174. <a href="<?php echo $_SERVER['PHP_SELF']; ?>?category=<?php echo $category; ?>&amp;action=add"><?php echo get_lang("AddACategory"); if(!empty($category)) echo ' '.get_lang('Into').' '.$category; ?></a>
  175. <?php
  176. }
  177. /*
  178. ==============================================================================
  179. FOOTER
  180. ==============================================================================
  181. */
  182. Display::display_footer();
  183. /******** Functions ********/
  184. function deleteNode($node)
  185. {
  186. global $tbl_category, $tbl_course;
  187. $result=api_sql_query("SELECT parent_id,tree_pos FROM $tbl_category WHERE code='$node'",__FILE__,__LINE__);
  188. if($row=mysql_fetch_array($result))
  189. {
  190. if(!empty($row['parent_id']))
  191. {
  192. api_sql_query("UPDATE $tbl_course SET category_code='$row[parent_id]' WHERE category_code='$node'",__FILE__,__LINE__);
  193. api_sql_query("UPDATE $tbl_category SET parent_id='$row[parent_id]' WHERE parent_id='$node'",__FILE__,__LINE__);
  194. }
  195. else
  196. {
  197. api_sql_query("UPDATE $tbl_course SET category_code='' WHERE category_code='$node'",__FILE__,__LINE__);
  198. api_sql_query("UPDATE $tbl_category SET parent_id=NULL WHERE parent_id='$node'",__FILE__,__LINE__);
  199. }
  200. api_sql_query("UPDATE $tbl_category SET tree_pos=tree_pos-1 WHERE tree_pos > '$row[tree_pos]'",__FILE__,__LINE__);
  201. api_sql_query("DELETE FROM $tbl_category WHERE code='$node'",__FILE__,__LINE__);
  202. if(!empty($row['parent_id']))
  203. {
  204. updateFils($row['parent_id']);
  205. }
  206. }
  207. }
  208. function addNode($code,$name,$canHaveCourses,$parent_id)
  209. {
  210. global $tbl_category;
  211. $canHaveCourses=$canHaveCourses?'TRUE':'FALSE';
  212. $result=api_sql_query("SELECT 1 FROM $tbl_category WHERE code='$code'",__FILE__,__LINE__);
  213. if(mysql_num_rows($result))
  214. {
  215. return false;
  216. }
  217. $result=api_sql_query("SELECT MAX(tree_pos) AS maxTreePos FROM $tbl_category",__FILE__,__LINE__);
  218. $row=mysql_fetch_array($result);
  219. $tree_pos=$row['maxTreePos']+1;
  220. api_sql_query("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')",__FILE__,__LINE__);
  221. updateFils($parent_id);
  222. return true;
  223. }
  224. function editNode($code,$name,$canHaveCourses,$old_code)
  225. {
  226. global $tbl_category;
  227. $canHaveCourses=$canHaveCourses?'TRUE':'FALSE';
  228. if($code != $old_code)
  229. {
  230. $result=api_sql_query("SELECT 1 FROM $tbl_category WHERE code='$code'",__FILE__,__LINE__);
  231. if(mysql_num_rows($result))
  232. {
  233. return false;
  234. }
  235. }
  236. api_sql_query("UPDATE $tbl_category SET name='$name',code='$code',auth_course_child='$canHaveCourses' WHERE code='$old_code'",__FILE__,__LINE__);
  237. return true;
  238. }
  239. function moveNodeUp($code,$tree_pos,$parent_id)
  240. {
  241. global $tbl_category;
  242. $result=api_sql_query("SELECT code,tree_pos FROM $tbl_category WHERE parent_id ".(empty($parent_id)?"IS NULL":"='$parent_id'")." AND tree_pos<'$tree_pos' ORDER BY tree_pos DESC LIMIT 0,1",__FILE__,__LINE__);
  243. if(!$row=mysql_fetch_array($result))
  244. {
  245. $result=api_sql_query("SELECT code,tree_pos FROM $tbl_category WHERE parent_id ".(empty($parent_id)?"IS NULL":"='$parent_id'")." AND tree_pos>'$tree_pos' ORDER BY tree_pos DESC LIMIT 0,1",__FILE__,__LINE__);
  246. if(!$row=mysql_fetch_array($result))
  247. {
  248. return false;
  249. }
  250. }
  251. api_sql_query("UPDATE $tbl_category SET tree_pos='".$row['tree_pos']."' WHERE code='$code'",__FILE__,__LINE__);
  252. api_sql_query("UPDATE $tbl_category SET tree_pos='$tree_pos' WHERE code='$row[code]'",__FILE__,__LINE__);
  253. }
  254. function updateFils($category)
  255. {
  256. global $tbl_category;
  257. $result=api_sql_query("SELECT parent_id FROM $tbl_category WHERE code='$category'",__FILE__,__LINE__);
  258. if($row=mysql_fetch_array($result))
  259. {
  260. updateFils($row['parent_id']);
  261. }
  262. $children_count=compterFils($category,0)-1;
  263. api_sql_query("UPDATE $tbl_category SET children_count='$children_count' WHERE code='$category'",__FILE__,__LINE__);
  264. }
  265. function compterFils($pere,$cpt)
  266. {
  267. global $tbl_category;
  268. $result=api_sql_query("SELECT code FROM $tbl_category WHERE parent_id='$pere'",__FILE__,__LINE__);
  269. while($row=mysql_fetch_array($result))
  270. {
  271. $cpt=compterFils($row['code'],$cpt);
  272. }
  273. return ($cpt+1);
  274. }
  275. ?>