[ Index ] |
PHP Cross Reference of moodle-2.8 |
[Summary view] [Print] [Text view]
1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 /** 18 * Renderer for core_admin subsystem 19 * 20 * @package core 21 * @subpackage admin 22 * @copyright 2011 David Mudrak <[email protected]> 23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 24 */ 25 26 defined('MOODLE_INTERNAL') || die(); 27 28 29 /** 30 * Standard HTML output renderer for core_admin subsystem 31 */ 32 class core_admin_renderer extends plugin_renderer_base { 33 34 /** 35 * Display the 'Do you acknowledge the terms of the GPL' page. The first page 36 * during install. 37 * @return string HTML to output. 38 */ 39 public function install_licence_page() { 40 global $CFG; 41 $output = ''; 42 43 $copyrightnotice = text_to_html(get_string('gpl3')); 44 $copyrightnotice = str_replace('target="_blank"', 'onclick="this.target=\'_blank\'"', $copyrightnotice); // extremely ugly validation hack 45 46 $continue = new single_button(new moodle_url('/admin/index.php', array('lang'=>$CFG->lang, 'agreelicense'=>1)), get_string('continue'), 'get'); 47 48 $output .= $this->header(); 49 $output .= $this->heading('<a href="http://moodle.org">Moodle</a> - Modular Object-Oriented Dynamic Learning Environment'); 50 $output .= $this->heading(get_string('copyrightnotice')); 51 $output .= $this->box($copyrightnotice, 'copyrightnotice'); 52 $output .= html_writer::empty_tag('br'); 53 $output .= $this->confirm(get_string('doyouagree'), $continue, "http://docs.moodle.org/dev/License"); 54 $output .= $this->footer(); 55 56 return $output; 57 } 58 59 /** 60 * Display page explaining proper upgrade process, 61 * there can not be any PHP file leftovers... 62 * 63 * @return string HTML to output. 64 */ 65 public function upgrade_stale_php_files_page() { 66 $output = ''; 67 $output .= $this->header(); 68 $output .= $this->heading(get_string('upgradestalefiles', 'admin')); 69 $output .= $this->box_start('generalbox', 'notice'); 70 $output .= format_text(get_string('upgradestalefilesinfo', 'admin', get_docs_url('Upgrading')), FORMAT_MARKDOWN); 71 $output .= html_writer::empty_tag('br'); 72 $output .= html_writer::tag('div', $this->single_button($this->page->url, get_string('reload'), 'get'), array('class' => 'buttons')); 73 $output .= $this->box_end(); 74 $output .= $this->footer(); 75 76 return $output; 77 } 78 79 /** 80 * Display the 'environment check' page that is displayed during install. 81 * @param int $maturity 82 * @param boolean $envstatus final result of the check (true/false) 83 * @param array $environment_results array of results gathered 84 * @param string $release moodle release 85 * @return string HTML to output. 86 */ 87 public function install_environment_page($maturity, $envstatus, $environment_results, $release) { 88 global $CFG; 89 $output = ''; 90 91 $output .= $this->header(); 92 $output .= $this->maturity_warning($maturity); 93 $output .= $this->heading("Moodle $release"); 94 $output .= $this->release_notes_link(); 95 96 $output .= $this->environment_check_table($envstatus, $environment_results); 97 98 if (!$envstatus) { 99 $output .= $this->upgrade_reload(new moodle_url('/admin/index.php', array('agreelicense' => 1, 'lang' => $CFG->lang))); 100 } else { 101 $output .= $this->notification(get_string('environmentok', 'admin'), 'notifysuccess'); 102 $output .= $this->continue_button(new moodle_url('/admin/index.php', array('agreelicense'=>1, 'confirmrelease'=>1, 'lang'=>$CFG->lang))); 103 } 104 105 $output .= $this->footer(); 106 return $output; 107 } 108 109 /** 110 * Displays the list of plugins with unsatisfied dependencies 111 * 112 * @param double|string|int $version Moodle on-disk version 113 * @param array $failed list of plugins with unsatisfied dependecies 114 * @param moodle_url $reloadurl URL of the page to recheck the dependencies 115 * @return string HTML 116 */ 117 public function unsatisfied_dependencies_page($version, array $failed, moodle_url $reloadurl) { 118 $output = ''; 119 120 $output .= $this->header(); 121 $output .= $this->heading(get_string('pluginscheck', 'admin')); 122 $output .= $this->warning(get_string('pluginscheckfailed', 'admin', array('pluginslist' => implode(', ', array_unique($failed))))); 123 $output .= $this->plugins_check_table(core_plugin_manager::instance(), $version, array('xdep' => true)); 124 $output .= $this->warning(get_string('pluginschecktodo', 'admin')); 125 $output .= $this->continue_button($reloadurl); 126 127 $output .= $this->footer(); 128 129 return $output; 130 } 131 132 /** 133 * Display the 'You are about to upgrade Moodle' page. The first page 134 * during upgrade. 135 * @param string $strnewversion 136 * @param int $maturity 137 * @param string $testsite 138 * @return string HTML to output. 139 */ 140 public function upgrade_confirm_page($strnewversion, $maturity, $testsite) { 141 $output = ''; 142 143 $continueurl = new moodle_url('/admin/index.php', array('confirmupgrade' => 1, 'cache' => 0)); 144 $continue = new single_button($continueurl, get_string('continue'), 'get'); 145 $cancelurl = new moodle_url('/admin/index.php'); 146 147 $output .= $this->header(); 148 $output .= $this->maturity_warning($maturity); 149 $output .= $this->test_site_warning($testsite); 150 $output .= $this->confirm(get_string('upgradesure', 'admin', $strnewversion), $continue, $cancelurl); 151 $output .= $this->footer(); 152 153 return $output; 154 } 155 156 /** 157 * Display the environment page during the upgrade process. 158 * @param string $release 159 * @param boolean $envstatus final result of env check (true/false) 160 * @param array $environment_results array of results gathered 161 * @return string HTML to output. 162 */ 163 public function upgrade_environment_page($release, $envstatus, $environment_results) { 164 global $CFG; 165 $output = ''; 166 167 $output .= $this->header(); 168 $output .= $this->heading("Moodle $release"); 169 $output .= $this->release_notes_link(); 170 $output .= $this->environment_check_table($envstatus, $environment_results); 171 172 if (!$envstatus) { 173 $output .= $this->upgrade_reload(new moodle_url('/admin/index.php'), array('confirmupgrade' => 1, 'cache' => 0)); 174 175 } else { 176 $output .= $this->notification(get_string('environmentok', 'admin'), 'notifysuccess'); 177 178 if (empty($CFG->skiplangupgrade) and current_language() !== 'en') { 179 $output .= $this->box(get_string('langpackwillbeupdated', 'admin'), 'generalbox', 'notice'); 180 } 181 182 $output .= $this->continue_button(new moodle_url('/admin/index.php', array('confirmupgrade' => 1, 'confirmrelease' => 1, 'cache' => 0))); 183 } 184 185 $output .= $this->footer(); 186 187 return $output; 188 } 189 190 /** 191 * Display the upgrade page that lists all the plugins that require attention. 192 * @param core_plugin_manager $pluginman provides information about the plugins. 193 * @param \core\update\checker $checker provides information about available updates. 194 * @param int $version the version of the Moodle code from version.php. 195 * @param bool $showallplugins 196 * @param moodle_url $reloadurl 197 * @param moodle_url $continueurl 198 * @return string HTML to output. 199 */ 200 public function upgrade_plugin_check_page(core_plugin_manager $pluginman, \core\update\checker $checker, 201 $version, $showallplugins, $reloadurl, $continueurl) { 202 global $CFG; 203 204 $output = ''; 205 206 $output .= $this->header(); 207 $output .= $this->box_start('generalbox'); 208 $output .= $this->container_start('generalbox', 'notice'); 209 $output .= html_writer::tag('p', get_string('pluginchecknotice', 'core_plugin')); 210 if (empty($CFG->disableupdatenotifications)) { 211 $output .= $this->container_start('checkforupdates'); 212 $output .= $this->single_button(new moodle_url($reloadurl, array('fetchupdates' => 1)), get_string('checkforupdates', 'core_plugin')); 213 if ($timefetched = $checker->get_last_timefetched()) { 214 $output .= $this->container(get_string('checkforupdateslast', 'core_plugin', 215 userdate($timefetched, get_string('strftimedatetime', 'core_langconfig')))); 216 } 217 $output .= $this->container_end(); 218 } 219 $output .= $this->container_end(); 220 221 $output .= $this->plugins_check_table($pluginman, $version, array('full' => $showallplugins)); 222 $output .= $this->box_end(); 223 $output .= $this->upgrade_reload($reloadurl); 224 225 if ($pluginman->some_plugins_updatable()) { 226 $output .= $this->container_start('upgradepluginsinfo'); 227 $output .= $this->help_icon('upgradepluginsinfo', 'core_admin', get_string('upgradepluginsfirst', 'core_admin')); 228 $output .= $this->container_end(); 229 } 230 231 $button = new single_button($continueurl, get_string('upgradestart', 'admin'), 'get'); 232 $button->class = 'continuebutton'; 233 $output .= $this->render($button); 234 $output .= $this->footer(); 235 236 return $output; 237 } 238 239 /** 240 * Prints a page with a summary of plugin deployment to be confirmed. 241 * 242 * @param \core\update\deployer $deployer 243 * @param array $data deployer's data package as returned by {@link \core\update\deployer::submitted_data()} 244 * @return string 245 */ 246 public function upgrade_plugin_confirm_deploy_page(\core\update\deployer $deployer, array $data) { 247 248 if (!$deployer->initialized()) { 249 throw new coding_exception('Unable to render a page for non-initialized deployer.'); 250 } 251 252 if (empty($data['updateinfo'])) { 253 throw new coding_exception('Missing required data component.'); 254 } 255 256 $updateinfo = $data['updateinfo']; 257 258 $output = ''; 259 $output .= $this->header(); 260 $output .= $this->container_start('generalbox updateplugin', 'notice'); 261 262 $a = new stdClass(); 263 if (get_string_manager()->string_exists('pluginname', $updateinfo->component)) { 264 $a->name = get_string('pluginname', $updateinfo->component); 265 } else { 266 $a->name = $updateinfo->component; 267 } 268 269 if (isset($updateinfo->release)) { 270 $a->version = $updateinfo->release . ' (' . $updateinfo->version . ')'; 271 } else { 272 $a->version = $updateinfo->version; 273 } 274 $a->url = $updateinfo->download; 275 276 $output .= $this->output->heading(get_string('updatepluginconfirm', 'core_plugin')); 277 $output .= $this->output->container(format_text(get_string('updatepluginconfirminfo', 'core_plugin', $a)), 'updatepluginconfirminfo'); 278 $output .= $this->output->container(get_string('updatepluginconfirmwarning', 'core_plugin', 'updatepluginconfirmwarning')); 279 280 if ($repotype = $deployer->plugin_external_source($data['updateinfo'])) { 281 $output .= $this->output->container(get_string('updatepluginconfirmexternal', 'core_plugin', $repotype), 'updatepluginconfirmexternal'); 282 } 283 284 $widget = $deployer->make_execution_widget($data['updateinfo'], $data['returnurl']); 285 $output .= $this->output->render($widget); 286 287 $output .= $this->output->single_button($data['callerurl'], get_string('cancel', 'core'), 'get'); 288 289 $output .= $this->container_end(); 290 $output .= $this->footer(); 291 292 return $output; 293 } 294 295 /** 296 * Display the admin notifications page. 297 * @param int $maturity 298 * @param bool $insecuredataroot warn dataroot is invalid 299 * @param bool $errorsdisplayed warn invalid dispaly error setting 300 * @param bool $cronoverdue warn cron not running 301 * @param bool $dbproblems warn db has problems 302 * @param bool $maintenancemode warn in maintenance mode 303 * @param bool $buggyiconvnomb warn iconv problems 304 * @param array|null $availableupdates array of \core\update\info objects or null 305 * @param int|null $availableupdatesfetch timestamp of the most recent updates fetch or null (unknown) 306 * @param string[] $cachewarnings An array containing warnings from the Cache API. 307 * 308 * @return string HTML to output. 309 */ 310 public function admin_notifications_page($maturity, $insecuredataroot, $errorsdisplayed, 311 $cronoverdue, $dbproblems, $maintenancemode, $availableupdates, $availableupdatesfetch, 312 $buggyiconvnomb, $registered, array $cachewarnings = array()) { 313 global $CFG; 314 $output = ''; 315 316 $output .= $this->header(); 317 $output .= $this->maturity_info($maturity); 318 $output .= empty($CFG->disableupdatenotifications) ? $this->available_updates($availableupdates, $availableupdatesfetch) : ''; 319 $output .= $this->insecure_dataroot_warning($insecuredataroot); 320 $output .= $this->display_errors_warning($errorsdisplayed); 321 $output .= $this->buggy_iconv_warning($buggyiconvnomb); 322 $output .= $this->cron_overdue_warning($cronoverdue); 323 $output .= $this->db_problems($dbproblems); 324 $output .= $this->maintenance_mode_warning($maintenancemode); 325 $output .= $this->cache_warnings($cachewarnings); 326 $output .= $this->registration_warning($registered); 327 328 ////////////////////////////////////////////////////////////////////////////////////////////////// 329 //// IT IS ILLEGAL AND A VIOLATION OF THE GPL TO HIDE, REMOVE OR MODIFY THIS COPYRIGHT NOTICE /// 330 $output .= $this->moodle_copyright(); 331 ////////////////////////////////////////////////////////////////////////////////////////////////// 332 333 $output .= $this->footer(); 334 335 return $output; 336 } 337 338 /** 339 * Display the plugin management page (admin/plugins.php). 340 * 341 * The filtering options array may contain following items: 342 * bool contribonly - show only contributed extensions 343 * bool updatesonly - show only plugins with an available update 344 * 345 * @param core_plugin_manager $pluginman 346 * @param \core\update\checker $checker 347 * @param array $options filtering options 348 * @return string HTML to output. 349 */ 350 public function plugin_management_page(core_plugin_manager $pluginman, \core\update\checker $checker, array $options = array()) { 351 global $CFG; 352 353 $output = ''; 354 355 $output .= $this->header(); 356 $output .= $this->heading(get_string('pluginsoverview', 'core_admin')); 357 $output .= $this->plugins_overview_panel($pluginman, $options); 358 359 if (empty($CFG->disableupdatenotifications)) { 360 $output .= $this->container_start('checkforupdates'); 361 $output .= $this->single_button( 362 new moodle_url($this->page->url, array_merge($options, array('fetchremote' => 1))), 363 get_string('checkforupdates', 'core_plugin') 364 ); 365 if ($timefetched = $checker->get_last_timefetched()) { 366 $output .= $this->container(get_string('checkforupdateslast', 'core_plugin', 367 userdate($timefetched, get_string('strftimedatetime', 'core_langconfig')))); 368 } 369 $output .= $this->container_end(); 370 } 371 372 $output .= $this->box($this->plugins_control_panel($pluginman, $options), 'generalbox'); 373 $output .= $this->footer(); 374 375 return $output; 376 } 377 378 /** 379 * Display a page to confirm the plugin uninstallation. 380 * 381 * @param core_plugin_manager $pluginman 382 * @param \core\plugininfo\base $pluginfo 383 * @param moodle_url $continueurl URL to continue after confirmation 384 * @param moodle_url $cancelurl URL to to go if cancelled 385 * @return string 386 */ 387 public function plugin_uninstall_confirm_page(core_plugin_manager $pluginman, \core\plugininfo\base $pluginfo, moodle_url $continueurl, moodle_url $cancelurl) { 388 $output = ''; 389 390 $pluginname = $pluginman->plugin_name($pluginfo->component); 391 392 $confirm = '<p>' . get_string('uninstallconfirm', 'core_plugin', array('name' => $pluginname)) . '</p>'; 393 if ($extraconfirm = $pluginfo->get_uninstall_extra_warning()) { 394 $confirm .= $extraconfirm; 395 } 396 397 $output .= $this->output->header(); 398 $output .= $this->output->heading(get_string('uninstalling', 'core_plugin', array('name' => $pluginname))); 399 $output .= $this->output->confirm($confirm, $continueurl, $cancelurl); 400 $output .= $this->output->footer(); 401 402 return $output; 403 } 404 405 /** 406 * Display a page with results of plugin uninstallation and offer removal of plugin files. 407 * 408 * @param core_plugin_manager $pluginman 409 * @param \core\plugininfo\base $pluginfo 410 * @param progress_trace_buffer $progress 411 * @param moodle_url $continueurl URL to continue to remove the plugin folder 412 * @return string 413 */ 414 public function plugin_uninstall_results_removable_page(core_plugin_manager $pluginman, \core\plugininfo\base $pluginfo, 415 progress_trace_buffer $progress, moodle_url $continueurl) { 416 $output = ''; 417 418 $pluginname = $pluginman->plugin_name($pluginfo->component); 419 420 // Do not show navigation here, they must click one of the buttons. 421 $this->page->set_pagelayout('maintenance'); 422 $this->page->set_cacheable(false); 423 424 $output .= $this->output->header(); 425 $output .= $this->output->heading(get_string('uninstalling', 'core_plugin', array('name' => $pluginname))); 426 427 $output .= $this->output->box($progress->get_buffer(), 'generalbox uninstallresultmessage'); 428 429 $confirm = $this->output->container(get_string('uninstalldeleteconfirm', 'core_plugin', 430 array('name' => $pluginname, 'rootdir' => $pluginfo->rootdir)), 'uninstalldeleteconfirm'); 431 432 if ($repotype = $pluginman->plugin_external_source($pluginfo->component)) { 433 $confirm .= $this->output->container(get_string('uninstalldeleteconfirmexternal', 'core_plugin', $repotype), 434 'uninstalldeleteconfirmexternal'); 435 } 436 437 // After any uninstall we must execute full upgrade to finish the cleanup! 438 $output .= $this->output->confirm($confirm, $continueurl, new moodle_url('/admin/index.php')); 439 $output .= $this->output->footer(); 440 441 return $output; 442 } 443 444 /** 445 * Display a page with results of plugin uninstallation and inform about the need to remove plugin files manually. 446 * 447 * @param core_plugin_manager $pluginman 448 * @param \core\plugininfo\base $pluginfo 449 * @param progress_trace_buffer $progress 450 * @return string 451 */ 452 public function plugin_uninstall_results_page(core_plugin_manager $pluginman, \core\plugininfo\base $pluginfo, progress_trace_buffer $progress) { 453 $output = ''; 454 455 $pluginname = $pluginfo->component; 456 457 $output .= $this->output->header(); 458 $output .= $this->output->heading(get_string('uninstalling', 'core_plugin', array('name' => $pluginname))); 459 460 $output .= $this->output->box($progress->get_buffer(), 'generalbox uninstallresultmessage'); 461 462 $output .= $this->output->box(get_string('uninstalldelete', 'core_plugin', 463 array('name' => $pluginname, 'rootdir' => $pluginfo->rootdir)), 'generalbox uninstalldelete'); 464 $output .= $this->output->continue_button(new moodle_url('/admin/index.php')); 465 $output .= $this->output->footer(); 466 467 return $output; 468 } 469 470 /** 471 * Display the plugin management page (admin/environment.php). 472 * @param array $versions 473 * @param string $version 474 * @param boolean $envstatus final result of env check (true/false) 475 * @param array $environment_results array of results gathered 476 * @return string HTML to output. 477 */ 478 public function environment_check_page($versions, $version, $envstatus, $environment_results) { 479 $output = ''; 480 $output .= $this->header(); 481 482 // Print the component download link 483 $output .= html_writer::tag('div', html_writer::link( 484 new moodle_url('/admin/environment.php', array('action' => 'updatecomponent', 'sesskey' => sesskey())), 485 get_string('updatecomponent', 'admin')), 486 array('class' => 'reportlink')); 487 488 // Heading. 489 $output .= $this->heading(get_string('environment', 'admin')); 490 491 // Box with info and a menu to choose the version. 492 $output .= $this->box_start(); 493 $output .= html_writer::tag('div', get_string('adminhelpenvironment')); 494 $select = new single_select(new moodle_url('/admin/environment.php'), 'version', $versions, $version, null); 495 $select->label = get_string('moodleversion'); 496 $output .= $this->render($select); 497 $output .= $this->box_end(); 498 499 // The results 500 $output .= $this->environment_check_table($envstatus, $environment_results); 501 502 $output .= $this->footer(); 503 return $output; 504 } 505 506 /** 507 * Output a warning message, of the type that appears on the admin notifications page. 508 * @param string $message the message to display. 509 * @param string $type type class 510 * @return string HTML to output. 511 */ 512 protected function warning($message, $type = 'warning') { 513 return $this->box($message, 'generalbox admin' . $type); 514 } 515 516 /** 517 * Render an appropriate message if dataroot is insecure. 518 * @param bool $insecuredataroot 519 * @return string HTML to output. 520 */ 521 protected function insecure_dataroot_warning($insecuredataroot) { 522 global $CFG; 523 524 if ($insecuredataroot == INSECURE_DATAROOT_WARNING) { 525 return $this->warning(get_string('datarootsecuritywarning', 'admin', $CFG->dataroot)); 526 527 } else if ($insecuredataroot == INSECURE_DATAROOT_ERROR) { 528 return $this->warning(get_string('datarootsecurityerror', 'admin', $CFG->dataroot), 'error'); 529 530 } else { 531 return ''; 532 } 533 } 534 535 /** 536 * Render an appropriate message if dataroot is insecure. 537 * @param bool $errorsdisplayed 538 * @return string HTML to output. 539 */ 540 protected function display_errors_warning($errorsdisplayed) { 541 if (!$errorsdisplayed) { 542 return ''; 543 } 544 545 return $this->warning(get_string('displayerrorswarning', 'admin')); 546 } 547 548 /** 549 * Render an appropriate message if iconv is buggy and mbstring missing. 550 * @param bool $buggyiconvnomb 551 * @return string HTML to output. 552 */ 553 protected function buggy_iconv_warning($buggyiconvnomb) { 554 if (!$buggyiconvnomb) { 555 return ''; 556 } 557 558 return $this->warning(get_string('warningiconvbuggy', 'admin')); 559 } 560 561 /** 562 * Render an appropriate message if cron has not been run recently. 563 * @param bool $cronoverdue 564 * @return string HTML to output. 565 */ 566 public function cron_overdue_warning($cronoverdue) { 567 global $CFG; 568 if (!$cronoverdue) { 569 return ''; 570 } 571 572 if (empty($CFG->cronclionly)) { 573 $url = new moodle_url('/admin/cron.php'); 574 if (!empty($CFG->cronremotepassword)) { 575 $url = new moodle_url('/admin/cron.php', array('password' => $CFG->cronremotepassword)); 576 } 577 578 return $this->warning(get_string('cronwarning', 'admin', $url->out()) . ' ' . 579 $this->help_icon('cron', 'admin')); 580 } 581 582 // $CFG->cronclionly is not empty: cron can run only from CLI. 583 return $this->warning(get_string('cronwarningcli', 'admin') . ' ' . 584 $this->help_icon('cron', 'admin')); 585 } 586 587 /** 588 * Render an appropriate message if there are any problems with the DB set-up. 589 * @param bool $dbproblems 590 * @return string HTML to output. 591 */ 592 public function db_problems($dbproblems) { 593 if (!$dbproblems) { 594 return ''; 595 } 596 597 return $this->warning($dbproblems); 598 } 599 600 /** 601 * Renders cache warnings if there are any. 602 * 603 * @param string[] $cachewarnings 604 * @return string 605 */ 606 public function cache_warnings(array $cachewarnings) { 607 if (!count($cachewarnings)) { 608 return ''; 609 } 610 return join("\n", array_map(array($this, 'warning'), $cachewarnings)); 611 } 612 613 /** 614 * Render an appropriate message if the site in in maintenance mode. 615 * @param bool $maintenancemode 616 * @return string HTML to output. 617 */ 618 public function maintenance_mode_warning($maintenancemode) { 619 if (!$maintenancemode) { 620 return ''; 621 } 622 623 $url = new moodle_url('/admin/settings.php', array('section' => 'maintenancemode')); 624 $url = $url->out(); // get_string() does not support objects in params 625 626 return $this->warning(get_string('sitemaintenancewarning2', 'admin', $url)); 627 } 628 629 /** 630 * Display a warning about installing development code if necesary. 631 * @param int $maturity 632 * @return string HTML to output. 633 */ 634 protected function maturity_warning($maturity) { 635 if ($maturity == MATURITY_STABLE) { 636 return ''; // No worries. 637 } 638 639 $maturitylevel = get_string('maturity' . $maturity, 'admin'); 640 return $this->warning( 641 $this->container(get_string('maturitycorewarning', 'admin', $maturitylevel)) . 642 $this->container($this->doc_link('admin/versions', get_string('morehelp'))), 643 'error'); 644 } 645 646 /* 647 * If necessary, displays a warning about upgrading a test site. 648 * 649 * @param string $testsite 650 * @return string HTML 651 */ 652 protected function test_site_warning($testsite) { 653 654 if (!$testsite) { 655 return ''; 656 } 657 658 $warning = (get_string('testsiteupgradewarning', 'admin', $testsite)); 659 return $this->warning($warning, 'error'); 660 } 661 662 /** 663 * Output the copyright notice. 664 * @return string HTML to output. 665 */ 666 protected function moodle_copyright() { 667 global $CFG; 668 669 ////////////////////////////////////////////////////////////////////////////////////////////////// 670 //// IT IS ILLEGAL AND A VIOLATION OF THE GPL TO HIDE, REMOVE OR MODIFY THIS COPYRIGHT NOTICE /// 671 $copyrighttext = '<a href="http://moodle.org/">Moodle</a> '. 672 '<a href="http://docs.moodle.org/dev/Releases" title="'.$CFG->version.'">'.$CFG->release.'</a><br />'. 673 'Copyright © 1999 onwards, Martin Dougiamas<br />'. 674 'and <a href="http://moodle.org/dev">many other contributors</a>.<br />'. 675 '<a href="http://docs.moodle.org/dev/License">GNU Public License</a>'; 676 ////////////////////////////////////////////////////////////////////////////////////////////////// 677 678 return $this->box($copyrighttext, 'copyright'); 679 } 680 681 /** 682 * Display a warning about installing development code if necesary. 683 * @param int $maturity 684 * @return string HTML to output. 685 */ 686 protected function maturity_info($maturity) { 687 if ($maturity == MATURITY_STABLE) { 688 return ''; // No worries. 689 } 690 691 $level = 'warning'; 692 693 if ($maturity == MATURITY_ALPHA) { 694 $level = 'error'; 695 } 696 697 $maturitylevel = get_string('maturity' . $maturity, 'admin'); 698 $warningtext = get_string('maturitycoreinfo', 'admin', $maturitylevel); 699 $warningtext .= ' ' . $this->doc_link('admin/versions', get_string('morehelp')); 700 return $this->warning($warningtext, $level); 701 } 702 703 /** 704 * Displays the info about available Moodle core and plugin updates 705 * 706 * The structure of the $updates param has changed since 2.4. It contains not only updates 707 * for the core itself, but also for all other installed plugins. 708 * 709 * @param array|null $updates array of (string)component => array of \core\update\info objects or null 710 * @param int|null $fetch timestamp of the most recent updates fetch or null (unknown) 711 * @return string 712 */ 713 protected function available_updates($updates, $fetch) { 714 715 $updateinfo = ''; 716 $someupdateavailable = false; 717 if (is_array($updates)) { 718 if (is_array($updates['core'])) { 719 $someupdateavailable = true; 720 $updateinfo .= $this->heading(get_string('updateavailable', 'core_admin'), 3); 721 foreach ($updates['core'] as $update) { 722 $updateinfo .= $this->moodle_available_update_info($update); 723 } 724 } 725 unset($updates['core']); 726 // If something has left in the $updates array now, it is updates for plugins. 727 if (!empty($updates)) { 728 $someupdateavailable = true; 729 $updateinfo .= $this->heading(get_string('updateavailableforplugin', 'core_admin'), 3); 730 $pluginsoverviewurl = new moodle_url('/admin/plugins.php', array('updatesonly' => 1)); 731 $updateinfo .= $this->container(get_string('pluginsoverviewsee', 'core_admin', 732 array('url' => $pluginsoverviewurl->out()))); 733 } 734 } 735 736 if (!$someupdateavailable) { 737 $now = time(); 738 if ($fetch and ($fetch <= $now) and ($now - $fetch < HOURSECS)) { 739 $updateinfo .= $this->heading(get_string('updateavailablenot', 'core_admin'), 3); 740 } 741 } 742 743 $updateinfo .= $this->container_start('checkforupdates'); 744 $fetchurl = new moodle_url('/admin/index.php', array('fetchupdates' => 1, 'sesskey' => sesskey(), 'cache' => 0)); 745 $updateinfo .= $this->single_button($fetchurl, get_string('checkforupdates', 'core_plugin')); 746 if ($fetch) { 747 $updateinfo .= $this->container(get_string('checkforupdateslast', 'core_plugin', 748 userdate($fetch, get_string('strftimedatetime', 'core_langconfig')))); 749 } 750 $updateinfo .= $this->container_end(); 751 752 return $this->warning($updateinfo); 753 } 754 755 /** 756 * Display a warning about not being registered on Moodle.org if necesary. 757 * 758 * @param boolean $registered true if the site is registered on Moodle.org 759 * @return string HTML to output. 760 */ 761 protected function registration_warning($registered) { 762 763 if (!$registered) { 764 765 $registerbutton = $this->single_button(new moodle_url('/admin/registration/register.php', 766 array('huburl' => HUB_MOODLEORGHUBURL, 'hubname' => 'Moodle.org')), 767 get_string('register', 'admin')); 768 769 return $this->warning( get_string('registrationwarning', 'admin') 770 . ' ' . $this->help_icon('registration', 'admin') . $registerbutton ); 771 } 772 773 return ''; 774 } 775 776 /** 777 * Helper method to render the information about the available Moodle update 778 * 779 * @param \core\update\info $updateinfo information about the available Moodle core update 780 */ 781 protected function moodle_available_update_info(\core\update\info $updateinfo) { 782 783 $boxclasses = 'moodleupdateinfo'; 784 $info = array(); 785 786 if (isset($updateinfo->release)) { 787 $info[] = html_writer::tag('span', get_string('updateavailable_release', 'core_admin', $updateinfo->release), 788 array('class' => 'info release')); 789 } 790 791 if (isset($updateinfo->version)) { 792 $info[] = html_writer::tag('span', get_string('updateavailable_version', 'core_admin', $updateinfo->version), 793 array('class' => 'info version')); 794 } 795 796 if (isset($updateinfo->maturity)) { 797 $info[] = html_writer::tag('span', get_string('maturity'.$updateinfo->maturity, 'core_admin'), 798 array('class' => 'info maturity')); 799 $boxclasses .= ' maturity'.$updateinfo->maturity; 800 } 801 802 if (isset($updateinfo->download)) { 803 $info[] = html_writer::link($updateinfo->download, get_string('download'), array('class' => 'info download')); 804 } 805 806 if (isset($updateinfo->url)) { 807 $info[] = html_writer::link($updateinfo->url, get_string('updateavailable_moreinfo', 'core_plugin'), 808 array('class' => 'info more')); 809 } 810 811 $box = $this->output->box_start($boxclasses); 812 $box .= $this->output->box(implode(html_writer::tag('span', ' ', array('class' => 'separator')), $info), ''); 813 $box .= $this->output->box_end(); 814 815 return $box; 816 } 817 818 /** 819 * Display a link to the release notes. 820 * @return string HTML to output. 821 */ 822 protected function release_notes_link() { 823 $releasenoteslink = get_string('releasenoteslink', 'admin', 'http://docs.moodle.org/dev/Releases'); 824 $releasenoteslink = str_replace('target="_blank"', 'onclick="this.target=\'_blank\'"', $releasenoteslink); // extremely ugly validation hack 825 return $this->box($releasenoteslink, 'generalbox releasenoteslink'); 826 } 827 828 /** 829 * Display the reload link that appears on several upgrade/install pages. 830 * @return string HTML to output. 831 */ 832 function upgrade_reload($url) { 833 return html_writer::empty_tag('br') . 834 html_writer::tag('div', 835 html_writer::link($url, $this->pix_icon('i/reload', '', '', array('class' => 'icon icon-pre')) . 836 get_string('reload'), array('title' => get_string('reload'))), 837 array('class' => 'continuebutton')) . html_writer::empty_tag('br'); 838 } 839 840 /** 841 * Displays all known plugins and information about their installation or upgrade 842 * 843 * This default implementation renders all plugins into one big table. The rendering 844 * options support: 845 * (bool)full = false: whether to display up-to-date plugins, too 846 * (bool)xdep = false: display the plugins with unsatisified dependecies only 847 * 848 * @param core_plugin_manager $pluginman provides information about the plugins. 849 * @param int $version the version of the Moodle code from version.php. 850 * @param array $options rendering options 851 * @return string HTML code 852 */ 853 public function plugins_check_table(core_plugin_manager $pluginman, $version, array $options = array()) { 854 global $CFG; 855 856 $plugininfo = $pluginman->get_plugins(); 857 858 if (empty($plugininfo)) { 859 return ''; 860 } 861 862 $options['full'] = isset($options['full']) ? (bool)$options['full'] : false; 863 $options['xdep'] = isset($options['xdep']) ? (bool)$options['xdep'] : false; 864 865 $table = new html_table(); 866 $table->id = 'plugins-check'; 867 $table->head = array( 868 get_string('displayname', 'core_plugin'), 869 get_string('rootdir', 'core_plugin'), 870 get_string('source', 'core_plugin'), 871 get_string('versiondb', 'core_plugin'), 872 get_string('versiondisk', 'core_plugin'), 873 get_string('requires', 'core_plugin'), 874 get_string('status', 'core_plugin'), 875 ); 876 $table->colclasses = array( 877 'displayname', 'rootdir', 'source', 'versiondb', 'versiondisk', 'requires', 'status', 878 ); 879 $table->data = array(); 880 881 $numofhighlighted = array(); // number of highlighted rows per this subsection 882 883 foreach ($plugininfo as $type => $plugins) { 884 885 $header = new html_table_cell($pluginman->plugintype_name_plural($type)); 886 $header->header = true; 887 $header->colspan = count($table->head); 888 $header = new html_table_row(array($header)); 889 $header->attributes['class'] = 'plugintypeheader type-' . $type; 890 891 $numofhighlighted[$type] = 0; 892 893 if (empty($plugins) and $options['full']) { 894 $msg = new html_table_cell(get_string('noneinstalled', 'core_plugin')); 895 $msg->colspan = count($table->head); 896 $row = new html_table_row(array($msg)); 897 $row->attributes['class'] .= 'msg msg-noneinstalled'; 898 $table->data[] = $header; 899 $table->data[] = $row; 900 continue; 901 } 902 903 $plugintyperows = array(); 904 905 foreach ($plugins as $name => $plugin) { 906 $row = new html_table_row(); 907 $row->attributes['class'] = 'type-' . $plugin->type . ' name-' . $plugin->type . '_' . $plugin->name; 908 909 if ($this->page->theme->resolve_image_location('icon', $plugin->type . '_' . $plugin->name, null)) { 910 $icon = $this->output->pix_icon('icon', '', $plugin->type . '_' . $plugin->name, array('class' => 'smallicon pluginicon')); 911 } else { 912 $icon = $this->output->pix_icon('spacer', '', 'moodle', array('class' => 'smallicon pluginicon noicon')); 913 } 914 $displayname = $icon . ' ' . $plugin->displayname; 915 $displayname = new html_table_cell($displayname); 916 917 $rootdir = new html_table_cell($plugin->get_dir()); 918 919 if ($isstandard = $plugin->is_standard()) { 920 $row->attributes['class'] .= ' standard'; 921 $source = new html_table_cell(get_string('sourcestd', 'core_plugin')); 922 } else { 923 $row->attributes['class'] .= ' extension'; 924 $source = new html_table_cell(get_string('sourceext', 'core_plugin')); 925 } 926 927 $versiondb = new html_table_cell($plugin->versiondb); 928 $versiondisk = new html_table_cell($plugin->versiondisk); 929 930 $statuscode = $plugin->get_status(); 931 $row->attributes['class'] .= ' status-' . $statuscode; 932 $status = get_string('status_' . $statuscode, 'core_plugin'); 933 934 $availableupdates = $plugin->available_updates(); 935 if (!empty($availableupdates) and empty($CFG->disableupdatenotifications)) { 936 foreach ($availableupdates as $availableupdate) { 937 $status .= $this->plugin_available_update_info($availableupdate); 938 } 939 } 940 941 $status = new html_table_cell($status); 942 943 $requires = new html_table_cell($this->required_column($plugin, $pluginman, $version)); 944 945 $statusisboring = in_array($statuscode, array( 946 core_plugin_manager::PLUGIN_STATUS_NODB, core_plugin_manager::PLUGIN_STATUS_UPTODATE)); 947 948 $coredependency = $plugin->is_core_dependency_satisfied($version); 949 $otherpluginsdependencies = $pluginman->are_dependencies_satisfied($plugin->get_other_required_plugins()); 950 $dependenciesok = $coredependency && $otherpluginsdependencies; 951 952 if ($options['xdep']) { 953 // we want to see only plugins with failed dependencies 954 if ($dependenciesok) { 955 continue; 956 } 957 958 } else if ($statusisboring and $dependenciesok and empty($availableupdates)) { 959 // no change is going to happen to the plugin - display it only 960 // if the user wants to see the full list 961 if (empty($options['full'])) { 962 continue; 963 } 964 } 965 966 // ok, the plugin should be displayed 967 $numofhighlighted[$type]++; 968 969 $row->cells = array($displayname, $rootdir, $source, 970 $versiondb, $versiondisk, $requires, $status); 971 $plugintyperows[] = $row; 972 } 973 974 if (empty($numofhighlighted[$type]) and empty($options['full'])) { 975 continue; 976 } 977 978 $table->data[] = $header; 979 $table->data = array_merge($table->data, $plugintyperows); 980 } 981 982 $sumofhighlighted = array_sum($numofhighlighted); 983 984 if ($options['xdep']) { 985 // we do not want to display no heading and links in this mode 986 $out = ''; 987 988 } else if ($sumofhighlighted == 0) { 989 $out = $this->output->container_start('nonehighlighted', 'plugins-check-info'); 990 $out .= $this->output->heading(get_string('nonehighlighted', 'core_plugin')); 991 if (empty($options['full'])) { 992 $out .= html_writer::link(new moodle_url('/admin/index.php', 993 array('confirmupgrade' => 1, 'confirmrelease' => 1, 'showallplugins' => 1, 'cache' => 0)), 994 get_string('nonehighlightedinfo', 'core_plugin')); 995 } 996 $out .= $this->output->container_end(); 997 998 } else { 999 $out = $this->output->container_start('somehighlighted', 'plugins-check-info'); 1000 $out .= $this->output->heading(get_string('somehighlighted', 'core_plugin', $sumofhighlighted)); 1001 if (empty($options['full'])) { 1002 $out .= html_writer::link(new moodle_url('/admin/index.php', 1003 array('confirmupgrade' => 1, 'confirmrelease' => 1, 'showallplugins' => 1, 'cache' => 0)), 1004 get_string('somehighlightedinfo', 'core_plugin')); 1005 } else { 1006 $out .= html_writer::link(new moodle_url('/admin/index.php', 1007 array('confirmupgrade' => 1, 'confirmrelease' => 1, 'showallplugins' => 0, 'cache' => 0)), 1008 get_string('somehighlightedonly', 'core_plugin')); 1009 } 1010 $out .= $this->output->container_end(); 1011 } 1012 1013 if ($sumofhighlighted > 0 or $options['full']) { 1014 $out .= html_writer::table($table); 1015 } 1016 1017 return $out; 1018 } 1019 1020 /** 1021 * Formats the information that needs to go in the 'Requires' column. 1022 * @param \core\plugininfo\base $plugin the plugin we are rendering the row for. 1023 * @param core_plugin_manager $pluginman provides data on all the plugins. 1024 * @param string $version 1025 * @return string HTML code 1026 */ 1027 protected function required_column(\core\plugininfo\base $plugin, core_plugin_manager $pluginman, $version) { 1028 $requires = array(); 1029 1030 if (!empty($plugin->versionrequires)) { 1031 if ($plugin->versionrequires <= $version) { 1032 $class = 'requires-ok'; 1033 } else { 1034 $class = 'requires-failed'; 1035 } 1036 $requires[] = html_writer::tag('li', 1037 get_string('moodleversion', 'core_plugin', $plugin->versionrequires), 1038 array('class' => $class)); 1039 } 1040 1041 foreach ($plugin->get_other_required_plugins() as $component => $requiredversion) { 1042 $otherplugin = $pluginman->get_plugin_info($component); 1043 $actions = array(); 1044 1045 if (is_null($otherplugin)) { 1046 // The required plugin is not installed. 1047 $class = 'requires-failed requires-missing'; 1048 $installurl = new moodle_url('https://moodle.org/plugins/view.php', array('plugin' => $component)); 1049 $uploadurl = new moodle_url('/admin/tool/installaddon/'); 1050 $actions[] = html_writer::link($installurl, get_string('dependencyinstall', 'core_plugin')); 1051 $actions[] = html_writer::link($uploadurl, get_string('dependencyupload', 'core_plugin')); 1052 1053 } else if ($requiredversion != ANY_VERSION and $otherplugin->versiondisk < $requiredversion) { 1054 // The required plugin is installed but needs to be updated. 1055 $class = 'requires-failed requires-outdated'; 1056 if (!$otherplugin->is_standard()) { 1057 $updateurl = new moodle_url($this->page->url, array('sesskey' => sesskey(), 'fetchupdates' => 1)); 1058 $actions[] = html_writer::link($updateurl, get_string('checkforupdates', 'core_plugin')); 1059 } 1060 1061 } else { 1062 // Already installed plugin with sufficient version. 1063 $class = 'requires-ok'; 1064 } 1065 1066 if ($requiredversion != ANY_VERSION) { 1067 $str = 'otherpluginversion'; 1068 } else { 1069 $str = 'otherplugin'; 1070 } 1071 1072 $requires[] = html_writer::tag('li', 1073 html_writer::div(get_string($str, 'core_plugin', 1074 array('component' => $component, 'version' => $requiredversion)), 'component'). 1075 html_writer::div(implode(' | ', $actions), 'actions'), 1076 array('class' => $class)); 1077 } 1078 1079 if (!$requires) { 1080 return ''; 1081 } 1082 return html_writer::tag('ul', implode("\n", $requires)); 1083 } 1084 1085 /** 1086 * Prints an overview about the plugins - number of installed, number of extensions etc. 1087 * 1088 * @param core_plugin_manager $pluginman provides information about the plugins 1089 * @param array $options filtering options 1090 * @return string as usually 1091 */ 1092 public function plugins_overview_panel(core_plugin_manager $pluginman, array $options = array()) { 1093 global $CFG; 1094 1095 $plugininfo = $pluginman->get_plugins(); 1096 1097 $numtotal = $numdisabled = $numextension = $numupdatable = 0; 1098 1099 foreach ($plugininfo as $type => $plugins) { 1100 foreach ($plugins as $name => $plugin) { 1101 if ($plugin->get_status() === core_plugin_manager::PLUGIN_STATUS_MISSING) { 1102 continue; 1103 } 1104 $numtotal++; 1105 if ($plugin->is_enabled() === false) { 1106 $numdisabled++; 1107 } 1108 if (!$plugin->is_standard()) { 1109 $numextension++; 1110 } 1111 if (empty($CFG->disableupdatenotifications) and $plugin->available_updates()) { 1112 $numupdatable++; 1113 } 1114 } 1115 } 1116 1117 $info = array(); 1118 $filter = array(); 1119 $somefilteractive = false; 1120 $info[] = html_writer::tag('span', get_string('numtotal', 'core_plugin', $numtotal), array('class' => 'info total')); 1121 $info[] = html_writer::tag('span', get_string('numdisabled', 'core_plugin', $numdisabled), array('class' => 'info disabled')); 1122 $info[] = html_writer::tag('span', get_string('numextension', 'core_plugin', $numextension), array('class' => 'info extension')); 1123 if ($numextension > 0) { 1124 if (empty($options['contribonly'])) { 1125 $filter[] = html_writer::link( 1126 new moodle_url($this->page->url, array('contribonly' => 1)), 1127 get_string('filtercontribonly', 'core_plugin'), 1128 array('class' => 'filter-item show-contribonly') 1129 ); 1130 } else { 1131 $filter[] = html_writer::tag('span', get_string('filtercontribonlyactive', 'core_plugin'), 1132 array('class' => 'filter-item active show-contribonly')); 1133 $somefilteractive = true; 1134 } 1135 } 1136 if ($numupdatable > 0) { 1137 $info[] = html_writer::tag('span', get_string('numupdatable', 'core_plugin', $numupdatable), array('class' => 'info updatable')); 1138 if (empty($options['updatesonly'])) { 1139 $filter[] = html_writer::link( 1140 new moodle_url($this->page->url, array('updatesonly' => 1)), 1141 get_string('filterupdatesonly', 'core_plugin'), 1142 array('class' => 'filter-item show-updatesonly') 1143 ); 1144 } else { 1145 $filter[] = html_writer::tag('span', get_string('filterupdatesonlyactive', 'core_plugin'), 1146 array('class' => 'filter-item active show-updatesonly')); 1147 $somefilteractive = true; 1148 } 1149 } 1150 if ($somefilteractive) { 1151 $filter[] = html_writer::link($this->page->url, get_string('filterall', 'core_plugin'), array('class' => 'filter-item show-all')); 1152 } 1153 1154 $output = $this->output->box(implode(html_writer::tag('span', ' ', array('class' => 'separator')), $info), '', 'plugins-overview-panel'); 1155 1156 if (!empty($filter)) { 1157 $output .= $this->output->box(implode(html_writer::tag('span', ' ', array('class' => 'separator')), $filter), '', 'plugins-overview-filter'); 1158 } 1159 1160 return $output; 1161 } 1162 1163 /** 1164 * Displays all known plugins and links to manage them 1165 * 1166 * This default implementation renders all plugins into one big table. 1167 * 1168 * @param core_plugin_manager $pluginman provides information about the plugins. 1169 * @param array $options filtering options 1170 * @return string HTML code 1171 */ 1172 public function plugins_control_panel(core_plugin_manager $pluginman, array $options = array()) { 1173 global $CFG; 1174 1175 $plugininfo = $pluginman->get_plugins(); 1176 1177 // Filter the list of plugins according the options. 1178 if (!empty($options['updatesonly'])) { 1179 $updateable = array(); 1180 foreach ($plugininfo as $plugintype => $pluginnames) { 1181 foreach ($pluginnames as $pluginname => $pluginfo) { 1182 if (!empty($pluginfo->availableupdates)) { 1183 foreach ($pluginfo->availableupdates as $pluginavailableupdate) { 1184 if ($pluginavailableupdate->version > $pluginfo->versiondisk) { 1185 $updateable[$plugintype][$pluginname] = $pluginfo; 1186 } 1187 } 1188 } 1189 } 1190 } 1191 $plugininfo = $updateable; 1192 } 1193 1194 if (!empty($options['contribonly'])) { 1195 $contribs = array(); 1196 foreach ($plugininfo as $plugintype => $pluginnames) { 1197 foreach ($pluginnames as $pluginname => $pluginfo) { 1198 if (!$pluginfo->is_standard()) { 1199 $contribs[$plugintype][$pluginname] = $pluginfo; 1200 } 1201 } 1202 } 1203 $plugininfo = $contribs; 1204 } 1205 1206 if (empty($plugininfo)) { 1207 return ''; 1208 } 1209 1210 $table = new html_table(); 1211 $table->id = 'plugins-control-panel'; 1212 $table->head = array( 1213 get_string('displayname', 'core_plugin'), 1214 get_string('source', 'core_plugin'), 1215 get_string('version', 'core_plugin'), 1216 get_string('release', 'core_plugin'), 1217 get_string('availability', 'core_plugin'), 1218 get_string('actions', 'core_plugin'), 1219 get_string('notes','core_plugin'), 1220 ); 1221 $table->headspan = array(1, 1, 1, 1, 1, 2, 1); 1222 $table->colclasses = array( 1223 'pluginname', 'source', 'version', 'release', 'availability', 'settings', 'uninstall', 'notes' 1224 ); 1225 1226 foreach ($plugininfo as $type => $plugins) { 1227 $heading = $pluginman->plugintype_name_plural($type); 1228 $pluginclass = core_plugin_manager::resolve_plugininfo_class($type); 1229 if ($manageurl = $pluginclass::get_manage_url()) { 1230 $heading = html_writer::link($manageurl, $heading); 1231 } 1232 $header = new html_table_cell(html_writer::tag('span', $heading, array('id'=>'plugin_type_cell_'.$type))); 1233 $header->header = true; 1234 $header->colspan = array_sum($table->headspan); 1235 $header = new html_table_row(array($header)); 1236 $header->attributes['class'] = 'plugintypeheader type-' . $type; 1237 $table->data[] = $header; 1238 1239 if (empty($plugins)) { 1240 $msg = new html_table_cell(get_string('noneinstalled', 'core_plugin')); 1241 $msg->colspan = array_sum($table->headspan); 1242 $row = new html_table_row(array($msg)); 1243 $row->attributes['class'] .= 'msg msg-noneinstalled'; 1244 $table->data[] = $row; 1245 continue; 1246 } 1247 1248 foreach ($plugins as $name => $plugin) { 1249 $row = new html_table_row(); 1250 $row->attributes['class'] = 'type-' . $plugin->type . ' name-' . $plugin->type . '_' . $plugin->name; 1251 1252 if ($this->page->theme->resolve_image_location('icon', $plugin->type . '_' . $plugin->name)) { 1253 $icon = $this->output->pix_icon('icon', '', $plugin->type . '_' . $plugin->name, array('class' => 'icon pluginicon')); 1254 } else { 1255 $icon = $this->output->pix_icon('spacer', '', 'moodle', array('class' => 'icon pluginicon noicon')); 1256 } 1257 $status = $plugin->get_status(); 1258 $row->attributes['class'] .= ' status-'.$status; 1259 if ($status === core_plugin_manager::PLUGIN_STATUS_MISSING) { 1260 $msg = html_writer::tag('span', get_string('status_missing', 'core_plugin'), array('class' => 'statusmsg')); 1261 } else if ($status === core_plugin_manager::PLUGIN_STATUS_NEW) { 1262 $msg = html_writer::tag('span', get_string('status_new', 'core_plugin'), array('class' => 'statusmsg')); 1263 } else { 1264 $msg = ''; 1265 } 1266 $pluginname = html_writer::tag('div', $icon . '' . $plugin->displayname . ' ' . $msg, array('class' => 'displayname')). 1267 html_writer::tag('div', $plugin->component, array('class' => 'componentname')); 1268 $pluginname = new html_table_cell($pluginname); 1269 1270 if ($plugin->is_standard()) { 1271 $row->attributes['class'] .= ' standard'; 1272 $source = new html_table_cell(get_string('sourcestd', 'core_plugin')); 1273 } else { 1274 $row->attributes['class'] .= ' extension'; 1275 $source = new html_table_cell(get_string('sourceext', 'core_plugin')); 1276 } 1277 1278 $version = new html_table_cell($plugin->versiondb); 1279 $release = new html_table_cell($plugin->release); 1280 1281 $isenabled = $plugin->is_enabled(); 1282 if (is_null($isenabled)) { 1283 $availability = new html_table_cell(''); 1284 } else if ($isenabled) { 1285 $row->attributes['class'] .= ' enabled'; 1286 $availability = new html_table_cell(get_string('pluginenabled', 'core_plugin')); 1287 } else { 1288 $row->attributes['class'] .= ' disabled'; 1289 $availability = new html_table_cell(get_string('plugindisabled', 'core_plugin')); 1290 } 1291 1292 $settingsurl = $plugin->get_settings_url(); 1293 if (!is_null($settingsurl)) { 1294 $settings = html_writer::link($settingsurl, get_string('settings', 'core_plugin'), array('class' => 'settings')); 1295 } else { 1296 $settings = ''; 1297 } 1298 $settings = new html_table_cell($settings); 1299 1300 if ($uninstallurl = $pluginman->get_uninstall_url($plugin->component, 'overview')) { 1301 $uninstall = html_writer::link($uninstallurl, get_string('uninstall', 'core_plugin')); 1302 } else { 1303 $uninstall = ''; 1304 } 1305 $uninstall = new html_table_cell($uninstall); 1306 1307 $requriedby = $pluginman->other_plugins_that_require($plugin->component); 1308 if ($requriedby) { 1309 $requiredby = html_writer::tag('div', get_string('requiredby', 'core_plugin', implode(', ', $requriedby)), 1310 array('class' => 'requiredby')); 1311 } else { 1312 $requiredby = ''; 1313 } 1314 1315 $updateinfo = ''; 1316 if (empty($CFG->disableupdatenotifications) and is_array($plugin->available_updates())) { 1317 foreach ($plugin->available_updates() as $availableupdate) { 1318 $updateinfo .= $this->plugin_available_update_info($availableupdate); 1319 } 1320 } 1321 1322 $notes = new html_table_cell($requiredby.$updateinfo); 1323 1324 $row->cells = array( 1325 $pluginname, $source, $version, $release, $availability, $settings, $uninstall, $notes 1326 ); 1327 $table->data[] = $row; 1328 } 1329 } 1330 1331 return html_writer::table($table); 1332 } 1333 1334 /** 1335 * Helper method to render the information about the available plugin update 1336 * 1337 * The passed objects always provides at least the 'version' property containing 1338 * the (higher) version of the plugin available. 1339 * 1340 * @param \core\update\info $updateinfo information about the available update for the plugin 1341 */ 1342 protected function plugin_available_update_info(\core\update\info $updateinfo) { 1343 1344 $boxclasses = 'pluginupdateinfo'; 1345 $info = array(); 1346 1347 if (isset($updateinfo->release)) { 1348 $info[] = html_writer::tag('span', get_string('updateavailable_release', 'core_plugin', $updateinfo->release), 1349 array('class' => 'info release')); 1350 } 1351 1352 if (isset($updateinfo->maturity)) { 1353 $info[] = html_writer::tag('span', get_string('maturity'.$updateinfo->maturity, 'core_admin'), 1354 array('class' => 'info maturity')); 1355 $boxclasses .= ' maturity'.$updateinfo->maturity; 1356 } 1357 1358 if (isset($updateinfo->download)) { 1359 $info[] = html_writer::link($updateinfo->download, get_string('download'), array('class' => 'info download')); 1360 } 1361 1362 if (isset($updateinfo->url)) { 1363 $info[] = html_writer::link($updateinfo->url, get_string('updateavailable_moreinfo', 'core_plugin'), 1364 array('class' => 'info more')); 1365 } 1366 1367 $box = $this->output->box_start($boxclasses); 1368 $box .= html_writer::tag('div', get_string('updateavailable', 'core_plugin', $updateinfo->version), array('class' => 'version')); 1369 $box .= $this->output->box(implode(html_writer::tag('span', ' ', array('class' => 'separator')), $info), ''); 1370 1371 $deployer = \core\update\deployer::instance(); 1372 if ($deployer->initialized()) { 1373 $impediments = $deployer->deployment_impediments($updateinfo); 1374 if (empty($impediments)) { 1375 $widget = $deployer->make_confirm_widget($updateinfo); 1376 $box .= $this->output->render($widget); 1377 } else { 1378 if (isset($impediments['notwritable'])) { 1379 $box .= $this->output->help_icon('notwritable', 'core_plugin', get_string('notwritable', 'core_plugin')); 1380 } 1381 if (isset($impediments['notdownloadable'])) { 1382 $box .= $this->output->help_icon('notdownloadable', 'core_plugin', get_string('notdownloadable', 'core_plugin')); 1383 } 1384 } 1385 } 1386 1387 $box .= $this->output->box_end(); 1388 1389 return $box; 1390 } 1391 1392 /** 1393 * This function will render one beautiful table with all the environmental 1394 * configuration and how it suits Moodle needs. 1395 * 1396 * @param boolean $result final result of the check (true/false) 1397 * @param environment_results[] $environment_results array of results gathered 1398 * @return string HTML to output. 1399 */ 1400 public function environment_check_table($result, $environment_results) { 1401 global $CFG; 1402 1403 // Table headers 1404 $servertable = new html_table();//table for server checks 1405 $servertable->head = array( 1406 get_string('name'), 1407 get_string('info'), 1408 get_string('report'), 1409 get_string('plugin'), 1410 get_string('status'), 1411 ); 1412 $servertable->colclasses = array('centeralign name', 'centeralign info', 'leftalign report', 'leftalign plugin', 'centeralign status'); 1413 $servertable->attributes['class'] = 'admintable environmenttable generaltable'; 1414 $servertable->id = 'serverstatus'; 1415 1416 $serverdata = array('ok'=>array(), 'warn'=>array(), 'error'=>array()); 1417 1418 $othertable = new html_table();//table for custom checks 1419 $othertable->head = array( 1420 get_string('info'), 1421 get_string('report'), 1422 get_string('plugin'), 1423 get_string('status'), 1424 ); 1425 $othertable->colclasses = array('aligncenter info', 'alignleft report', 'alignleft plugin', 'aligncenter status'); 1426 $othertable->attributes['class'] = 'admintable environmenttable generaltable'; 1427 $othertable->id = 'otherserverstatus'; 1428 1429 $otherdata = array('ok'=>array(), 'warn'=>array(), 'error'=>array()); 1430 1431 // Iterate over each environment_result 1432 $continue = true; 1433 foreach ($environment_results as $environment_result) { 1434 $errorline = false; 1435 $warningline = false; 1436 $stringtouse = ''; 1437 if ($continue) { 1438 $type = $environment_result->getPart(); 1439 $info = $environment_result->getInfo(); 1440 $status = $environment_result->getStatus(); 1441 $plugin = $environment_result->getPluginName(); 1442 $error_code = $environment_result->getErrorCode(); 1443 // Process Report field 1444 $rec = new stdClass(); 1445 // Something has gone wrong at parsing time 1446 if ($error_code) { 1447 $stringtouse = 'environmentxmlerror'; 1448 $rec->error_code = $error_code; 1449 $status = get_string('error'); 1450 $errorline = true; 1451 $continue = false; 1452 } 1453 1454 if ($continue) { 1455 if ($rec->needed = $environment_result->getNeededVersion()) { 1456 // We are comparing versions 1457 $rec->current = $environment_result->getCurrentVersion(); 1458 if ($environment_result->getLevel() == 'required') { 1459 $stringtouse = 'environmentrequireversion'; 1460 } else { 1461 $stringtouse = 'environmentrecommendversion'; 1462 } 1463 1464 } else if ($environment_result->getPart() == 'custom_check') { 1465 // We are checking installed & enabled things 1466 if ($environment_result->getLevel() == 'required') { 1467 $stringtouse = 'environmentrequirecustomcheck'; 1468 } else { 1469 $stringtouse = 'environmentrecommendcustomcheck'; 1470 } 1471 1472 } else if ($environment_result->getPart() == 'php_setting') { 1473 if ($status) { 1474 $stringtouse = 'environmentsettingok'; 1475 } else if ($environment_result->getLevel() == 'required') { 1476 $stringtouse = 'environmentmustfixsetting'; 1477 } else { 1478 $stringtouse = 'environmentshouldfixsetting'; 1479 } 1480 1481 } else { 1482 if ($environment_result->getLevel() == 'required') { 1483 $stringtouse = 'environmentrequireinstall'; 1484 } else { 1485 $stringtouse = 'environmentrecommendinstall'; 1486 } 1487 } 1488 1489 // Calculate the status value 1490 if ($environment_result->getBypassStr() != '') { //Handle bypassed result (warning) 1491 $status = get_string('bypassed'); 1492 $warningline = true; 1493 } else if ($environment_result->getRestrictStr() != '') { //Handle restricted result (error) 1494 $status = get_string('restricted'); 1495 $errorline = true; 1496 } else { 1497 if ($status) { //Handle ok result (ok) 1498 $status = get_string('ok'); 1499 } else { 1500 if ($environment_result->getLevel() == 'optional') {//Handle check result (warning) 1501 $status = get_string('check'); 1502 $warningline = true; 1503 } else { //Handle error result (error) 1504 $status = get_string('check'); 1505 $errorline = true; 1506 } 1507 } 1508 } 1509 } 1510 1511 // Build the text 1512 $linkparts = array(); 1513 $linkparts[] = 'admin/environment'; 1514 $linkparts[] = $type; 1515 if (!empty($info)){ 1516 $linkparts[] = $info; 1517 } 1518 // Plugin environments do not have docs pages yet. 1519 if (empty($CFG->docroot) or $environment_result->plugin) { 1520 $report = get_string($stringtouse, 'admin', $rec); 1521 } else { 1522 $report = $this->doc_link(join($linkparts, '/'), get_string($stringtouse, 'admin', $rec)); 1523 } 1524 1525 // Format error or warning line 1526 if ($errorline || $warningline) { 1527 $messagetype = $errorline? 'error':'warn'; 1528 } else { 1529 $messagetype = 'ok'; 1530 } 1531 $status = '<span class="'.$messagetype.'">'.$status.'</span>'; 1532 // Here we'll store all the feedback found 1533 $feedbacktext = ''; 1534 // Append the feedback if there is some 1535 $feedbacktext .= $environment_result->strToReport($environment_result->getFeedbackStr(), $messagetype); 1536 //Append the bypass if there is some 1537 $feedbacktext .= $environment_result->strToReport($environment_result->getBypassStr(), 'warn'); 1538 //Append the restrict if there is some 1539 $feedbacktext .= $environment_result->strToReport($environment_result->getRestrictStr(), 'error'); 1540 1541 $report .= $feedbacktext; 1542 1543 // Add the row to the table 1544 if ($environment_result->getPart() == 'custom_check'){ 1545 $otherdata[$messagetype][] = array ($info, $report, $plugin, $status); 1546 } else { 1547 $serverdata[$messagetype][] = array ($type, $info, $report, $plugin, $status); 1548 } 1549 } 1550 } 1551 1552 //put errors first in 1553 $servertable->data = array_merge($serverdata['error'], $serverdata['warn'], $serverdata['ok']); 1554 $othertable->data = array_merge($otherdata['error'], $otherdata['warn'], $otherdata['ok']); 1555 1556 // Print table 1557 $output = ''; 1558 $output .= $this->heading(get_string('serverchecks', 'admin')); 1559 $output .= html_writer::table($servertable); 1560 if (count($othertable->data)){ 1561 $output .= $this->heading(get_string('customcheck', 'admin')); 1562 $output .= html_writer::table($othertable); 1563 } 1564 1565 // Finally, if any error has happened, print the summary box 1566 if (!$result) { 1567 $output .= $this->box(get_string('environmenterrortodo', 'admin'), 'environmentbox errorbox'); 1568 } 1569 1570 return $output; 1571 } 1572 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 20:29:05 2014 | Cross-referenced by PHPXref 0.7.1 |