user_fields.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. <?php // $Id: $
  2. /*
  3. ==============================================================================
  4. Dokeos - elearning and course management software
  5. Copyright (c) 2008 Dokeos SPRL
  6. For a full list of contributors, see "credits.txt".
  7. The full license can be read in "license.txt".
  8. This program is free software; you can redistribute it and/or
  9. modify it under the terms of the GNU General Public License
  10. as published by the Free Software Foundation; either version 2
  11. of the License, or (at your option) any later version.
  12. See the GNU General Public License for more details.
  13. Contact: Dokeos, rue du Corbeau, 108, B-1030 Brussels, Belgium, info@dokeos.com
  14. ==============================================================================
  15. */
  16. /**
  17. ==============================================================================
  18. * @package dokeos.admin
  19. ==============================================================================
  20. */
  21. // name of the language file that needs to be included
  22. $language_file = array('admin','registration');
  23. $cidReset = true;
  24. // including necessary libraries
  25. require ('../inc/global.inc.php');
  26. $libpath = api_get_path(LIBRARY_PATH);
  27. include_once ($libpath.'usermanager.lib.php');
  28. require_once ($libpath.'formvalidator/FormValidator.class.php');
  29. // section for the tabs
  30. $this_section=SECTION_PLATFORM_ADMIN;
  31. // user permissions
  32. api_protect_admin_script();
  33. // Database table definitions
  34. $table_admin = Database :: get_main_table(TABLE_MAIN_ADMIN);
  35. $table_user = Database :: get_main_table(TABLE_MAIN_USER);
  36. $table_uf = Database :: get_main_table(TABLE_MAIN_USER_FIELD);
  37. $table_uf_opt = Database :: get_main_table(TABLE_MAIN_USER_FIELD_OPTIONS);
  38. $table_uf_val = Database :: get_main_table(TABLE_MAIN_USER_FIELD_VALUES);
  39. $interbreadcrumb[] = array ("url" => 'index.php', "name" => get_lang('PlatformAdmin'));
  40. // Display form
  41. if(1)
  42. {
  43. $tool_name = get_lang('UserFields');
  44. Display :: display_header($tool_name, "");
  45. //api_display_tool_title($tool_name);
  46. if (isset ($_GET['action']))
  47. {
  48. $check = Security::check_token('get');
  49. if($check) {
  50. switch ($_GET['action']) {
  51. case 'show_message' :
  52. Display :: display_normal_message($_GET['message']);
  53. break;
  54. case 'show_field' :
  55. if (api_is_platform_admin() && !empty($_GET['field_id']) && UserManager :: update_extra_field($_GET['field_id'],array('field_visible'=>'1'))) {
  56. Display :: display_confirmation_message(get_lang('FieldShown'));
  57. } else {
  58. Display :: display_error_message(get_lang('CannotShowField'));
  59. }
  60. break;
  61. case 'hide_field' :
  62. if (api_is_platform_admin() && !empty($_GET['field_id']) && UserManager :: update_extra_field($_GET['field_id'],array('field_visible'=>'0'))) {
  63. Display :: display_confirmation_message(get_lang('FieldHidden'));
  64. } else {
  65. Display :: display_error_message(get_lang('CannotHideField'));
  66. }
  67. break;
  68. case 'thaw_field' :
  69. if (api_is_platform_admin() && !empty($_GET['field_id']) && UserManager :: update_extra_field($_GET['field_id'],array('field_changeable'=>'1'))) {
  70. Display :: display_confirmation_message(get_lang('FieldMadeChangeable'));
  71. } else {
  72. Display :: display_error_message(get_lang('CannotMakeFieldChangeable'));
  73. }
  74. break;
  75. case 'freeze_field' :
  76. if (api_is_platform_admin() && !empty($_GET['field_id']) && UserManager :: update_extra_field($_GET['field_id'],array('field_changeable'=>'0'))) {
  77. Display :: display_confirmation_message(get_lang('FieldMadeUnchangeable'));
  78. } else {
  79. Display :: display_error_message(get_lang('CannotMakeFieldUnchangeable'));
  80. }
  81. break;
  82. case 'moveup' :
  83. if (api_is_platform_admin() && !empty($_GET['field_id'])) {
  84. if (move_user_field('moveup', $_GET['field_id'])) {
  85. Display :: display_confirmation_message(get_lang('FieldMovedUp'));
  86. } else {
  87. Display :: display_error_message(get_lang('CannotMoveField'));
  88. }
  89. }
  90. break;
  91. case 'movedown' :
  92. if (api_is_platform_admin() && !empty($_GET['field_id'])) {
  93. if (move_user_field('movedown', $_GET['field_id'])) {
  94. Display :: display_confirmation_message(get_lang('FieldMovedDown'));
  95. } else {
  96. Display :: display_error_message(get_lang('CannotMoveField'));
  97. }
  98. }
  99. break;
  100. case 'filter_on' :
  101. if (api_is_platform_admin() && !empty($_GET['field_id']) && UserManager :: update_extra_field($_GET['field_id'],array('field_filter'=>'1'))) {
  102. Display :: display_confirmation_message(get_lang('FieldFilterSetOn'));
  103. } else {
  104. Display :: display_error_message(get_lang('CannotShowField'));
  105. }
  106. break;
  107. case 'filter_off' :
  108. if (api_is_platform_admin() && !empty($_GET['field_id']) && UserManager :: update_extra_field($_GET['field_id'],array('field_filter'=>'0'))) {
  109. Display :: display_confirmation_message(get_lang('FieldFilterSetOff'));
  110. } else {
  111. Display :: display_error_message(get_lang('CannotShowField'));
  112. }
  113. break;
  114. case 'delete':
  115. if (api_is_platform_admin() && !empty($_GET['field_id'])) {
  116. if (delete_user_fields($_GET['field_id'])) {
  117. Display :: display_confirmation_message(get_lang('FieldDeleted'));
  118. } else {
  119. Display :: display_error_message(get_lang('CannotDeleteField'));
  120. }
  121. }
  122. break;
  123. }
  124. Security::clear_token();
  125. }
  126. }
  127. if (isset ($_POST['action'])) {
  128. $check = Security::check_token('get');
  129. if($check) {
  130. switch ($_POST['action']) {
  131. default:
  132. break;
  133. }
  134. Security::clear_token();
  135. }
  136. }
  137. // Create an add-field box
  138. $form = new FormValidator('add_field','post','','',null,false);
  139. $renderer =& $form->defaultRenderer();
  140. $renderer->setElementTemplate('<span>{element}</span> ');
  141. //$form->addElement('text','label',get_lang('FieldLabel'));
  142. //$form->addElement('text','type',get_lang('FieldType'));
  143. //$form->addElement('text','title',get_lang('FieldTitle'));
  144. //$form->addElement('text','default',get_lang('FieldDefaultValue'));
  145. //$form->addElement('submit','submit',get_lang('Search'));
  146. $form->addElement('static','search_advanced_link',null,'<a href="user_fields_add.php?action=fill">'.Display::return_icon('fieldadd.gif', get_lang('AddUserField')).get_lang('AddUserField').'</a>');
  147. echo '<div class="actions">';
  148. $form->display();
  149. echo '</div>';
  150. // Create a sortable table with user-data
  151. $parameters['sec_token'] = Security::get_token();
  152. $column_show = array(1,1,1,1,1,1,1,1,1,0,0);
  153. $column_order = array(1,2,3,4,5,6,7,8,9,10,11);
  154. $extra_fields = UserManager::get_extra_fields(0,100,5,'ASC');
  155. $number_of_extra_fields = count($extra_fields);
  156. $table = new SortableTableFromArrayConfig($extra_fields, 5, 50, '', $column_show, $column_order, 'ASC');
  157. $table->set_additional_parameters($parameters);
  158. $table->set_header(0, '', false);
  159. $table->set_header(1, get_lang('FieldLabel'), false);
  160. $table->set_header(2, get_lang('FieldType'), false);
  161. $table->set_header(3, get_lang('FieldTitle'),false);
  162. $table->set_header(4, get_lang('FieldDefaultValue'),false);
  163. $table->set_header(5, get_lang('FieldOrder'), false);
  164. $table->set_header(6, get_lang('FieldVisibility'), false);
  165. $table->set_header(7, get_lang('FieldChangeability'), false);
  166. $table->set_header(8, get_lang('FieldFilter'), false);
  167. $table->set_header(9, get_lang('Modify'), false);
  168. $table->set_column_filter(5, 'order_filter');
  169. $table->set_column_filter(6, 'modify_visibility');
  170. $table->set_column_filter(7, 'modify_changeability');
  171. $table->set_column_filter(8, 'modify_field_filter');
  172. $table->set_column_filter(9, 'edit_filter');
  173. $table->set_column_filter(2, 'type_filter');
  174. $table->display();
  175. }
  176. /*
  177. ==============================================================================
  178. FOOTER
  179. ==============================================================================
  180. */
  181. Display::display_footer();
  182. //gateway functions to the UserManager methods (provided for SorteableTable callback mechanism)
  183. function get_number_of_extra_fields()
  184. {
  185. return UserManager::get_number_of_extra_fields();
  186. }
  187. function get_extra_fields($f,$n,$o,$d)
  188. {
  189. return UserManager::get_extra_fields($f,$n,$o,$d);
  190. }
  191. /**
  192. * This functions translates the id of the form type into a human readable description
  193. *
  194. * @param integer $type the id of the form type
  195. * @return string the huma readable description of the field type (text, date, select drop-down, ...)
  196. *
  197. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  198. * @version July 2008
  199. * @since Dokeos 1.8.6
  200. */
  201. function type_filter($type)
  202. {
  203. $types[USER_FIELD_TYPE_TEXT] = get_lang('FieldTypeText');
  204. $types[USER_FIELD_TYPE_TEXTAREA] = get_lang('FieldTypeTextarea');
  205. $types[USER_FIELD_TYPE_RADIO] = get_lang('FieldTypeRadio');
  206. $types[USER_FIELD_TYPE_SELECT] = get_lang('FieldTypeSelect');
  207. $types[USER_FIELD_TYPE_SELECT_MULTIPLE] = get_lang('FieldTypeSelectMultiple');
  208. $types[USER_FIELD_TYPE_DATE] = get_lang('FieldTypeDate');
  209. $types[USER_FIELD_TYPE_DATETIME] = get_lang('FieldTypeDatetime');
  210. $types[USER_FIELD_TYPE_DOUBLE_SELECT] = get_lang('FieldTypeDoubleSelect');
  211. $types[USER_FIELD_TYPE_DIVIDER] = get_lang('FieldTypeDivider');
  212. return $types[$type];
  213. }
  214. /**
  215. * Modify the display order field into up and down arrows
  216. *
  217. * @param unknown_type $field_order
  218. * @param array Url parameters
  219. * @param array The results row
  220. * @return string The link
  221. *
  222. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  223. * @version July 2008
  224. * @since Dokeos 1.8.6
  225. */
  226. function order_filter($field_order,$url_params,$row)
  227. {
  228. global $number_of_extra_fields;
  229. // the up icon only has to appear when the row can be moved up (all but the first row)
  230. if ($row[5]<>1)
  231. {
  232. $return .= '<a href="'.api_get_self().'?action=moveup&field_id='.$row[0].'&sec_token='.$_SESSION['sec_token'].'">'.Display::return_icon('up.gif', get_lang('Up')).'</a>';
  233. }
  234. else
  235. {
  236. $return .= Display::return_icon('blank.gif','',array('width'=>'21px'));
  237. }
  238. // the down icon only has to appear when the row can be moved down (all but the last row)
  239. if ($row[5]<>$number_of_extra_fields)
  240. {
  241. $return .= '<a href="'.api_get_self().'?action=movedown&field_id='.$row[0].'&sec_token='.$_SESSION['sec_token'].'">'.Display::return_icon('down.gif', get_lang('Down')).'</a>';
  242. }
  243. return $return;
  244. }
  245. /**
  246. * Modify the visible field to show links and icons
  247. * @param int The current visibility
  248. * @param array Url parameters
  249. * @param array The results row
  250. * @return string The link
  251. */
  252. function modify_visibility($visibility,$url_params,$row)
  253. {
  254. return ($visibility?'<a href="'.api_get_self().'?action=hide_field&field_id='.$row[0].'&sec_token='.$_SESSION['sec_token'].'">'.Display::return_icon('visible.gif', get_lang('Hide')).'</a>':'<a href="'.api_get_self().'?action=show_field&field_id='.$row[0].'&sec_token='.$_SESSION['sec_token'].'">'.Display::return_icon('invisible.gif', get_lang('Show')).'</a>');
  255. }
  256. /**
  257. * Modify the changeability field to show links and icons
  258. * @param int The current changeability
  259. * @param array Url parameters
  260. * @param array The results row
  261. * @return string The link
  262. */
  263. function modify_changeability($changeability,$url_params,$row)
  264. {
  265. return ($changeability?'<a href="'.api_get_self().'?action=freeze_field&field_id='.$row[0].'&sec_token='.$_SESSION['sec_token'].'">'.Display::return_icon('right.gif', get_lang('MakeUnchangeable')).'</a>':'<a href="'.api_get_self().'?action=thaw_field&field_id='.$row[0].'&sec_token='.$_SESSION['sec_token'].'">'.Display::return_icon('wrong.gif', get_lang('MakeChangeable')).'</a>');
  266. }
  267. function modify_field_filter ($changeability,$url_params,$row)
  268. {
  269. return ($changeability?'<a href="'.api_get_self().'?action=filter_off&field_id='.$row[0].'&sec_token='.$_SESSION['sec_token'].'">'.Display::return_icon('right.gif', get_lang('FilterOff')).'</a>':'' .
  270. '<a href="'.api_get_self().'?action=filter_on&field_id='.$row[0].'&sec_token='.$_SESSION['sec_token'].'">'.Display::return_icon('wrong.gif', get_lang('FilterOn')).'</a>');
  271. }
  272. function edit_filter($id,$url_params,$row)
  273. {
  274. global $charset;
  275. $return = '<a href="user_fields_add.php?action=edit&field_id='.$row[0].'&sec_token='.$_SESSION['sec_token'].'">'.Display::return_icon('edit.gif',get_lang('Edit')).'</a>';
  276. $return .= ' <a href="'.api_get_self().'?action=delete&field_id='.$row[0].'&sec_token='.$_SESSION['sec_token'].'" onclick="javascript:if(!confirm('."'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"),ENT_QUOTES,$charset))."'".')) return false;">'.Display::return_icon('delete.gif',get_lang('Delete')).'</a>';
  277. return $return;
  278. }
  279. /**
  280. * Move a user defined field up or down
  281. *
  282. * @param string $direction the direction we have to move the field to (up or down)
  283. * @param unknown_type $field_id
  284. *
  285. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  286. * @version July 2008
  287. * @since Dokeos 1.8.6
  288. */
  289. function move_user_field($direction,$field_id)
  290. {
  291. // Databse table definitions
  292. $table_user_field = Database::get_main_table(TABLE_MAIN_USER_FIELD);
  293. // check the parameters
  294. if (!in_array($direction,array('moveup','movedown')) OR !is_numeric($field_id))
  295. {
  296. return false;
  297. }
  298. // determine the SQL sort direction
  299. if ($direction == 'moveup')
  300. {
  301. $sortdirection = 'DESC';
  302. }
  303. else
  304. {
  305. $sortdirection = 'ASC';
  306. }
  307. $found = false;
  308. $sql = "SELECT id, field_order FROM $table_user_field ORDER BY field_order $sortdirection";
  309. $result = api_sql_query($sql,__FILE__,__LINE__);
  310. while($row = Database::fetch_array($result))
  311. {
  312. if ($found)
  313. {
  314. $next_id = $row['id'];
  315. $next_order = $row['field_order'];
  316. break;
  317. }
  318. if ($field_id == $row['id'])
  319. {
  320. $this_id = $row['id'];
  321. $this_order = $row['field_order'];
  322. $found = true;
  323. }
  324. }
  325. $sql1 = "UPDATE ".$table_user_field." SET field_order = '".Database::escape_string($next_order)."' WHERE id = '".Database::escape_string($this_id)."'";
  326. $sql2 = "UPDATE ".$table_user_field." SET field_order = '".Database::escape_string($this_order)."' WHERE id = '".Database::escape_string($next_id)."'";
  327. api_sql_query($sql1,__FILE__,__LINE__);
  328. api_sql_query($sql2,__FILE__,__LINE__);
  329. return true;
  330. }
  331. /**
  332. * Delete a user field (and also the options and values entered by the users)
  333. *
  334. * @param integer $field_id the id of the field that has to be deleted
  335. * @return boolean true if the field has been deleted, false if the field could not be deleted (for whatever reason)
  336. *
  337. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  338. * @version July 2008
  339. * @since Dokeos 1.8.6
  340. */
  341. function delete_user_fields($field_id)
  342. {
  343. // Database table definitions
  344. $table_user_field = Database::get_main_table(TABLE_MAIN_USER_FIELD);
  345. $table_user_field_options = Database::get_main_table(TABLE_MAIN_USER_FIELD_OPTIONS);
  346. $table_user_field_values = Database::get_main_table(TABLE_MAIN_USER_FIELD_VALUES);
  347. // delete the fields
  348. $sql = "DELETE FROM $table_user_field WHERE id = '".Database::escape_string($field_id)."'";
  349. $result = api_sql_query($sql,__FILE__,__LINE__);
  350. if (Database::affected_rows() == 1)
  351. {
  352. // delete the field options
  353. $sql = "DELETE FROM $table_user_field_options WHERE field_id = '".Database::escape_string($field_id)."'";
  354. $result = api_sql_query($sql,__FILE__,__LINE__);
  355. // delete the field values
  356. $sql = "DELETE FROM $table_user_field_values WHERE field_id = '".Database::escape_string($field_id)."'";
  357. $result = api_sql_query($sql,__FILE__,__LINE__);
  358. // recalculate the field_order because the value is used to show/hide the up/down icon
  359. // and the field_order value cannot be bigger than the number of fields
  360. $sql = "SELECT * FROM $table_user_field ORDER BY field_order ASC";
  361. $result = api_sql_query($sql,__FILE__,__LINE__);
  362. $i = 1;
  363. while($row = Database::fetch_array($result))
  364. {
  365. $sql_reorder = "UPDATE $table_user_field SET field_order = '".Database::escape_string($i)."' WHERE id = '".Database::escape_string($row['id'])."'";
  366. $result_reorder = api_sql_query($sql_reorder,__FILE__,__LINE__);
  367. $i++;
  368. }
  369. // field was deleted so we return true
  370. return true;
  371. }
  372. else
  373. {
  374. // the field was not deleted so we return false
  375. return false;
  376. }
  377. }
  378. ?>