diagnoser.lib.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. /**
  4. *
  5. * * Class that is responsible for generating diagnostic information about the system
  6. *
  7. *
  8. * @package chamilo.diagnoser
  9. * @author Ivan Tcholakov, 2008, initiall proposal and sample code.
  10. * @author spou595, 2009, implementation for Chamilo 2.x
  11. * @author Julio Montoya <gugli100@gmail.com>, 2010, port to chamilo 1.8.7, Some fixes
  12. *
  13. */
  14. /**
  15. * Diagnoser class
  16. * @package chamilo.diagnoser
  17. */
  18. class Diagnoser
  19. {
  20. /**
  21. * The status's
  22. */
  23. const STATUS_OK = 1;
  24. const STATUS_WARNING = 2;
  25. const STATUS_ERROR = 3;
  26. const STATUS_INFORMATION = 4;
  27. function __construct()
  28. {
  29. }
  30. function show_html()
  31. {
  32. $sections = array('chamilo', 'php', 'mysql', 'webserver');
  33. if (!in_array($_GET['section'], $sections)) {
  34. $current_section = 'chamilo';
  35. } else {
  36. $current_section = $_GET['section'];
  37. }
  38. $html = '<div class="tabbable"><ul class="nav nav-tabs">';
  39. foreach ($sections as $section) {
  40. if ($current_section == $section) {
  41. $html .= '<li class="active">';
  42. } else {
  43. $html .= '<li>';
  44. }
  45. $params['section'] = $section;
  46. $html .= '<a href="system_status.php?section='.$section.'">'.get_lang($section).'</a></li>';
  47. }
  48. $html .= '</ul><div class="tab-pane">';
  49. $data = call_user_func(array($this, 'get_'.$current_section.'_data'));
  50. echo $html;
  51. $table = new SortableTableFromArray($data, 1, 100);
  52. $table->set_header(0, '', false);
  53. $table->set_header(1, get_lang('Section'), false);
  54. $table->set_header(2, get_lang('Setting'), false);
  55. $table->set_header(3, get_lang('Current'), false);
  56. $table->set_header(4, get_lang('Expected'), false);
  57. $table->set_header(5, get_lang('Comment'), false);
  58. $table->display();
  59. echo '</div></div>';
  60. }
  61. /**
  62. * Functions to get the data for the chamilo diagnostics
  63. * @return array of data
  64. */
  65. function get_chamilo_data()
  66. {
  67. $array = array();
  68. $writable_folders = array(
  69. 'archive',
  70. 'courses',
  71. 'home',
  72. 'main/upload/users/',
  73. 'main/default_course_document/images/'
  74. );
  75. foreach ($writable_folders as $index => $folder) {
  76. $writable = is_writable(api_get_path(SYS_PATH).$folder);
  77. $status = $writable ? self :: STATUS_OK : self :: STATUS_ERROR;
  78. $array[] = $this->build_setting(
  79. $status,
  80. '[FILES]',
  81. get_lang('IsWritable').': '.$folder,
  82. 'http://be2.php.net/manual/en/function.is-writable.php',
  83. $writable,
  84. 1,
  85. 'yes_no',
  86. get_lang('DirectoryMustBeWritable')
  87. );
  88. }
  89. $exists = file_exists(api_get_path(SYS_CODE_PATH).'install');
  90. $status = $exists ? self :: STATUS_WARNING : self :: STATUS_OK;
  91. $array[] = $this->build_setting(
  92. $status,
  93. '[FILES]',
  94. get_lang('DirectoryExists').': /install',
  95. 'http://be2.php.net/file_exists',
  96. $exists,
  97. 0,
  98. 'yes_no',
  99. get_lang('DirectoryShouldBeRemoved')
  100. );
  101. $app_version = api_get_setting('chamilo_database_version');
  102. $array[] = $this->build_setting(
  103. self :: STATUS_INFORMATION,
  104. '[DB]',
  105. 'chamilo_database_version',
  106. '#',
  107. $app_version,
  108. 0,
  109. null,
  110. 'Chamilo DB version'
  111. );
  112. return $array;
  113. }
  114. /**
  115. * Functions to get the data for the php diagnostics
  116. * @return array of data
  117. */
  118. function get_php_data()
  119. {
  120. $array = array();
  121. // General Functions
  122. $version = phpversion();
  123. $status = $version > REQUIRED_PHP_VERSION ? self :: STATUS_OK : self :: STATUS_ERROR;
  124. $array[] = $this->build_setting(
  125. $status,
  126. '[PHP]',
  127. 'phpversion()',
  128. 'http://www.php.net/manual/en/function.phpversion.php',
  129. phpversion(),
  130. '>= '.REQUIRED_PHP_VERSION,
  131. null,
  132. get_lang('PHPVersionInfo')
  133. );
  134. $setting = ini_get('output_buffering');
  135. $req_setting = 1;
  136. $status = $setting >= $req_setting ? self :: STATUS_OK : self :: STATUS_ERROR;
  137. $array[] = $this->build_setting(
  138. $status,
  139. '[INI]',
  140. 'output_buffering',
  141. 'http://www.php.net/manual/en/outcontrol.configuration.php#ini.output-buffering',
  142. $setting,
  143. $req_setting,
  144. 'on_off',
  145. get_lang('OutputBufferingInfo')
  146. );
  147. $setting = ini_get('file_uploads');
  148. $req_setting = 1;
  149. $status = $setting == $req_setting ? self :: STATUS_OK : self :: STATUS_ERROR;
  150. $array[] = $this->build_setting(
  151. $status,
  152. '[INI]',
  153. 'file_uploads',
  154. 'http://www.php.net/manual/en/ini.core.php#ini.file-uploads',
  155. $setting,
  156. $req_setting,
  157. 'on_off',
  158. get_lang('FileUploadsInfo')
  159. );
  160. $setting = ini_get('magic_quotes_runtime');
  161. $req_setting = 0;
  162. $status = $setting == $req_setting ? self :: STATUS_OK : self :: STATUS_ERROR;
  163. $array[] = $this->build_setting(
  164. $status,
  165. '[INI]',
  166. 'magic_quotes_runtime',
  167. 'http://www.php.net/manual/en/ini.core.php#ini.magic-quotes-runtime',
  168. $setting,
  169. $req_setting,
  170. 'on_off',
  171. get_lang('MagicQuotesRuntimeInfo')
  172. );
  173. $setting = ini_get('safe_mode');
  174. $req_setting = 0;
  175. $status = $setting == $req_setting ? self :: STATUS_OK : self :: STATUS_WARNING;
  176. $array[] = $this->build_setting(
  177. $status,
  178. '[INI]',
  179. 'safe_mode',
  180. 'http://www.php.net/manual/en/ini.core.php#ini.safe-mode',
  181. $setting,
  182. $req_setting,
  183. 'on_off',
  184. get_lang('SafeModeInfo')
  185. );
  186. $setting = ini_get('register_globals');
  187. $req_setting = 0;
  188. $status = $setting == $req_setting ? self :: STATUS_OK : self :: STATUS_ERROR;
  189. $array[] = $this->build_setting(
  190. $status,
  191. '[INI]',
  192. 'register_globals',
  193. 'http://www.php.net/manual/en/ini.core.php#ini.register-globals',
  194. $setting,
  195. $req_setting,
  196. 'on_off',
  197. get_lang('RegisterGlobalsInfo')
  198. );
  199. $setting = ini_get('short_open_tag');
  200. $req_setting = 0;
  201. $status = $setting == $req_setting ? self :: STATUS_OK : self :: STATUS_WARNING;
  202. $array[] = $this->build_setting(
  203. $status,
  204. '[INI]',
  205. 'short_open_tag',
  206. 'http://www.php.net/manual/en/ini.core.php#ini.short-open-tag',
  207. $setting,
  208. $req_setting,
  209. 'on_off',
  210. get_lang('ShortOpenTagInfo')
  211. );
  212. $setting = ini_get('magic_quotes_gpc');
  213. $req_setting = 0;
  214. $status = $setting == $req_setting ? self :: STATUS_OK : self :: STATUS_ERROR;
  215. $array[] = $this->build_setting(
  216. $status,
  217. '[INI]',
  218. 'magic_quotes_gpc',
  219. 'http://www.php.net/manual/en/ini.core.php#ini.magic_quotes_gpc',
  220. $setting,
  221. $req_setting,
  222. 'on_off',
  223. get_lang('MagicQuotesGpcInfo')
  224. );
  225. $setting = ini_get('display_errors');
  226. $req_setting = 0;
  227. $status = $setting == $req_setting ? self :: STATUS_OK : self :: STATUS_WARNING;
  228. $array[] = $this->build_setting(
  229. $status,
  230. '[INI]',
  231. 'display_errors',
  232. 'http://www.php.net/manual/en/ini.core.php#ini.display_errors',
  233. $setting,
  234. $req_setting,
  235. 'on_off',
  236. get_lang('DisplayErrorsInfo')
  237. );
  238. $setting = ini_get('default_charset');
  239. if ($setting == '') {
  240. $setting = null;
  241. }
  242. $req_setting = null;
  243. $status = $setting == $req_setting ? self :: STATUS_OK : self :: STATUS_ERROR;
  244. $array[] = $this->build_setting(
  245. $status,
  246. '[INI]',
  247. 'default_charset',
  248. 'http://www.php.net/manual/en/ini.core.php#ini.default-charset',
  249. $setting,
  250. $req_setting,
  251. null,
  252. get_lang('DefaultCharsetInfo')
  253. );
  254. $setting = ini_get('max_execution_time');
  255. $req_setting = '300 ('.get_lang('minimum').')';
  256. $status = $setting >= 300 ? self :: STATUS_OK : self :: STATUS_WARNING;
  257. $array[] = $this->build_setting(
  258. $status,
  259. '[INI]',
  260. 'max_execution_time',
  261. 'http://www.php.net/manual/en/ini.core.php#ini.max-execution-time',
  262. $setting,
  263. $req_setting,
  264. null,
  265. get_lang('MaxExecutionTimeInfo')
  266. );
  267. $setting = ini_get('max_input_time');
  268. $req_setting = '300 ('.get_lang('minimum').')';
  269. $status = $setting >= 300 ? self :: STATUS_OK : self :: STATUS_WARNING;
  270. $array[] = $this->build_setting(
  271. $status,
  272. '[INI]',
  273. 'max_input_time',
  274. 'http://www.php.net/manual/en/ini.core.php#ini.max-input-time',
  275. $setting,
  276. $req_setting,
  277. null,
  278. get_lang('MaxInputTimeInfo')
  279. );
  280. $setting = ini_get('memory_limit');
  281. $req_setting = '>= '.REQUIRED_MIN_MEMORY_LIMIT.'M';
  282. $status = self :: STATUS_ERROR;
  283. if ((float)$setting >= REQUIRED_MIN_MEMORY_LIMIT) {
  284. $status = self :: STATUS_OK;
  285. }
  286. $array[] = $this->build_setting(
  287. $status,
  288. '[INI]',
  289. 'memory_limit',
  290. 'http://www.php.net/manual/en/ini.core.php#ini.memory-limit',
  291. $setting,
  292. $req_setting,
  293. null,
  294. get_lang('MemoryLimitInfo')
  295. );
  296. $setting = ini_get('post_max_size');
  297. $req_setting = '>= '.REQUIRED_MIN_POST_MAX_SIZE.'M';
  298. $status = self :: STATUS_ERROR;
  299. if ((float)$setting >= REQUIRED_MIN_POST_MAX_SIZE) {
  300. $status = self :: STATUS_OK;
  301. }
  302. $array[] = $this->build_setting(
  303. $status,
  304. '[INI]',
  305. 'post_max_size',
  306. 'http://www.php.net/manual/en/ini.core.php#ini.post-max-size',
  307. $setting,
  308. $req_setting,
  309. null,
  310. get_lang('PostMaxSizeInfo')
  311. );
  312. $setting = ini_get('upload_max_filesize');
  313. $req_setting = '>= '.REQUIRED_MIN_UPLOAD_MAX_FILESIZE.'M';
  314. $status = self :: STATUS_ERROR;
  315. if ((float)$setting >= REQUIRED_UPLOAD_MAX_FILESIZE) {
  316. $status = self :: STATUS_OK;
  317. }
  318. $array[] = $this->build_setting(
  319. $status,
  320. '[INI]',
  321. 'upload_max_filesize',
  322. 'http://www.php.net/manual/en/ini.core.php#ini.upload_max_filesize',
  323. $setting,
  324. $req_setting,
  325. null,
  326. get_lang('UploadMaxFilesizeInfo')
  327. );
  328. $setting = ini_get('variables_order');
  329. $req_setting = 'GPCS';
  330. $status = $setting == $req_setting ? self :: STATUS_OK : self :: STATUS_ERROR;
  331. $array[] = $this->build_setting(
  332. $status,
  333. '[INI]',
  334. 'variables_order',
  335. 'http://www.php.net/manual/en/ini.core.php#ini.variables-order',
  336. $setting,
  337. $req_setting,
  338. null,
  339. get_lang('VariablesOrderInfo')
  340. );
  341. $setting = ini_get('session.gc_maxlifetime');
  342. $req_setting = '4320';
  343. $status = $setting == $req_setting ? self :: STATUS_OK : self :: STATUS_WARNING;
  344. $array[] = $this->build_setting(
  345. $status,
  346. '[SESSION]',
  347. 'session.gc_maxlifetime',
  348. 'http://www.php.net/manual/en/ini.core.php#session.gc-maxlifetime',
  349. $setting,
  350. $req_setting,
  351. null,
  352. get_lang('SessionGCMaxLifetimeInfo')
  353. );
  354. if (api_check_browscap()) {
  355. $setting = true;
  356. } else {
  357. $setting = false;
  358. }
  359. $req_setting = true;
  360. $status = $setting == $req_setting ? self :: STATUS_OK : self :: STATUS_WARNING;
  361. $array[] = $this->build_setting(
  362. $status,
  363. '[INI]',
  364. 'browscap',
  365. 'http://www.php.net/manual/en/misc.configuration.php#ini.browscap',
  366. $setting,
  367. $req_setting,
  368. 'on_off',
  369. get_lang('BrowscapInfo')
  370. );
  371. //Extensions
  372. $extensions = array(
  373. 'gd' => array(
  374. 'link' => 'http://www.php.net/gd',
  375. 'expected' => 1,
  376. 'comment' => get_lang('ExtensionMustBeLoaded')
  377. ),
  378. 'mysql' => array(
  379. 'link' => 'http://www.php.net/mysql',
  380. 'expected' => 1,
  381. 'comment' => get_lang('ExtensionMustBeLoaded')
  382. ),
  383. 'pcre' => array(
  384. 'link' => 'http://www.php.net/pcre',
  385. 'expected' => 1,
  386. 'comment' => get_lang('ExtensionMustBeLoaded')
  387. ),
  388. 'session' => array(
  389. 'link' => 'http://www.php.net/session',
  390. 'expected' => 1,
  391. 'comment' => get_lang('ExtensionMustBeLoaded')
  392. ),
  393. 'standard' => array(
  394. 'link' => 'http://www.php.net/spl',
  395. 'expected' => 1,
  396. 'comment' => get_lang('ExtensionMustBeLoaded')
  397. ),
  398. 'zlib' => array(
  399. 'link' => 'http://www.php.net/zlib',
  400. 'expected' => 1,
  401. 'comment' => get_lang('ExtensionMustBeLoaded')
  402. ),
  403. 'xsl' => array(
  404. 'link' => 'http://be2.php.net/xsl',
  405. 'expected' => 2,
  406. 'comment' => get_lang('ExtensionShouldBeLoaded')
  407. ),
  408. 'curl' => array(
  409. 'link' => 'http://www.php.net/curl',
  410. 'expected' => 2,
  411. 'comment' => get_lang('ExtensionShouldBeLoaded')
  412. ),
  413. );
  414. foreach ($extensions as $extension => $data) {
  415. $url = $data['link'];
  416. $expected_value = $data['expected'];
  417. $comment = $data['comment'];
  418. $loaded = extension_loaded($extension);
  419. $status = $loaded ? self :: STATUS_OK : self :: STATUS_ERROR;
  420. $array[] = $this->build_setting(
  421. $status,
  422. '[EXTENSION]',
  423. get_lang('LoadedExtension').': '.$extension,
  424. $url,
  425. $loaded,
  426. $expected_value,
  427. 'yes_no_optional',
  428. $comment
  429. );
  430. }
  431. return $array;
  432. }
  433. /**
  434. * Functions to get the data for the mysql diagnostics
  435. * @return array of data
  436. */
  437. function get_mysql_data()
  438. {
  439. $array = array();
  440. // A note: Maybe it would be better if all "MySQL"-like variable names and words on the page to be replaced with "Database"-like ones.
  441. //$array[] = $this->build_setting(self :: STATUS_INFORMATION, '[MySQL]', 'mysql_get_host_info()', 'http://www.php.net/manual/en/function.mysql-get-host-info.php', Database::get_host_info(), null, null, get_lang('MysqlHostInfo'));
  442. ///$array[] = $this->build_setting(self :: STATUS_INFORMATION, '[MySQL]', 'mysql_get_server_info()', 'http://www.php.net/manual/en/function.mysql-get-server-info.php', Database::get_server_info(), null, null, get_lang('MysqlServerInfo'));
  443. //$array[] = $this->build_setting(self :: STATUS_INFORMATION, '[MySQL]', 'mysql_get_proto_info()', 'http://www.php.net/manual/en/function.mysql-get-proto-info.php', Database::get_proto_info(), null, null, get_lang('MysqlProtoInfo'));
  444. //$array[] = $this->build_setting(self :: STATUS_INFORMATION, '[MySQL]', 'mysql_get_client_info()', 'http://www.php.net/manual/en/function.mysql-get-client-info.php', Database::get_client_info(), null, null, get_lang('MysqlClientInfo'));
  445. return $array;
  446. }
  447. /**
  448. * Functions to get the data for the webserver diagnostics
  449. * @return array of data
  450. */
  451. function get_webserver_data()
  452. {
  453. $array = array();
  454. $array[] = $this->build_setting(
  455. self :: STATUS_INFORMATION,
  456. '[SERVER]',
  457. '$_SERVER["SERVER_NAME"]',
  458. 'http://be.php.net/reserved.variables.server',
  459. $_SERVER["SERVER_NAME"],
  460. null,
  461. null,
  462. get_lang('ServerNameInfo')
  463. );
  464. $array[] = $this->build_setting(
  465. self :: STATUS_INFORMATION,
  466. '[SERVER]',
  467. '$_SERVER["SERVER_ADDR"]',
  468. 'http://be.php.net/reserved.variables.server',
  469. $_SERVER["SERVER_ADDR"],
  470. null,
  471. null,
  472. get_lang('ServerAddessInfo')
  473. );
  474. $array[] = $this->build_setting(
  475. self :: STATUS_INFORMATION,
  476. '[SERVER]',
  477. '$_SERVER["SERVER_PORT"]',
  478. 'http://be.php.net/reserved.variables.server',
  479. $_SERVER["SERVER_PORT"],
  480. null,
  481. null,
  482. get_lang('ServerPortInfo')
  483. );
  484. $array[] = $this->build_setting(
  485. self :: STATUS_INFORMATION,
  486. '[SERVER]',
  487. '$_SERVER["SERVER_SOFTWARE"]',
  488. 'http://be.php.net/reserved.variables.server',
  489. $_SERVER["SERVER_SOFTWARE"],
  490. null,
  491. null,
  492. get_lang('ServerSoftwareInfo')
  493. );
  494. $array[] = $this->build_setting(
  495. self :: STATUS_INFORMATION,
  496. '[SERVER]',
  497. '$_SERVER["REMOTE_ADDR"]',
  498. 'http://be.php.net/reserved.variables.server',
  499. $_SERVER["REMOTE_ADDR"],
  500. null,
  501. null,
  502. get_lang('ServerRemoteInfo')
  503. );
  504. $array[] = $this->build_setting(
  505. self :: STATUS_INFORMATION,
  506. '[SERVER]',
  507. '$_SERVER["HTTP_USER_AGENT"]',
  508. 'http://be.php.net/reserved.variables.server',
  509. $_SERVER["HTTP_USER_AGENT"],
  510. null,
  511. null,
  512. get_lang('ServerUserAgentInfo')
  513. );
  514. /*$path = $this->manager->get_url(array('section' => Request :: get('section')));
  515. $request = $_SERVER["REQUEST_URI"];
  516. $status = $request != $path ? self :: STATUS_ERROR : self :: STATUS_OK;
  517. $array[] = $this->build_setting($status, '[SERVER]', '$_SERVER["REQUEST_URI"]', 'http://be.php.net/reserved.variables.server', $request, $path, null, get_lang('RequestURIInfo'));
  518. */
  519. $array[] = $this->build_setting(
  520. self :: STATUS_INFORMATION,
  521. '[SERVER]',
  522. '$_SERVER["SERVER_PROTOCOL"]',
  523. 'http://be.php.net/reserved.variables.server',
  524. $_SERVER["SERVER_PROTOCOL"],
  525. null,
  526. null,
  527. get_lang('ServerProtocolInfo')
  528. );
  529. $array[] = $this->build_setting(
  530. self :: STATUS_INFORMATION,
  531. '[SERVER]',
  532. 'php_uname()',
  533. 'http://be2.php.net/php_uname',
  534. php_uname(),
  535. null,
  536. null,
  537. get_lang('UnameInfo')
  538. );
  539. return $array;
  540. }
  541. /**
  542. * Additional functions needed for fast integration
  543. */
  544. function build_setting(
  545. $status,
  546. $section,
  547. $title,
  548. $url,
  549. $current_value,
  550. $expected_value,
  551. $formatter,
  552. $comment,
  553. $img_path = null
  554. ) {
  555. switch ($status) {
  556. case self :: STATUS_OK :
  557. $img = 'bullet_green.gif';
  558. break;
  559. case self :: STATUS_WARNING :
  560. $img = 'bullet_orange.gif';
  561. break;
  562. case self :: STATUS_ERROR :
  563. $img = 'bullet_red.gif';
  564. break;
  565. case self :: STATUS_INFORMATION :
  566. $img = 'bullet_blue.gif';
  567. break;
  568. }
  569. if (!$img_path) {
  570. $img_path = api_get_path(WEB_IMG_PATH);
  571. }
  572. $image = '<img src="'.$img_path.$img.'" alt="'.$status.'" />';
  573. $url = $this->get_link($title, $url);
  574. $formatted_current_value = $current_value;
  575. $formatted_expected_value = $expected_value;
  576. if ($formatter) {
  577. if (method_exists($this, 'format_'.$formatter)) {
  578. $formatted_current_value = call_user_func(array($this, 'format_'.$formatter), $current_value);
  579. $formatted_expected_value = call_user_func(array($this, 'format_'.$formatter), $expected_value);
  580. }
  581. }
  582. return array($image, $section, $url, $formatted_current_value, $formatted_expected_value, $comment);
  583. }
  584. /**
  585. * Create a link with a url and a title
  586. * @param $title
  587. * @param $url
  588. * @return string the url
  589. */
  590. function get_link($title, $url)
  591. {
  592. return '<a href="'.$url.'" target="about:bank">'.$title.'</a>';
  593. }
  594. function format_yes_no_optional($value)
  595. {
  596. $return = '';
  597. switch ($value) {
  598. case 0:
  599. $return = get_lang('No');
  600. break;
  601. case 1:
  602. $return = get_lang('Yes');
  603. break;
  604. case 2:
  605. $return = get_lang('Optional');
  606. break;
  607. }
  608. return $return;
  609. }
  610. function format_yes_no($value)
  611. {
  612. return $value ? get_lang('Yes') : get_lang('No');
  613. }
  614. function format_on_off($value)
  615. {
  616. $value = intval($value);
  617. if ($value > 1) {
  618. // Greater than 1 values are shown "as-is", they may be interpreted as "On" later.
  619. return $value;
  620. }
  621. // These are the values 'On' and 'Off' used in the php-ini file. Translation (get_lang()) is not needed here.
  622. return $value ? 'On' : 'Off';
  623. }
  624. }