course_category.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. <?php // $Id: course_category.php 13295 2007-09-27 02:16:44Z yannoo $
  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. // name of the language file that needs to be included
  25. $language_file='admin';
  26. $cidReset=true;
  27. require('../inc/global.inc.php');
  28. $this_section=SECTION_PLATFORM_ADMIN;
  29. api_protect_admin_script();
  30. $category=$_GET['category'];
  31. $action=$_GET['action'];
  32. $tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
  33. $tbl_category = Database::get_main_table(TABLE_MAIN_CATEGORY);
  34. $errorMsg='';
  35. if(!empty($action))
  36. {
  37. if($action == 'delete')
  38. {
  39. deleteNode($_GET['id']);
  40. header('Location: '.api_get_self().'?category='.$category);
  41. exit();
  42. }
  43. elseif(($action == 'add' || $action == 'edit') && $_POST['formSent'])
  44. {
  45. $_POST['categoryCode']=trim($_POST['categoryCode']);
  46. $_POST['categoryName']=trim($_POST['categoryName']);
  47. if(!empty($_POST['categoryCode']) && !empty($_POST['categoryName']))
  48. {
  49. if($action == 'add')
  50. {
  51. $ret=addNode($_POST['categoryCode'],$_POST['categoryName'],$_POST['canHaveCourses'],$category);
  52. }
  53. else
  54. {
  55. $ret=editNode($_POST['categoryCode'],$_POST['categoryName'],$_POST['canHaveCourses'],$_GET['id']);
  56. }
  57. if($ret)
  58. {
  59. $action='';
  60. }
  61. else
  62. {
  63. $errorMsg=get_lang('CatCodeAlreadyUsed');
  64. }
  65. }
  66. else
  67. {
  68. $errorMsg=get_lang('PleaseEnterCategoryInfo');
  69. }
  70. }
  71. elseif($action == 'edit')
  72. {
  73. $categoryCode=$_GET['id'];
  74. $result=api_sql_query("SELECT name,auth_course_child FROM $tbl_category WHERE code='$categoryCode'",__FILE__,__LINE__);
  75. list($categoryName,$canHaveCourses)=mysql_fetch_row($result);
  76. $canHaveCourses=($canHaveCourses == 'FALSE')?0:1;
  77. }
  78. elseif($action == 'moveUp')
  79. {
  80. moveNodeUp($_GET['id'],$_GET['tree_pos'],$category);
  81. header('Location: '.api_get_self().'?category='.$category);
  82. exit();
  83. }
  84. }
  85. $tool_name=get_lang('AdminCategories');
  86. $interbreadcrumb[]=array('url' => 'index.php',"name" => get_lang('PlatformAdmin'));
  87. Display::display_header($tool_name);
  88. //api_display_tool_title($tool_name);
  89. if(empty($action))
  90. {
  91. $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__);
  92. $Categories=api_store_result($result);
  93. }
  94. if(!empty($category) && empty($action))
  95. {
  96. $result=api_sql_query("SELECT parent_id FROM $tbl_category WHERE code='$category'",__FILE__,__LINE__);
  97. list($parent_id)=mysql_fetch_row($result);
  98. ?>
  99. <a href="<?php echo api_get_self(); ?>?category=<?php echo urlencode($parent_id); ?>">&lt;&lt; <?php echo get_lang("Back"); if(!empty($parent_id)) echo ' ('.$parent_id.')'; ?></a>
  100. <?php
  101. }
  102. if($action == 'add' || $action == 'edit')
  103. {
  104. ?>
  105. <a href="<?php echo api_get_self(); ?>?category=<?php echo urlencode($category); ?>">&lt;&lt; <?php echo get_lang("Back"); if(!empty($category)) echo ' ('.$category.')'; ?></a>
  106. <h3><?php echo ($action == 'add')?get_lang('AddACategory'):get_lang('EditNode'); if(!empty($category)) echo ' '.get_lang('Into').' '.$category; ?></h3>
  107. <form method="post" action="<?php echo api_get_self(); ?>?action=<?php echo $action; ?>&category=<?php echo urlencode($category); ?>&amp;id=<?php echo urlencode(stripslashes($_GET['id'])); ?>">
  108. <input type="hidden" name="formSent" value="1" />
  109. <table border="0" cellpadding="5" cellspacing="0">
  110. <?php
  111. if(!empty($errorMsg))
  112. {
  113. ?>
  114. <tr>
  115. <td colspan="2">
  116. <?php
  117. Display::display_normal_message($errorMsg); //main API
  118. ?>
  119. </td>
  120. </tr>
  121. <?php
  122. }
  123. ?>
  124. <tr>
  125. <td nowrap="nowrap"><?php echo get_lang("CategoryCode"); ?> :</td>
  126. <td><input type="text" name="categoryCode" size="20" maxlength="20" value="<?php echo htmlentities(stripslashes($categoryCode),ENT_QUOTES,$charset); ?>" /></td>
  127. </tr>
  128. <tr>
  129. <td nowrap="nowrap"><?php echo get_lang("CategoryName"); ?> :</td>
  130. <td><input type="text" name="categoryName" size="20" maxlength="100" value="<?php echo htmlentities(stripslashes($categoryName),ENT_QUOTES,$charset); ?>" /></td>
  131. </tr>
  132. <tr>
  133. <td nowrap="nowrap"><?php echo get_lang("AllowCoursesInCategory"); ?></td>
  134. <td>
  135. <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"); ?>
  136. <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"); ?>
  137. </td>
  138. </tr>
  139. <tr>
  140. <td>&nbsp;</td>
  141. <td><input type="submit" value="<?php echo get_lang("Ok"); ?>" /></td>
  142. </tr>
  143. </table>
  144. </form>
  145. <?php
  146. }
  147. else
  148. {
  149. ?>
  150. <ul>
  151. <?php
  152. if(sizeof($Categories))
  153. {
  154. foreach($Categories as $enreg)
  155. {
  156. ?>
  157. <li>
  158. <a href="<?php echo api_get_self(); ?>?category=<?php echo urlencode($enreg['code']); ?>"><img src="../img/folder_document.gif" border="0" title="<?php echo get_lang("OpenNode"); ?>" alt="" align="absbottom" /></a>
  159. <a href="<?php echo api_get_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>
  160. <a href="<?php echo api_get_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'),ENT_QUOTES,$charset)); ?>')) return false;"><img src="../img/delete.gif" border="0" title="<?php echo get_lang("DeleteNode"); ?>" alt="" /></a>
  161. <a href="<?php echo api_get_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>
  162. <?php echo $enreg['name']; ?>
  163. (<?php echo $enreg['children_count']; ?> <?php echo get_lang("Categories"); ?> - <?php echo $enreg['nbr_courses']; ?> <?php echo get_lang("Courses"); ?>)
  164. </li>
  165. <?php
  166. }
  167. unset($Categories);
  168. }
  169. else
  170. {
  171. echo get_lang("NoCategories");
  172. }
  173. ?>
  174. </ul>
  175. <a href="<?php echo api_get_self(); ?>?category=<?php echo $category; ?>&amp;action=add"><?php echo get_lang("AddACategory"); if(!empty($category)) echo ' '.get_lang('Into').' '.$category; ?></a>
  176. <?php
  177. }
  178. /*
  179. ==============================================================================
  180. FOOTER
  181. ==============================================================================
  182. */
  183. Display::display_footer();
  184. /******** Functions ********/
  185. function deleteNode($node)
  186. {
  187. global $tbl_category, $tbl_course;
  188. $result=api_sql_query("SELECT parent_id,tree_pos FROM $tbl_category WHERE code='$node'",__FILE__,__LINE__);
  189. if($row=mysql_fetch_array($result))
  190. {
  191. if(!empty($row['parent_id']))
  192. {
  193. api_sql_query("UPDATE $tbl_course SET category_code='$row[parent_id]' WHERE category_code='$node'",__FILE__,__LINE__);
  194. api_sql_query("UPDATE $tbl_category SET parent_id='$row[parent_id]' WHERE parent_id='$node'",__FILE__,__LINE__);
  195. }
  196. else
  197. {
  198. api_sql_query("UPDATE $tbl_course SET category_code='' WHERE category_code='$node'",__FILE__,__LINE__);
  199. api_sql_query("UPDATE $tbl_category SET parent_id=NULL WHERE parent_id='$node'",__FILE__,__LINE__);
  200. }
  201. api_sql_query("UPDATE $tbl_category SET tree_pos=tree_pos-1 WHERE tree_pos > '$row[tree_pos]'",__FILE__,__LINE__);
  202. api_sql_query("DELETE FROM $tbl_category WHERE code='$node'",__FILE__,__LINE__);
  203. if(!empty($row['parent_id']))
  204. {
  205. updateFils($row['parent_id']);
  206. }
  207. }
  208. }
  209. function addNode($code,$name,$canHaveCourses,$parent_id)
  210. {
  211. global $tbl_category;
  212. $canHaveCourses=$canHaveCourses?'TRUE':'FALSE';
  213. $result=api_sql_query("SELECT 1 FROM $tbl_category WHERE code='$code'",__FILE__,__LINE__);
  214. if(mysql_num_rows($result))
  215. {
  216. return false;
  217. }
  218. $result=api_sql_query("SELECT MAX(tree_pos) AS maxTreePos FROM $tbl_category",__FILE__,__LINE__);
  219. $row=mysql_fetch_array($result);
  220. $tree_pos=$row['maxTreePos']+1;
  221. 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__);
  222. updateFils($parent_id);
  223. return true;
  224. }
  225. function editNode($code,$name,$canHaveCourses,$old_code)
  226. {
  227. global $tbl_category;
  228. $canHaveCourses=$canHaveCourses?'TRUE':'FALSE';
  229. if($code != $old_code)
  230. {
  231. $result=api_sql_query("SELECT 1 FROM $tbl_category WHERE code='$code'",__FILE__,__LINE__);
  232. if(mysql_num_rows($result))
  233. {
  234. return false;
  235. }
  236. }
  237. api_sql_query("UPDATE $tbl_category SET name='$name',code='$code',auth_course_child='$canHaveCourses' WHERE code='$old_code'",__FILE__,__LINE__);
  238. return true;
  239. }
  240. function moveNodeUp($code,$tree_pos,$parent_id)
  241. {
  242. global $tbl_category;
  243. $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__);
  244. if(!$row=mysql_fetch_array($result))
  245. {
  246. $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__);
  247. if(!$row=mysql_fetch_array($result))
  248. {
  249. return false;
  250. }
  251. }
  252. api_sql_query("UPDATE $tbl_category SET tree_pos='".$row['tree_pos']."' WHERE code='$code'",__FILE__,__LINE__);
  253. api_sql_query("UPDATE $tbl_category SET tree_pos='$tree_pos' WHERE code='$row[code]'",__FILE__,__LINE__);
  254. }
  255. function updateFils($category)
  256. {
  257. global $tbl_category;
  258. $result=api_sql_query("SELECT parent_id FROM $tbl_category WHERE code='$category'",__FILE__,__LINE__);
  259. if($row=mysql_fetch_array($result))
  260. {
  261. updateFils($row['parent_id']);
  262. }
  263. $children_count=compterFils($category,0)-1;
  264. api_sql_query("UPDATE $tbl_category SET children_count='$children_count' WHERE code='$category'",__FILE__,__LINE__);
  265. }
  266. function compterFils($pere,$cpt)
  267. {
  268. global $tbl_category;
  269. $result=api_sql_query("SELECT code FROM $tbl_category WHERE parent_id='$pere'",__FILE__,__LINE__);
  270. while($row=mysql_fetch_array($result))
  271. {
  272. $cpt=compterFils($row['code'],$cpt);
  273. }
  274. return ($cpt+1);
  275. }
  276. ?>