settings.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. /**
  4. * With this tool you can easily adjust non critical configuration settings.
  5. * Non critical means that changing them will not result in a broken campus.
  6. *
  7. * @author Patrick Cool
  8. * @author Julio Montoya - Multiple URL site
  9. * @package chamilo.admin
  10. */
  11. /* INIT SECTION */
  12. // Language files that need to be included.
  13. if (isset($_GET['category']) && $_GET['category'] == 'Templates') {
  14. $language_file = array('admin', 'document');
  15. } else if(isset($_GET['category']) && $_GET['category'] == 'Gradebook') {
  16. $language_file = array('admin', 'gradebook');
  17. } else {
  18. $language_file = array('admin', 'document');
  19. }
  20. // Resetting the course id.
  21. $cidReset = true;
  22. // Including some necessary library files.
  23. require_once '../inc/global.inc.php';
  24. require_once api_get_path(LIBRARY_PATH).'formvalidator/FormValidator.class.php';
  25. require_once api_get_path(LIBRARY_PATH).'fileManage.lib.php';
  26. require_once api_get_path(LIBRARY_PATH).'fileUpload.lib.php';
  27. require_once api_get_path(LIBRARY_PATH).'dashboard.lib.php';
  28. require_once api_get_path(LIBRARY_PATH).'pdf.lib.php';
  29. require_once 'settings.lib.php';
  30. // Setting the section (for the tabs).
  31. $this_section = SECTION_PLATFORM_ADMIN;
  32. $_SESSION['this_section'] = $this_section;
  33. // Access restrictions.
  34. api_protect_admin_script();
  35. // Submit stylesheets.
  36. if (isset($_POST['submit_stylesheets'])) {
  37. $message = store_stylesheets();
  38. header("Location: ".api_get_self()."?category=stylesheets");
  39. exit;
  40. }
  41. // Database table definitions.
  42. $table_settings_current = Database :: get_main_table(TABLE_MAIN_SETTINGS_CURRENT);
  43. // Setting breadcrumbs.
  44. $interbreadcrumb[] = array('url' => 'index.php', 'name' => get_lang('PlatformAdmin'));
  45. // Setting the name of the tool.
  46. $tool_name = get_lang('DokeosConfigSettings');
  47. if (empty($_GET['category'])) {
  48. $_GET['category'] = 'Platform';
  49. }
  50. $watermark_deleted = false;
  51. if (isset($_GET['delete_watermark'])) {
  52. $watermark_deleted = PDF::delete_watermark();
  53. }
  54. // Build the form.
  55. if (!empty($_GET['category']) && !in_array($_GET['category'], array('Plugins', 'stylesheets', 'Search'))) {
  56. $form = new FormValidator('settings', 'post', 'settings.php?category='.$_GET['category']);
  57. $renderer = & $form->defaultRenderer();
  58. $renderer->setHeaderTemplate('<div class="sectiontitle">{header}</div>'."\n");
  59. $renderer->setElementTemplate('<div class="sectioncomment">{label}</div>'."\n".'<div class="sectionvalue">{element}</div>'."\n");
  60. $my_category = Database::escape_string($_GET['category']);
  61. $sqlcountsettings = "SELECT COUNT(*) FROM $table_settings_current WHERE category='".$my_category."' AND type<>'checkbox'";
  62. $resultcountsettings = Database::query($sqlcountsettings);
  63. $countsetting = Database::fetch_array($resultcountsettings);
  64. if ($_configuration['access_url'] == 1) {
  65. $settings = api_get_settings($my_category, 'group', $_configuration['access_url']);
  66. } else {
  67. $url_info = api_get_access_url($_configuration['access_url']);
  68. if ($url_info['active'] == 1) {
  69. // The default settings of Chamilo
  70. $settings = api_get_settings($my_category, 'group', 1, 0);
  71. // The settings that are changeable from a particular site.
  72. $settings_by_access = api_get_settings($my_category, 'group', $_configuration['access_url'], 1);
  73. //echo '<pre>';
  74. //print_r($settings_by_access);
  75. $settings_by_access_list = array();
  76. foreach ($settings_by_access as $row) {
  77. if (empty($row['variable']))
  78. $row['variable'] = 0;
  79. if (empty($row['subkey']))
  80. $row['subkey'] = 0;
  81. if (empty($row['category']))
  82. $row['category'] = 0;
  83. // One more validation if is changeable.
  84. if ($row['access_url_changeable'] == 1)
  85. $settings_by_access_list[ $row['variable'] ] [ $row['subkey'] ] [ $row['category'] ] = $row;
  86. else
  87. $settings_by_access_list[ $row['variable'] ] [ $row['subkey'] ] [ $row['category'] ] = array();
  88. }
  89. }
  90. }
  91. $default_values = array();
  92. foreach ($settings as $row) {
  93. // Settings to avoid
  94. $rows_to_avoid = array('gradebook_enable');
  95. if (in_array($row['variable'], $rows_to_avoid)) { continue; }
  96. $anchor_name = $row['variable'].(!empty($row['subkey']) ? '_'.$row['subkey'] : '');
  97. $form->addElement('html',"\n<a name=\"$anchor_name\"></a>\n");
  98. ($countsetting['0'] % 10) < 5 ? $b = $countsetting['0'] - 10 : $b = $countsetting['0'];
  99. if ($i % 10 == 0 and $i < $b) {
  100. $form->addElement('html', '<div align="right">');
  101. $form->addElement('style_submit_button', null, get_lang('SaveSettings'), 'class="save"');
  102. $form->addElement('html', '</div>');
  103. }
  104. $i++;
  105. $form->addElement('header', null, get_lang($row['title']));
  106. if ($row['access_url_changeable'] == '1' && $_configuration['multiple_access_urls']) {
  107. $form->addElement('html', '<div style="float: right;">'.Display::return_icon('shared_setting.png', get_lang('SharedSettingIconComment')).'</div>');
  108. }
  109. $hideme = array();
  110. $hide_element = false;
  111. if ($_configuration['access_url'] != 1) {
  112. if ($row['access_url_changeable'] == 0) {
  113. // We hide the element in other cases (checkbox, radiobutton) we 'freeze' the element.
  114. $hide_element = true;
  115. $hideme = array('disabled');
  116. } elseif ($url_info['active'] == 1) {
  117. // We show the elements.
  118. if (empty($row['variable']))
  119. $row['variable'] = 0;
  120. if (empty($row['subkey']))
  121. $row['subkey'] = 0;
  122. if (empty($row['category']))
  123. $row['category'] = 0;
  124. if (is_array($settings_by_access_list[ $row['variable'] ] [ $row['subkey'] ] [ $row['category'] ])) {
  125. // We are sure that the other site have a selected value.
  126. if ($settings_by_access_list[ $row['variable'] ] [ $row['subkey'] ] [ $row['category'] ]['selected_value'] != '')
  127. $row['selected_value'] =$settings_by_access_list[$row['variable']] [$row['subkey']] [ $row['category'] ]['selected_value'];
  128. }
  129. // There is no else{} statement because we load the default $row['selected_value'] of the main Chamilo site.
  130. }
  131. }
  132. switch ($row['type']) {
  133. case 'textfield':
  134. if ($row['variable'] == 'account_valid_duration') {
  135. $form->addElement('text', $row['variable'], get_lang($row['comment']), array('maxlength' => '5'));
  136. $form->applyFilter($row['variable'], 'html_filter');
  137. $default_values[$row['variable']] = $row['selected_value'];
  138. // For platform character set selection: Conversion of the textfield to a select box with valid values.
  139. } elseif ($row['variable'] == 'platform_charset') {
  140. $current_system_encoding = api_refine_encoding_id(trim($row['selected_value']));
  141. $valid_encodings = array_flip(api_get_valid_encodings());
  142. if (!isset($valid_encodings[$current_system_encoding])) {
  143. $is_alias_encoding = false;
  144. foreach ($valid_encodings as $encoding) {
  145. if (api_equal_encodings($encoding, $current_system_encoding)) {
  146. $is_alias_encoding = true;
  147. $current_system_encoding = $encoding;
  148. break;
  149. }
  150. }
  151. if (!$is_alias_encoding) {
  152. $valid_encodings[$current_system_encoding] = $current_system_encoding;
  153. }
  154. }
  155. foreach ($valid_encodings as $key => &$encoding) {
  156. if (api_is_encoding_supported($key) && Database::is_encoding_supported($key)) {
  157. $encoding = $key;
  158. } else {
  159. //$encoding = $key.' (n.a.)';
  160. unset($valid_encodings[$key]);
  161. }
  162. }
  163. $form->addElement('select', $row['variable'], get_lang($row['comment']), $valid_encodings);
  164. $default_values[$row['variable']] = $current_system_encoding;
  165. } else {
  166. $form->addElement('text', $row['variable'], get_lang($row['comment']), $hideme);
  167. $form->applyFilter($row['variable'],'html_filter');
  168. $default_values[$row['variable']] = $row['selected_value'];
  169. }
  170. break;
  171. case 'textarea':
  172. if ($row['variable'] == 'header_extra_content') {
  173. $file = api_get_path(SYS_PATH).api_get_home_path().'header_extra_content';
  174. $value = '';
  175. if (file_exists($file)) {
  176. $value = file_get_contents($file);
  177. }
  178. $form->addElement('textarea', $row['variable'], get_lang($row['comment']) , array('rows'=>'10','cols'=>'50'), $hideme);
  179. $default_values[$row['variable']] = $value;
  180. } else {
  181. $form->addElement('textarea', $row['variable'], get_lang($row['comment']) , array('rows'=>'10','cols'=>'50'), $hideme);
  182. $default_values[$row['variable']] = $row['selected_value'];
  183. }
  184. break;
  185. case 'radio':
  186. $values = get_settings_options($row['variable']);
  187. $group = array ();
  188. if (is_array($values )) {
  189. foreach ($values as $key => $value) {
  190. $element = & $form->createElement('radio', $row['variable'], '', get_lang($value['display_text']), $value['value']);
  191. if ($hide_element) {
  192. $element->freeze();
  193. }
  194. $group[] = $element;
  195. }
  196. }
  197. $form->addGroup($group, $row['variable'], get_lang($row['comment']), '<br />', false);
  198. $default_values[$row['variable']] = $row['selected_value'];
  199. break;
  200. case 'checkbox';
  201. // 1. We collect all the options of this variable.
  202. $sql = "SELECT * FROM settings_current WHERE variable='".$row['variable']."' AND access_url = 1";
  203. $result = Database::query($sql);
  204. $group = array ();
  205. while ($rowkeys = Database::fetch_array($result)) {
  206. //if ($rowkeys['variable'] == 'course_create_active_tools' && $rowkeys['subkey'] == 'enable_search') { continue; }
  207. // Profile tab option should be hidden when the social tool is enabled.
  208. if (api_get_setting('allow_social_tool') == 'true') {
  209. if ($rowkeys['variable'] == 'show_tabs' && $rowkeys['subkey'] == 'my_profile') { continue; }
  210. }
  211. // Hiding the gradebook option.
  212. if ($rowkeys['variable'] == 'show_tabs' && $rowkeys['subkey'] == 'my_gradebook') { continue; }
  213. $element = & $form->createElement('checkbox', $rowkeys['subkey'], '', get_lang($rowkeys['subkeytext']));
  214. if ($row['access_url_changeable'] == 1) {
  215. // 2. We look into the DB if there is a setting for a specific access_url.
  216. $access_url = $_configuration['access_url'];
  217. if (empty($access_url )) $access_url = 1;
  218. $sql = "SELECT selected_value FROM settings_current WHERE variable='".$rowkeys['variable']."' AND subkey='".$rowkeys['subkey']."' AND subkeytext='".$rowkeys['subkeytext']."' AND access_url = $access_url";
  219. $result_access = Database::query($sql);
  220. $row_access = Database::fetch_array($result_access);
  221. if ($row_access['selected_value'] == 'true' && !$form->isSubmitted()) {
  222. $element->setChecked(true);
  223. }
  224. } else {
  225. if ($rowkeys['selected_value'] == 'true' && !$form->isSubmitted()) {
  226. $element->setChecked(true);
  227. }
  228. }
  229. if ($hide_element) {
  230. $element->freeze();
  231. }
  232. $group[] = $element;
  233. }
  234. $form->addGroup($group, $row['variable'], get_lang($row['comment']), '<br />'."\n");
  235. break;
  236. case 'link':
  237. $form->addElement('static', null, get_lang($row['comment']), get_lang('CurrentValue').' : '.$row['selected_value'], $hideme);
  238. break;
  239. /*
  240. * To populate its list of options, the select type dynamically calls a function that must be called select_ + the name of the variable being displayed.
  241. * The functions being called must be added to the file settings.lib.php.
  242. */
  243. case 'select':
  244. $form->addElement('select', $row['variable'], get_lang($row['comment']), call_user_func('select_'.$row['variable']), $hideme);
  245. $default_values[$row['variable']] = $row['selected_value'];
  246. break;
  247. /*
  248. * Used to display custom values for the gradebook score display
  249. */
  250. /* this configuration is moved now inside gradebook tool
  251. case 'gradebook_score_display_custom':
  252. if(api_get_setting('gradebook_score_display_custom', 'my_display_custom') == 'false') {
  253. $form->addElement('static', null, null, get_lang('GradebookActivateScoreDisplayCustom'));
  254. } else {
  255. // Get score displays.
  256. require_once api_get_path(SYS_CODE_PATH).'gradebook/lib/scoredisplay.class.php';
  257. $scoredisplay = ScoreDisplay::instance();
  258. $customdisplays = $scoredisplay->get_custom_score_display_settings();
  259. $nr_items = (count($customdisplays)!='0') ? count($customdisplays) : '1';
  260. $form->addElement('hidden', 'gradebook_score_display_custom_values_maxvalue', '100');
  261. $form->addElement('hidden', 'gradebook_score_display_custom_values_minvalue', '0');
  262. $form->addElement('static', null, null, get_lang('ScoreInfo'));
  263. $scorenull[] = $form->CreateElement('static', null, null, get_lang('Between'));
  264. $form->setDefaults(array (
  265. 'beginscore' => '0'
  266. ));
  267. $scorenull[] = $form->CreateElement('text', 'beginscore', null, array (
  268. 'size' => 5,
  269. 'maxlength' => 5,
  270. 'disabled' => 'disabled'
  271. ));
  272. $scorenull[] = $form->CreateElement('static', null, null, ' %');
  273. $form->addGroup($scorenull, '', '', ' ');
  274. for ($counter= 1; $counter <= 20; $counter++) {
  275. $renderer = $form->defaultRenderer();
  276. $elementTemplateTwoLabel =
  277. '<div id=' . $counter . ' style="display: '.(($counter<=$nr_items)?'inline':'none').';">
  278. <p><!-- BEGIN required --><span class="form_required">*</span> <!-- END required -->{label}
  279. <div class="formw"><!-- BEGIN error --><span class="form_error">{error}</span><br /><!-- END error --> <b>'.get_lang('And').'</b>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp{element} % =';
  280. $elementTemplateTwoLabel2 =
  281. '<!-- BEGIN error --><span class="form_error">{error}</span><br /><!-- END error -->&nbsp{element}
  282. <a href="javascript:minItem(' . ($counter) . ')"><img style="display: '.(($counter >= $nr_items && $counter != 1) ? 'inline' : 'none').';" id="min-' . $counter . '" src="../img/gradebook_remove.gif" alt="'.get_lang('Delete').'" title="'.get_lang('Delete').'"></img></a>
  283. <a href="javascript:plusItem(' . ($counter+1) . ')"><img style="display: '.(($counter >= $nr_items) ? 'inline' : 'none').';" id="plus-' . ($counter+1) . '" src="../img/gradebook_add.gif" alt="'.get_lang('Add').'" title="'.get_lang('Add').'"></img></a>
  284. </div></p></div>';
  285. $scorebetw= array ();
  286. $form->addElement('text', 'gradebook_score_display_custom_values_endscore[' . $counter . ']', null, array (
  287. 'size' => 5,
  288. 'maxlength' => 5,
  289. 'id' => 'txta-'.$counter
  290. ));
  291. $form->addElement('text', 'gradebook_score_display_custom_values_displaytext[' . $counter . ']', null,array (
  292. 'size' => 40,
  293. 'maxlength' => 40,
  294. 'id' => 'txtb-'.$counter
  295. ));
  296. $renderer->setElementTemplate($elementTemplateTwoLabel,'gradebook_score_display_custom_values_endscore[' . $counter . ']');
  297. $renderer->setElementTemplate($elementTemplateTwoLabel2,'gradebook_score_display_custom_values_displaytext[' . $counter . ']');
  298. $form->addRule('gradebook_score_display_custom_values_endscore[' . $counter . ']', get_lang('OnlyNumbers'), 'numeric');
  299. $form->addRule(array('gradebook_score_display_custom_values_endscore[' . $counter . ']', 'gradebook_score_display_custom_values_maxvalue'), get_lang('Over100'), 'compare', '<=');
  300. $form->addRule(array('gradebook_score_display_custom_values_endscore[' . $counter . ']', 'gradebook_score_display_custom_values_minvalue'), get_lang('UnderMin'), 'compare', '>');
  301. if ($customdisplays[$counter - 1]) {
  302. $default_values['gradebook_score_display_custom_values_endscore['.$counter.']'] = $customdisplays[$counter - 1]['score'];
  303. $default_values['gradebook_score_display_custom_values_displaytext['.$counter.']'] = $customdisplays[$counter - 1]['display'];
  304. }
  305. }
  306. }
  307. break;
  308. */
  309. }
  310. if ($row['variable'] == 'pdf_export_watermark_enable') {
  311. $url = PDF::get_watermark($course_code);
  312. $form->addElement('file', 'pdf_export_watermark_path', get_lang('AddWaterMark'));
  313. if ($url != false) {
  314. $delete_url = '<a href="?delete_watermark">'.Display::return_icon('delete.png',get_lang('DelImage')).'</a>';
  315. $form->addElement('html', '<a href="'.$url.'">'.$url.' '.$delete_url.'</a>');
  316. }
  317. $allowed_picture_types = array ('jpg', 'jpeg', 'png', 'gif');
  318. $form->addRule('pdf_export_watermark_path', get_lang('OnlyImagesAllowed').' ('.implode(',', $allowed_picture_types).')', 'filetype', $allowed_picture_types);
  319. }
  320. if ($row['variable'] == 'timezone_value') {
  321. $form->addElement('html', sprintf(get_lang('LocalTimeUsingPortalTimezoneXIsY'),$row['selected_value'],api_get_local_time()));
  322. }
  323. }
  324. $form->addElement('html', '<div style="text-align: right; clear: both;">');
  325. $form->addElement('style_submit_button', null, get_lang('SaveSettings'), 'class="save"');
  326. $form->addElement('html', '</div>');
  327. $form->setDefaults($default_values);
  328. $message = array();
  329. if ($form->validate()) {
  330. $values = $form->exportValues();
  331. $pdf_export_watermark_path = $_FILES['pdf_export_watermark_path'];
  332. if (isset($pdf_export_watermark_path) && !empty($pdf_export_watermark_path['name'])) {
  333. $pdf_export_watermark_path_result = PDF::upload_watermark($pdf_export_watermark_path['name'], $pdf_export_watermark_path['tmp_name']);
  334. if ($pdf_export_watermark_path_result) {
  335. $message['confirmation'][] = get_lang('UplUploadSucceeded');
  336. } else {
  337. $message['warning'][] = get_lang('UplUnableToSaveFile').' '.get_lang('Folder').': '.api_get_path(SYS_CODE_PATH).'default_course_document/images';
  338. }
  339. unset($update_values['pdf_export_watermark_path']);
  340. }
  341. // Set true for allow_message_tool variable if social tool is actived.
  342. if ($values['allow_social_tool'] == 'true') {
  343. $values['allow_message_tool'] = 'true';
  344. }
  345. // quick patch to avoid gradebook_enable's value to be blanked
  346. if ($my_category == 'Gradebook') {
  347. $gb = 'false';
  348. $gb = api_get_setting('gradebook_enable');
  349. }
  350. // The first step is to set all the variables that have type=checkbox of the category
  351. // to false as the checkbox that is unchecked is not in the $_POST data and can
  352. // therefore not be set to false.
  353. // This, however, also means that if the process breaks on the third of five checkboxes, the others
  354. // will be set to false.
  355. $r = api_set_settings_category($my_category, 'false', $_configuration['access_url'], array('checkbox', 'radio'));
  356. // quick patch to avoid gradebook_enable's value to be blanked
  357. if ($my_category == 'Gradebook') {
  358. api_set_setting('gradebook_enable', $gb, null, $my_category, $_configuration['access_url']);
  359. }
  360. //$sql = "UPDATE $table_settings_current SET selected_value='false' WHERE category='$my_category' AND type='checkbox'";
  361. //$result = Database::query($sql);
  362. // Save the settings.
  363. $keys = array();
  364. //$gradebook_score_display_custom_values = array();
  365. foreach ($values as $key => $value) {
  366. // Treat gradebook values in separate function.
  367. //if (strpos($key, 'gradebook_score_display_custom_values') === false) {
  368. if (!is_array($value)) {
  369. $old_value = api_get_setting($key);
  370. switch ($key) {
  371. case 'header_extra_content':
  372. file_put_contents(api_get_path(SYS_PATH).api_get_home_path().'/header_extra_content', $value);
  373. $value = api_get_home_path().'/header_extra_content';
  374. break;
  375. // URL validation for some settings.
  376. case 'InstitutionUrl':
  377. case 'course_validation_terms_and_conditions_url':
  378. $value = trim(Security::remove_XSS($value));
  379. if ($value != '') {
  380. // Here we accept absolute URLs only.
  381. if (strpos($value, '://') === false) {
  382. $value = 'http://'.$value;
  383. }
  384. if (!api_valid_url($value, true)) {
  385. // If the new (non-empty) URL value is invalid, then the old URL value stays.
  386. $value = $old_value;
  387. }
  388. }
  389. // If the new URL value is empty, then it will be stored (i.e. the setting will be deleted).
  390. break;
  391. // Validation against e-mail address for some settings.
  392. case 'emailAdministrator':
  393. $value = trim(Security::remove_XSS($value));
  394. if ($value != '' && !api_valid_email($value)) {
  395. // If the new (non-empty) e-mail address is invalid, then the old e-mail address stays.
  396. // If the new e-mail address is empty, then it will be stored (i.e. the setting will be deleted).
  397. $value = $old_value;
  398. }
  399. break;
  400. }
  401. if ($old_value != $value) $keys[] = $key;
  402. $result = api_set_setting($key, $value, null, null, $_configuration['access_url']);
  403. } else {
  404. $sql = "SELECT subkey FROM $table_settings_current WHERE variable = '$key'";
  405. $res = Database::query($sql);
  406. $subkeys = array();
  407. while ($row_subkeys = Database::fetch_array($res)) {
  408. // If subkey is changed:
  409. if ((isset($value[$row_subkeys['subkey']]) && api_get_setting($key, $row_subkeys['subkey']) == 'false') ||
  410. (!isset($value[$row_subkeys['subkey']]) && api_get_setting($key, $row_subkeys['subkey']) == 'true')) {
  411. $keys[] = $key;
  412. break;
  413. }
  414. }
  415. foreach ($value as $subkey => $subvalue) {
  416. //$sql = "UPDATE $table_settings_current SET selected_value='true' WHERE variable='$key' AND subkey = '$subkey'";
  417. //$result = Database::query($sql);
  418. $result = api_set_setting($key, 'true', $subkey, null, $_configuration['access_url']);
  419. }
  420. }
  421. }
  422. // Add event configuration settings category to the system log.
  423. $user_id = api_get_user_id();
  424. $category = $_GET['category'];
  425. event_system(LOG_CONFIGURATION_SETTINGS_CHANGE, LOG_CONFIGURATION_SETTINGS_CATEGORY, $category, api_get_utc_datetime(), $user_id);
  426. // Add event configuration settings variable to the system log.
  427. if (is_array($keys) && count($keys) > 0) {
  428. foreach ($keys as $variable) {
  429. event_system(LOG_CONFIGURATION_SETTINGS_CHANGE, LOG_CONFIGURATION_SETTINGS_VARIABLE, $variable, api_get_utc_datetime(), $user_id);
  430. }
  431. }
  432. }
  433. }
  434. // Including the header (banner).
  435. Display :: display_header($tool_name);
  436. // The action images.
  437. $action_images['platform'] = 'platform.png';
  438. $action_images['course'] = 'course.png';
  439. $action_images['tools'] = 'tools.png';
  440. $action_images['user'] = 'user.png';
  441. $action_images['gradebook'] = 'gradebook.png';
  442. $action_images['ldap'] = 'ldap.png';
  443. $action_images['security'] = 'security.png';
  444. $action_images['languages'] = 'languages.png';
  445. $action_images['tuning'] = 'tuning.png';
  446. $action_images['plugins'] = 'plugins.png';
  447. $action_images['stylesheets'] = 'stylesheets.png';
  448. $action_images['templates'] = 'template.png';
  449. $action_images['search'] = 'search.png';
  450. $action_images['editor'] = 'html_editor.png';
  451. $action_images['timezones'] = 'timezone.png';
  452. $action_images['extra'] = 'wizard.png';
  453. $action_images['tracking'] = 'statistics.png';
  454. // Grabbing the categories.
  455. $resultcategories = api_get_settings_categories(array('stylesheets', 'Plugins', 'Templates', 'Search'));
  456. echo "<div class=\"actions\">";
  457. foreach ($resultcategories as $row) {
  458. echo "<a href=\"".api_get_self()."?category=".$row['category']."\">".Display::return_icon($action_images[strtolower($row['category'])], api_ucfirst(get_lang($row['category'])),'','32')."</a>";
  459. }
  460. echo "<a href=\"".api_get_self()."?category=Search\">".Display::return_icon($action_images['search'], api_ucfirst(get_lang('Search')),'','32')."</a>";
  461. echo "<a href=\"".api_get_self()."?category=stylesheets\">".Display::return_icon($action_images['stylesheets'], api_ucfirst(get_lang('Stylesheets')),'','32')."</a>";
  462. echo "<a href=\"".api_get_self()."?category=Templates\">".Display::return_icon($action_images['templates'], api_ucfirst(get_lang('Templates')),'','32')."</a>";
  463. echo "<a href=\"".api_get_self()."?category=Plugins\">".Display::return_icon($action_images['plugins'], api_ucfirst(get_lang('Plugins')),'','32')."</a>";
  464. echo "</div>";
  465. if ($watermark_deleted) {
  466. Display :: display_normal_message(get_lang('FileDeleted'));
  467. }
  468. // Displaying the message that the settings have been stored.
  469. if (isset($form) && $form->validate()) {
  470. Display::display_confirmation_message(get_lang('SettingsStored'));
  471. if (is_array($message)) {
  472. foreach($message as $type => $content) {
  473. foreach($content as $msg) {
  474. echo Display::return_message($msg, $type);
  475. }
  476. }
  477. }
  478. }
  479. if (!empty($_GET['category'])) {
  480. switch ($_GET['category']) {
  481. case 'Plugins':
  482. // Displaying the extensions: Plugins.
  483. // This will be available to all the sites (access_urls).
  484. if (isset($_POST['submit_dashboard_plugins'])) {
  485. $affected_rows = DashboardManager::store_dashboard_plugins($_POST);
  486. if ($affected_rows) {
  487. // add event to system log
  488. $user_id = api_get_user_id();
  489. $category = $_GET['category'];
  490. event_system(LOG_CONFIGURATION_SETTINGS_CHANGE, LOG_CONFIGURATION_SETTINGS_CATEGORY, $category, api_get_utc_datetime(), $user_id);
  491. Display :: display_confirmation_message(get_lang('DashboardPluginsHaveBeenUpdatedSucesslly'));
  492. }
  493. }
  494. handle_plugins();
  495. DashboardManager::handle_dashboard_plugins();
  496. break;
  497. case 'stylesheets':
  498. // Displaying the extensions: Stylesheets.
  499. handle_stylesheets();
  500. break;
  501. case 'Search':
  502. handle_search();
  503. break;
  504. case 'Templates':
  505. handle_templates();
  506. break;
  507. default:
  508. $form->display();
  509. }
  510. }
  511. /* FOOTER */
  512. Display :: display_footer();