From 3776335ce21bf249be58ea2ebf5ae15c9ff983fa Mon Sep 17 00:00:00 2001 From: Marina Glancy Date: Thu, 18 Oct 2012 16:03:11 +0800 Subject: [PATCH] MDL-35260 Course formats may have settings, be enabled, disabled and uninstalled --- admin/courseformats.php | 131 ++++++++++++++++++++++++++++ admin/settings/courses.php | 5 +- admin/settings/plugins.php | 9 ++ course/edit_form.php | 13 ++- course/format/formatlegacy.php | 18 +++- course/format/lib.php | 16 +++- course/format/upgrade.txt | 1 + course/lib.php | 29 +++++++ lang/en/admin.php | 7 ++ lang/en/error.php | 1 + lang/en/moodle.php | 3 +- lib/adminlib.php | 151 +++++++++++++++++++++++++++++++++ lib/moodlelib.php | 3 +- lib/pluginlib.php | 58 +++++++++++++ 14 files changed, 432 insertions(+), 13 deletions(-) create mode 100644 admin/courseformats.php diff --git a/admin/courseformats.php b/admin/courseformats.php new file mode 100644 index 0000000000000..11a5eabab0c3b --- /dev/null +++ b/admin/courseformats.php @@ -0,0 +1,131 @@ +. + +/** + * Allows the admin to enable, disable and uninstall course formats + * + * @package core_admin + * @copyright 2012 Marina Glancy + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +require_once('../config.php'); +require_once($CFG->libdir.'/adminlib.php'); +require_once($CFG->libdir.'/pluginlib.php'); + +$action = required_param('action', PARAM_ALPHANUMEXT); +$formatname = required_param('format', PARAM_PLUGIN); +$confirm = optional_param('confirm', 0, PARAM_BOOL); + +$syscontext = context_system::instance(); +$PAGE->set_url('/admin/courseformats.php'); +$PAGE->set_context($syscontext); + +require_login(); +require_capability('moodle/site:config', $syscontext); +require_sesskey(); + +$return = new moodle_url('/admin/settings.php', array('section' => 'manageformats')); + +$allplugins = plugin_manager::instance()->get_plugins(); +$formatplugins = $allplugins['format']; +$sortorder = array_flip(array_keys($formatplugins)); + +if (!isset($formatplugins[$formatname])) { + print_error('courseformatnotfound', 'error', $return, $formatname); +} + +switch ($action) { + case 'disable': + if ($formatplugins[$formatname]->is_enabled()) { + if (get_config('moodlecourse', 'format') === $formatname) { + print_error('cannotdisableformat', 'error', $return); + } + set_config('disabled', 1, 'format_'. $formatname); + } + break; + case 'enable': + if (!$formatplugins[$formatname]->is_enabled()) { + unset_config('disabled', 'format_'. $formatname); + } + break; + case 'up': + if ($sortorder[$formatname]) { + $currentindex = $sortorder[$formatname]; + $seq = array_keys($formatplugins); + $seq[$currentindex] = $seq[$currentindex-1]; + $seq[$currentindex-1] = $formatname; + set_config('format_plugins_sortorder', implode(',', $seq)); + } + break; + case 'down': + if ($sortorder[$formatname] < count($sortorder)-1) { + $currentindex = $sortorder[$formatname]; + $seq = array_keys($formatplugins); + $seq[$currentindex] = $seq[$currentindex+1]; + $seq[$currentindex+1] = $formatname; + set_config('format_plugins_sortorder', implode(',', $seq)); + } + break; + case 'uninstall': + echo $OUTPUT->header(); + echo $OUTPUT->heading(get_string('courseformats', 'moodle')); + + $coursecount = $DB->count_records('course', array('format' => $formatname)); + if ($coursecount) { + // Check that default format is set. It will be used to convert courses + // using this format + $defaultformat = get_config('moodlecourse', 'format'); + $defaultformat = $formatplugins[get_config('moodlecourse', 'format')]; + if (!$defaultformat) { + echo $OUTPUT->error_text(get_string('defaultformatnotset', 'admin')); + echo $OUTPUT->footer(); + exit; + } + } + + $format = $formatplugins[$formatname]; + $deleteurl = $format->get_uninstall_url(); + if (!$deleteurl) { + // somebody was trying to cheat and type non-existing link + echo $OUTPUT->error_text(get_string('cannotuninstall', 'admin', $format->displayname)); + echo $OUTPUT->footer(); + exit; + } + + if (!$confirm) { + if ($coursecount) { + $message = get_string('formatuninstallwithcourses', 'admin', + (object)array('count' => $coursecount, 'format' => $format->displayname, + 'defaultformat' => $defaultformat->displayname)); + } else { + $message = get_string('formatuninstallconfirm', 'admin', $format->displayname); + } + $deleteurl->param('confirm', 1); + echo $OUTPUT->confirm($message, $deleteurl, $return); + } else { + $a = new stdClass(); + $a->plugin = $format->displayname; + $a->directory = $format->rootdir; + uninstall_plugin('format', $formatname); + echo $OUTPUT->notification(get_string('formatuninstalled', 'admin', $a), 'notifysuccess'); + echo $OUTPUT->continue_button($return); + } + + echo $OUTPUT->footer(); + exit; +} +redirect($return); \ No newline at end of file diff --git a/admin/settings/courses.php b/admin/settings/courses.php index 363bfb11743c8..b68a10a1f84d1 100644 --- a/admin/settings/courses.php +++ b/admin/settings/courses.php @@ -15,9 +15,10 @@ /// NOTE: these settings must be applied after all other settings because they depend on them ///main course settings $temp = new admin_settingpage('coursesettings', new lang_string('coursesettings')); - $courseformats = get_plugin_list('format'); + require_once($CFG->dirroot.'/course/lib.php'); + $courseformats = get_sorted_course_formats(true); $formcourseformats = array(); - foreach ($courseformats as $courseformat => $courseformatdir) { + foreach ($courseformats as $courseformat) { $formcourseformats[$courseformat] = new lang_string('pluginname', "format_$courseformat"); } $temp->add(new admin_setting_configselect('moodlecourse/format', new lang_string('format'), new lang_string('coursehelpformat'), 'weeks',$formcourseformats)); diff --git a/admin/settings/plugins.php b/admin/settings/plugins.php index 8d290287fa92e..4d9365c51918c 100644 --- a/admin/settings/plugins.php +++ b/admin/settings/plugins.php @@ -20,6 +20,15 @@ // hidden script for converting journals to online assignments (or something like that) linked from elsewhere $ADMIN->add('modsettings', new admin_externalpage('oacleanup', 'Online Assignment Cleanup', $CFG->wwwroot.'/'.$CFG->admin.'/oacleanup.php', 'moodle/site:config', true)); + // course formats + $ADMIN->add('modules', new admin_category('formatsettings', new lang_string('courseformats'))); + $temp = new admin_settingpage('manageformats', new lang_string('manageformats', 'core_admin')); + $temp->add(new admin_setting_manageformats()); + $ADMIN->add('formatsettings', $temp); + foreach ($allplugins['format'] as $format) { + $format->load_settings($ADMIN, 'formatsettings', $hassiteconfig); + } + // blocks $ADMIN->add('modules', new admin_category('blocksettings', new lang_string('blocks'))); $ADMIN->add('blocksettings', new admin_page_manageblocks()); diff --git a/course/edit_form.php b/course/edit_form.php index 70b709a997886..34dbe12fa2791 100644 --- a/course/edit_form.php +++ b/course/edit_form.php @@ -113,11 +113,20 @@ function definition() { $mform->hardFreeze('summary_editor'); } - $courseformats = get_plugin_list('format'); + $courseformats = get_sorted_course_formats(true); $formcourseformats = array(); - foreach ($courseformats as $courseformat => $formatdir) { + foreach ($courseformats as $courseformat) { $formcourseformats[$courseformat] = get_string('pluginname', "format_$courseformat"); } + if (isset($course->format)) { + $course->format = course_get_format($course)->get_format(); // replace with default if not found + if (!in_array($course->format, $courseformats)) { + // this format is disabled. Still display it in the dropdown + $formcourseformats[$course->format] = get_string('withdisablednote', 'moodle', + get_string('pluginname', 'format_'.$course->format)); + } + } + $mform->addElement('select', 'format', get_string('format'), $formcourseformats); $mform->addHelpButton('format', 'format'); $mform->setDefault('format', $courseconfig->format); diff --git a/course/format/formatlegacy.php b/course/format/formatlegacy.php index 838c6fc84033f..82af2372df2bd 100644 --- a/course/format/formatlegacy.php +++ b/course/format/formatlegacy.php @@ -339,9 +339,21 @@ public function update_course_format_options($data, $oldcourse = null) { if ($oldcourse !== null) { $data = (array)$data; $oldcourse = (array)$oldcourse; - foreach ($this->course_format_options() as $key => $unused) { - if (array_key_exists($key, $oldcourse) && !array_key_exists($key, $data)) { - $data[$key] = $oldcourse[$key]; + $options = $this->course_format_options(); + foreach ($options as $key => $unused) { + if (!array_key_exists($key, $data)) { + if (array_key_exists($key, $oldcourse)) { + $data[$key] = $oldcourse[$key]; + } else if ($key === 'numsections') { + // If previous format does not have the field 'numsections' and this one does, + // and $data['numsections'] is not set fill it with the maximum section number from the DB + $maxsection = $DB->get_field_sql('SELECT max(section) from {course_sections} + WHERE course = ?', array($this->courseid)); + if ($maxsection) { + // If there are no sections, or just default 0-section, 'numsections' will be set to default + $data['numsections'] = $maxsection; + } + } } } } diff --git a/course/format/lib.php b/course/format/lib.php index 234f2e4ddc37a..80a381b84bf7c 100644 --- a/course/format/lib.php +++ b/course/format/lib.php @@ -97,13 +97,21 @@ protected static final function get_format_or_default($format) { if ($format === 'site') { return $format; } - $plugins = get_plugin_list('format'); // TODO MDL-35260 filter only enabled - if (isset($plugins[$format])) { + $plugins = get_sorted_course_formats(); + if (in_array($format, $plugins)) { return $format; } // Else return default format - $defaultformat = reset($plugins); // TODO MDL-35260 get default format from config - debugging('Format plugin format_'.$format.' is not found or is not enabled. Using default format_'.$defaultformat, DEBUG_DEVELOPER); + $defaultformat = get_config('moodlecourse', 'format'); + if (!in_array($defaultformat, $plugins)) { + // when default format is not set correctly, use the first available format + $defaultformat = reset($plugins); + } + static $warningprinted = array(); + if (empty($warningprinted[$format])) { + debugging('Format plugin format_'.$format.' is not found. Using default format_'.$defaultformat, DEBUG_DEVELOPER); + $warningprinted[$format] = true; + } return $defaultformat; } diff --git a/course/format/upgrade.txt b/course/format/upgrade.txt index 6beb68bb834f6..f14a8912052cc 100644 --- a/course/format/upgrade.txt +++ b/course/format/upgrade.txt @@ -12,6 +12,7 @@ format. functions callback_XXXX_request_key() are no longer used (where XXXX is the course format name) * functions get_generic_section_name(), get_all_sections(), add_mod_to_section(), get_all_mods() are deprecated. See their phpdocs in lib/deprecatedlib.php on how to replace them +* Course formats may now have their settings.php file as the most of other plugin types === 2.3 === diff --git a/course/lib.php b/course/lib.php index a772578334c28..2fc4b681c2f82 100644 --- a/course/lib.php +++ b/course/lib.php @@ -4512,6 +4512,35 @@ function include_course_ajax($course, $usedmodules = array(), $enabledmodules = return true; } +/** + * Returns the sorted list of available course formats, filtered by enabled if necessary + * + * @param bool $enabledonly return only formats that are enabled + * @return array array of sorted format names + */ +function get_sorted_course_formats($enabledonly = false) { + global $CFG; + $formats = get_plugin_list('format'); + + if (!empty($CFG->format_plugins_sortorder)) { + $order = explode(',', $CFG->format_plugins_sortorder); + $order = array_merge(array_intersect($order, array_keys($formats)), + array_diff(array_keys($formats), $order)); + } else { + $order = array_keys($formats); + } + if (!$enabledonly) { + return $order; + } + $sortedformats = array(); + foreach ($order as $formatname) { + if (!get_config('format_'.$formatname, 'disabled')) { + $sortedformats[] = $formatname; + } + } + return $sortedformats; +} + /** * The URL to use for the specified course (with section) * diff --git a/lang/en/admin.php b/lang/en/admin.php index 208f556deabf7..dbf755f111de3 100644 --- a/lang/en/admin.php +++ b/lang/en/admin.php @@ -95,6 +95,7 @@ $string['calendarsettings'] = 'Calendar'; $string['calendar_weekend'] = 'Weekend days'; $string['cannotdeletemodfilter'] = 'You cannot uninstall the \'{$a->filter}\' because it is part of the \'{$a->module}\' module.'; +$string['cannotuninstall'] = '{$a} can not be uninstalled.'; $string['cfgwwwrootslashwarning'] = 'You have defined $CFG->wwwroot incorrectly in your config.php file. You have included a \'/\' character at the end. Please remove it, or you will experience strange bugs like MDL-11061.'; $string['cfgwwwrootwarning'] = 'You have defined $CFG->wwwroot incorrectly in your config.php file. It does not match the URL you are using to access this page. Please correct it, or you will experience strange bugs like MDL-11061.'; $string['clamfailureonupload'] = 'On clam AV failure'; @@ -417,6 +418,7 @@ $string['debugvalidators'] = 'Show validator links'; $string['defaultcity'] = 'Default city'; $string['defaultcity_help'] = 'A city entered here will be the default city when creating new user accounts.'; +$string['defaultformatnotset'] = 'Error determining default course format. Please check site settings.'; $string['defaulthomepage'] = 'Default home page for users'; $string['defaultrequestcategory'] = 'Default category for course requests'; $string['defaultsettinginfo'] = 'Default: {$a}'; @@ -533,6 +535,9 @@ $string['forceloginforprofileimage_help'] = 'If enabled, users must login in order to view user profile pictures and the default user picture will be used in all notification emails.'; $string['forceloginforprofiles'] = 'Force users to login for profiles'; $string['forcetimezone'] = 'Force default timezone'; +$string['formatuninstallwithcourses'] = 'There are {$a->count} courses using {$a->format}. Their format will be changed to {$a->defaultformat} (default format for this site). Some format-specific data may be lost. Are you sure you want to proceed?'; +$string['formatuninstallconfirm'] = '{$a} will be uninstalled. No courses currently use it. Continue?'; +$string['formatuninstalled'] = 'All data associated with the format plugin \'{$a->plugin}\' has been deleted from the database. To complete the deletion (and prevent the plugin re-installing itself), you should now delete this directory from your server: {$a->directory}'; $string['frontpage'] = 'Front page'; $string['frontpagebackup'] = 'Front page backup'; $string['frontpagedefaultrole'] = 'Default frontpage role'; @@ -641,6 +646,8 @@ $string['maintenancemode'] = 'In maintenance mode'; $string['maintfileopenerror'] = 'Error opening maintenance files!'; $string['maintinprogress'] = 'Maintenance is in progress...'; +$string['manageformats'] = 'Manage course formats'; +$string['manageformatsgotosettings'] = 'Default format can be changed in {$a}'; $string['managelang'] = 'Manage'; $string['managelicenses'] = 'Manage licences'; $string['manageqbehaviours'] = 'Manage question behaviours'; diff --git a/lang/en/error.php b/lang/en/error.php index bf9e294fe0720..543a49f315816 100644 --- a/lang/en/error.php +++ b/lang/en/error.php @@ -65,6 +65,7 @@ $string['cannotdeleterole'] = 'It cannot be deleted, because {$a}'; $string['cannotdeleterolewithid'] = 'Could not delete role with ID {$a}'; $string['cannotdeletethisrole'] = 'You cannot delete this role because it is used by the system, or because it is the last role with administrator capabilities.'; +$string['cannotdisableformat'] = 'You can not disable the default format'; $string['cannotdownloadcomponents'] = 'Cannot download components'; $string['cannotdownloadlanguageupdatelist'] = 'Cannot download list of language updates from download.moodle.org'; $string['cannotdownloadzipfile'] = 'Cannot download ZIP file'; diff --git a/lang/en/moodle.php b/lang/en/moodle.php index 960eac4e3ea82..16430f767ef24 100644 --- a/lang/en/moodle.php +++ b/lang/en/moodle.php @@ -297,7 +297,7 @@ $string['coursecreators'] = 'Course creator'; $string['coursecreatorsdescription'] = 'Course creators can create new courses.'; $string['coursedisplay'] = 'Course layout'; -$string['coursedisplay_help'] = 'This setting determines whether the whole course is displayed on one page or split over several pages. The setting has no affect on certain course formats, such as SCORM format.'; +$string['coursedisplay_help'] = 'This setting determines whether the whole course is displayed on one page or split over several pages.'; $string['coursedisplay_single'] = 'Show all sections on one page'; $string['coursedisplay_multi'] = 'Show one section per page'; $string['coursedeleted'] = 'Deleted course {$a}'; @@ -1805,6 +1805,7 @@ $string['whattodo'] = 'What to do'; $string['windowclosing'] = 'This window should close automatically. If not, please close it now.'; $string['withchosenfiles'] = 'With chosen files'; +$string['withdisablednote'] = '{$a} (disabled)'; $string['withoutuserdata'] = 'without user data'; $string['withselectedusers'] = 'With selected users...'; $string['withselectedusers_help'] = '* Send message - For sending a message to one or more participants diff --git a/lib/adminlib.php b/lib/adminlib.php index 3813b4d46dd58..9ed45e1128e7f 100644 --- a/lib/adminlib.php +++ b/lib/adminlib.php @@ -266,6 +266,16 @@ function uninstall_plugin($type, $name) { // Delete block $DB->delete_records('block', array('id'=>$block->id)); } + } else if ($type === 'format') { + if (($defaultformat = get_config('moodlecourse', 'format')) && $defaultformat !== $name) { + $courses = $DB->get_records('course', array('format' => $name), 'id'); + $data = (object)array('id' => null, 'format' => $defaultformat); + foreach ($courses as $record) { + $data->id = $record->id; + update_course($data); + } + } + $DB->delete_records('course_format_options', array('format' => $name)); } // perform clean-up task common for all the plugin/subplugin types @@ -5897,6 +5907,147 @@ public function output_html($data, $query='') { } } +/** + * Course formats manager. Allows to enable/disable formats and jump to settings + */ +class admin_setting_manageformats extends admin_setting { + + /** + * Calls parent::__construct with specific arguments + */ + public function __construct() { + $this->nosave = true; + parent::__construct('formatsui', new lang_string('manageformats', 'core_admin'), '', ''); + } + + /** + * Always returns true + * + * @return true + */ + public function get_setting() { + return true; + } + + /** + * Always returns true + * + * @return true + */ + public function get_defaultsetting() { + return true; + } + + /** + * Always returns '' and doesn't write anything + * + * @param mixed $data string or array, must not be NULL + * @return string Always returns '' + */ + public function write_setting($data) { + // do not write any setting + return ''; + } + + /** + * Search to find if Query is related to format plugin + * + * @param string $query The string to search for + * @return bool true for related false for not + */ + public function is_related($query) { + if (parent::is_related($query)) { + return true; + } + $allplugins = plugin_manager::instance()->get_plugins(); + $formats = $allplugins['format']; + foreach ($formats as $format) { + if (strpos($format->component, $query) !== false || + strpos(textlib::strtolower($format->displayname), $query) !== false) { + return true; + } + } + return false; + } + + /** + * Return XHTML to display control + * + * @param mixed $data Unused + * @param string $query + * @return string highlight + */ + public function output_html($data, $query='') { + global $CFG, $OUTPUT; + $return = ''; + $return = $OUTPUT->heading(new lang_string('courseformats'), 3, 'main'); + $return .= $OUTPUT->box_start('generalbox formatsui'); + + $allplugins = plugin_manager::instance()->get_plugins(); + $formats = $allplugins['format']; + + // display strings + $txt = get_strings(array('settings', 'name', 'enable', 'disable', 'up', 'down', 'default', 'delete')); + $txt->updown = "$txt->up/$txt->down"; + + $table = new html_table(); + $table->head = array($txt->name, $txt->enable, $txt->updown, $txt->delete, $txt->settings); + $table->align = array('left', 'center', 'center', 'center', 'center'); + $table->width = '90%'; + $table->attributes['class'] = 'manageformattable generaltable'; + $table->data = array(); + + $cnt = 0; + $defaultformat = get_config('moodlecourse', 'format'); + $spacer = $OUTPUT->pix_icon('spacer', '', 'moodle', array('class' => 'icon')); + foreach ($formats as $format) { + $url = new moodle_url('/admin/courseformats.php', + array('sesskey' => sesskey(), 'format' => $format->name)); + $isdefault = ''; + if ($format->is_enabled()) { + $strformatname = html_writer::tag('span', $format->displayname); + if ($defaultformat === $format->name) { + $hideshow = $txt->default; + } else { + $hideshow = html_writer::link($url->out(false, array('action' => 'disable')), + $OUTPUT->pix_icon('i/hide', $txt->disable, 'moodle', array('class' => 'icon'))); + } + } else { + $strformatname = html_writer::tag('span', $format->displayname, array('class' => 'dimmed_text')); + $hideshow = html_writer::link($url->out(false, array('action' => 'enable')), + $OUTPUT->pix_icon('i/show', $txt->enable, 'moodle', array('class' => 'icon'))); + } + $updown = ''; + if ($cnt) { + $updown .= html_writer::link($url->out(false, array('action' => 'up')), + $OUTPUT->pix_icon('t/up', $txt->up, 'moodle')). ' '; + } else { + $updown .= $spacer; + } + if ($cnt < count($formats) - 1) { + $updown .= ' '.html_writer::link($url->out(false, array('action' => 'down')), + $OUTPUT->pix_icon('t/down', $txt->down, 'moodle')); + } else { + $updown .= $spacer; + } + $cnt++; + $settings = ''; + if ($format->get_settings_url()) { + $settings = html_writer::link($format->get_settings_url(), $txt->settings); + } + $uninstall = ''; + if ($defaultformat !== $format->name) { + $uninstall = html_writer::link($format->get_uninstall_url(), $txt->delete); + } + $table->data[] =array($strformatname, $hideshow, $updown, $uninstall, $settings); + } + $return .= html_writer::table($table); + $link = html_writer::link(new moodle_url('/admin/settings.php', array('section' => 'coursesettings')), new lang_string('coursesettings')); + $return .= html_writer::tag('p', get_string('manageformatsgotosettings', 'admin', $link)); + $return .= $OUTPUT->box_end(); + return highlight($query, $return); + } +} /** * Special class for filter administration. diff --git a/lib/moodlelib.php b/lib/moodlelib.php index 4b54f3703270c..f11821f3f6906 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -4572,7 +4572,8 @@ function delete_course($courseorid, $showfeedback = true) { // which should know about this updated property, as this event is meant to pass the full course record $course->timemodified = time(); - $DB->delete_records("course", array("id"=>$courseid)); + $DB->delete_records("course", array("id" => $courseid)); + $DB->delete_records("course_format_options", array("courseid" => $courseid)); //trigger events $course->context = $context; // you can not fetch context in the event because it was already deleted diff --git a/lib/pluginlib.php b/lib/pluginlib.php index e8cb001ce7a52..6f15d954f7ab5 100644 --- a/lib/pluginlib.php +++ b/lib/pluginlib.php @@ -3362,3 +3362,61 @@ public function get_uninstall_url() { array('sesskey' => sesskey(), 'action' => 'uninstall', 'webservice' => $this->name)); } } + +/** + * Class for course formats + */ +class plugininfo_format extends plugininfo_base { + + /** + * Gathers and returns the information about all plugins of the given type + * + * @param string $type the name of the plugintype, eg. mod, auth or workshopform + * @param string $typerootdir full path to the location of the plugin dir + * @param string $typeclass the name of the actually called class + * @return array of plugintype classes, indexed by the plugin name + */ + public static function get_plugins($type, $typerootdir, $typeclass) { + global $CFG; + $formats = parent::get_plugins($type, $typerootdir, $typeclass); + require_once($CFG->dirroot.'/course/lib.php'); + $order = get_sorted_course_formats(); + $sortedformats = array(); + foreach ($order as $formatname) { + $sortedformats[$formatname] = $formats[$formatname]; + } + return $sortedformats; + } + + public function get_settings_section_name() { + return 'formatsetting' . $this->name; + } + + public function load_settings(part_of_admin_tree $adminroot, $parentnodename, $hassiteconfig) { + global $CFG, $USER, $DB, $OUTPUT, $PAGE; // in case settings.php wants to refer to them + $ADMIN = $adminroot; // also may be used in settings.php + $section = $this->get_settings_section_name(); + + $settings = null; + if ($hassiteconfig && file_exists($this->full_path('settings.php'))) { + $settings = new admin_settingpage($section, $this->displayname, + 'moodle/site:config', $this->is_enabled() === false); + include($this->full_path('settings.php')); // this may also set $settings to null + } + if ($settings) { + $ADMIN->add($parentnodename, $settings); + } + } + + public function is_enabled() { + return !get_config($this->component, 'disabled'); + } + + public function get_uninstall_url() { + if ($this->name !== get_config('moodlecourse', 'format') && $this->name !== 'site') { + return new moodle_url('/admin/courseformats.php', + array('sesskey' => sesskey(), 'action' => 'uninstall', 'format' => $this->name)); + } + return parent::get_uninstall_url(); + } +}