settings.php 30 KB

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