/** * Tests the uninstallation of event handlers from file. */ public function test_events_update_definition__uninstall() { global $DB; events_update_definition('unittest'); $this->assertDebuggingCalled(self::DEBUGGING_MSG, DEBUG_DEVELOPER); events_uninstall('unittest'); $this->assertEquals(0, $DB->count_records('events_handlers', array('component' => 'unittest')), 'All handlers should be uninstalled: %s'); }
if (!unset_all_config_for_plugin('qbehaviour_' . $delete)) { echo $OUTPUT->notification(get_string('errordeletingconfig', 'admin', 'qbehaviour_' . $delete)); } if (($key = array_search($delete, $disabledbehaviours)) !== false) { unset($disabledbehaviours[$key]); set_config('disabledbehaviours', implode(',', $disabledbehaviours), 'question'); } $behaviourorder = array_keys($sortedbehaviours); if (($key = array_search($delete, $behaviourorder)) !== false) { unset($behaviourorder[$key]); set_config('behavioursortorder', implode(',', $behaviourorder), 'question'); } // Then the tables themselves drop_plugin_tables($delete, get_plugin_directory('qbehaviour', $delete) . '/db/install.xml', false); // Remove event handlers and dequeue pending events events_uninstall('qbehaviour_' . $delete); $a = new stdClass(); $a->behaviour = $behaviourname; $a->directory = get_plugin_directory('qbehaviour', $delete); echo $OUTPUT->box(get_string('qbehaviourdeletefiles', 'question', $a), 'generalbox', 'notice'); echo $OUTPUT->continue_button($thispageurl); echo $OUTPUT->footer(); exit; } // End of process actions ================================================== // Print the page heading. echo $OUTPUT->header(); echo $OUTPUT->heading(get_string('manageqbehaviours', 'admin')); // Set up the table. $table = new flexible_table('qbehaviouradmintable'); $table->define_baseurl($thispageurl);
/** * Tests the uninstallation of event handlers from file */ function test__events_update_definition__uninstall() { events_uninstall('unittest'); $this->assertEqual(0, count_records('events_handlers', 'handlermodule', 'unittest'), 'All handlers should be uninstalled: %s'); }
/** * Automatically clean-up all plugin data and remove the plugin DB tables * * @param string $type The plugin type, eg. 'mod', 'qtype', 'workshopgrading' etc. * @param string $name The plugin name, eg. 'forum', 'multichoice', 'accumulative' etc. * @uses global $OUTPUT to produce notices and other messages * @return void */ function uninstall_plugin($type, $name) { global $CFG, $DB, $OUTPUT; // recursively uninstall all module subplugins first if ($type === 'mod') { if (file_exists("{$CFG->dirroot}/mod/{$name}/db/subplugins.php")) { $subplugins = array(); include "{$CFG->dirroot}/mod/{$name}/db/subplugins.php"; foreach ($subplugins as $subplugintype => $dir) { $instances = get_plugin_list($subplugintype); foreach ($instances as $subpluginname => $notusedpluginpath) { uninstall_plugin($subplugintype, $subpluginname); } } } } $component = $type . '_' . $name; // eg. 'qtype_multichoice' or 'workshopgrading_accumulative' or 'mod_forum' if ($type === 'mod') { $pluginname = $name; // eg. 'forum' if (get_string_manager()->string_exists('modulename', $component)) { $strpluginname = get_string('modulename', $component); } else { $strpluginname = $component; } } else { $pluginname = $component; if (get_string_manager()->string_exists('pluginname', $component)) { $strpluginname = get_string('pluginname', $component); } else { $strpluginname = $component; } } echo $OUTPUT->heading($pluginname); $plugindirectory = get_plugin_directory($type, $name); $uninstalllib = $plugindirectory . '/db/uninstall.php'; if (file_exists($uninstalllib)) { require_once $uninstalllib; $uninstallfunction = 'xmldb_' . $pluginname . '_uninstall'; // eg. 'xmldb_workshop_uninstall()' if (function_exists($uninstallfunction)) { if (!$uninstallfunction()) { echo $OUTPUT->notification('Encountered a problem running uninstall function for ' . $pluginname); } } } if ($type === 'mod') { // perform cleanup tasks specific for activity modules if (!($module = $DB->get_record('modules', array('name' => $name)))) { print_error('moduledoesnotexist', 'error'); } // delete all the relevant instances from all course sections if ($coursemods = $DB->get_records('course_modules', array('module' => $module->id))) { foreach ($coursemods as $coursemod) { if (!delete_mod_from_section($coursemod->id, $coursemod->section)) { echo $OUTPUT->notification("Could not delete the {$strpluginname} with id = {$coursemod->id} from section {$coursemod->section}"); } } } // clear course.modinfo for courses that used this module $sql = "UPDATE {course}\n SET modinfo=''\n WHERE id IN (SELECT DISTINCT course\n FROM {course_modules}\n WHERE module=?)"; $DB->execute($sql, array($module->id)); // delete all the course module records $DB->delete_records('course_modules', array('module' => $module->id)); // delete module contexts if ($coursemods) { foreach ($coursemods as $coursemod) { if (!delete_context(CONTEXT_MODULE, $coursemod->id)) { echo $OUTPUT->notification("Could not delete the context for {$strpluginname} with id = {$coursemod->id}"); } } } // delete the module entry itself $DB->delete_records('modules', array('name' => $module->name)); // cleanup the gradebook require_once $CFG->libdir . '/gradelib.php'; grade_uninstalled_module($module->name); // Perform any custom uninstall tasks if (file_exists($CFG->dirroot . '/mod/' . $module->name . '/lib.php')) { require_once $CFG->dirroot . '/mod/' . $module->name . '/lib.php'; $uninstallfunction = $module->name . '_uninstall'; if (function_exists($uninstallfunction)) { debugging("{$uninstallfunction}() has been deprecated. Use the plugin's db/uninstall.php instead", DEBUG_DEVELOPER); if (!$uninstallfunction()) { echo $OUTPUT->notification('Encountered a problem running uninstall function for ' . $module->name . '!'); } } } } else { if ($type === 'enrol') { // NOTE: this is a bit brute force way - it will not trigger events and hooks properly // nuke all role assignments role_unassign_all(array('component' => $component)); // purge participants $DB->delete_records_select('user_enrolments', "enrolid IN (SELECT id FROM {enrol} WHERE enrol = ?)", array($name)); // purge enrol instances $DB->delete_records('enrol', array('enrol' => $name)); // tweak enrol settings if (!empty($CFG->enrol_plugins_enabled)) { $enabledenrols = explode(',', $CFG->enrol_plugins_enabled); $enabledenrols = array_unique($enabledenrols); $enabledenrols = array_flip($enabledenrols); unset($enabledenrols[$name]); $enabledenrols = array_flip($enabledenrols); if (is_array($enabledenrols)) { set_config('enrol_plugins_enabled', implode(',', $enabledenrols)); } } } else { if ($type === 'block') { if ($block = $DB->get_record('block', array('name' => $name))) { // Inform block it's about to be deleted if (file_exists("{$CFG->dirroot}/blocks/{$block->name}/block_{$block->name}.php")) { $blockobject = block_instance($block->name); if ($blockobject) { $blockobject->before_delete(); //only if we can create instance, block might have been already removed } } // First delete instances and related contexts $instances = $DB->get_records('block_instances', array('blockname' => $block->name)); foreach ($instances as $instance) { blocks_delete_instance($instance); } // Delete block $DB->delete_records('block', array('id' => $block->id)); } } } } // perform clean-up task common for all the plugin/subplugin types // delete calendar events $DB->delete_records('event', array('modulename' => $pluginname)); // delete all the logs $DB->delete_records('log', array('module' => $pluginname)); // delete log_display information $DB->delete_records('log_display', array('component' => $component)); // delete the module configuration records unset_all_config_for_plugin($pluginname); // delete message provider message_provider_uninstall($component); // delete message processor if ($type === 'message') { message_processor_uninstall($name); } // delete the plugin tables $xmldbfilepath = $plugindirectory . '/db/install.xml'; drop_plugin_tables($component, $xmldbfilepath, false); if ($type === 'mod' or $type === 'block') { // non-frankenstyle table prefixes drop_plugin_tables($name, $xmldbfilepath, false); } // delete the capabilities that were defined by this module capabilities_cleanup($component); // remove event handlers and dequeue pending events events_uninstall($component); echo $OUTPUT->notification(get_string('success'), 'notifysuccess'); }
/** * Automatically clean-up all plugin data and remove the plugin DB tables * * NOTE: do not call directly, use new /admin/plugins.php?uninstall=component instead! * * @param string $type The plugin type, eg. 'mod', 'qtype', 'workshopgrading' etc. * @param string $name The plugin name, eg. 'forum', 'multichoice', 'accumulative' etc. * @uses global $OUTPUT to produce notices and other messages * @return void */ function uninstall_plugin($type, $name) { global $CFG, $DB, $OUTPUT; // This may take a long time. core_php_time_limit::raise(); // Recursively uninstall all subplugins first. $subplugintypes = core_component::get_plugin_types_with_subplugins(); if (isset($subplugintypes[$type])) { $base = core_component::get_plugin_directory($type, $name); if (file_exists("{$base}/db/subplugins.php")) { $subplugins = array(); include "{$base}/db/subplugins.php"; foreach ($subplugins as $subplugintype => $dir) { $instances = core_component::get_plugin_list($subplugintype); foreach ($instances as $subpluginname => $notusedpluginpath) { uninstall_plugin($subplugintype, $subpluginname); } } } } $component = $type . '_' . $name; // eg. 'qtype_multichoice' or 'workshopgrading_accumulative' or 'mod_forum' if ($type === 'mod') { $pluginname = $name; // eg. 'forum' if (get_string_manager()->string_exists('modulename', $component)) { $strpluginname = get_string('modulename', $component); } else { $strpluginname = $component; } } else { $pluginname = $component; if (get_string_manager()->string_exists('pluginname', $component)) { $strpluginname = get_string('pluginname', $component); } else { $strpluginname = $component; } } echo $OUTPUT->heading($pluginname); // Delete all tag instances associated with this plugin. require_once $CFG->dirroot . '/tag/lib.php'; tag_delete_instances($component); // Custom plugin uninstall. $plugindirectory = core_component::get_plugin_directory($type, $name); $uninstalllib = $plugindirectory . '/db/uninstall.php'; if (file_exists($uninstalllib)) { require_once $uninstalllib; $uninstallfunction = 'xmldb_' . $pluginname . '_uninstall'; // eg. 'xmldb_workshop_uninstall()' if (function_exists($uninstallfunction)) { // Do not verify result, let plugin complain if necessary. $uninstallfunction(); } } // Specific plugin type cleanup. $plugininfo = core_plugin_manager::instance()->get_plugin_info($component); if ($plugininfo) { $plugininfo->uninstall_cleanup(); core_plugin_manager::reset_caches(); } $plugininfo = null; // perform clean-up task common for all the plugin/subplugin types //delete the web service functions and pre-built services require_once $CFG->dirroot . '/lib/externallib.php'; external_delete_descriptions($component); // delete calendar events $DB->delete_records('event', array('modulename' => $pluginname)); // Delete scheduled tasks. $DB->delete_records('task_scheduled', array('component' => $pluginname)); // Delete Inbound Message datakeys. $DB->delete_records_select('messageinbound_datakeys', 'handler IN (SELECT id FROM {messageinbound_handlers} WHERE component = ?)', array($pluginname)); // Delete Inbound Message handlers. $DB->delete_records('messageinbound_handlers', array('component' => $pluginname)); // delete all the logs $DB->delete_records('log', array('module' => $pluginname)); // delete log_display information $DB->delete_records('log_display', array('component' => $component)); // delete the module configuration records unset_all_config_for_plugin($component); if ($type === 'mod') { unset_all_config_for_plugin($pluginname); } // delete message provider message_provider_uninstall($component); // delete the plugin tables $xmldbfilepath = $plugindirectory . '/db/install.xml'; drop_plugin_tables($component, $xmldbfilepath, false); if ($type === 'mod' or $type === 'block') { // non-frankenstyle table prefixes drop_plugin_tables($name, $xmldbfilepath, false); } // delete the capabilities that were defined by this module capabilities_cleanup($component); // remove event handlers and dequeue pending events events_uninstall($component); // Delete all remaining files in the filepool owned by the component. $fs = get_file_storage(); $fs->delete_component_files($component); // Finally purge all caches. purge_all_caches(); // Invalidate the hash used for upgrade detections. set_config('allversionshash', ''); echo $OUTPUT->notification(get_string('success'), 'notifysuccess'); }
echo $OUTPUT->footer(); exit; } // Do the deletion. echo $OUTPUT->header(); echo $OUTPUT->heading(get_string('deletingqtype', 'question', $qtypename)); // Delete any configuration records. if (!unset_all_config_for_plugin('qtype_' . $delete)) { echo $OUTPUT->notification(get_string('errordeletingconfig', 'admin', 'qtype_' . $delete)); } unset_config($delete . '_disabled', 'question'); unset_config($delete . '_sortorder', 'question'); // Then the tables themselves drop_plugin_tables($delete, $qtypes[$delete]->plugin_dir() . '/db/install.xml', false); // Remove event handlers and dequeue pending events events_uninstall('qtype_' . $delete); $a = new stdClass(); $a->qtype = $qtypename; $a->directory = $qtypes[$delete]->plugin_dir(); echo $OUTPUT->box(get_string('qtypedeletefiles', 'question', $a), 'generalbox', 'notice'); echo $OUTPUT->continue_button($thispageurl); echo $OUTPUT->footer(); exit; } // End of process actions ================================================== // Print the page heading. echo $OUTPUT->header(); echo $OUTPUT->heading(get_string('manageqtypes', 'admin')); // Set up the table. $table = new flexible_table('qtypeadmintable'); $table->define_baseurl($thispageurl);
/** * Tests the uninstallation of event handlers from file */ function test__events_update_definition__uninstall() { global $DB; events_uninstall('unittest'); $this->assertEqual(0, $DB->count_records('events_handlers', array('component' => 'unittest')), 'All handlers should be uninstalled: %s'); }
if (!$DB->delete_records("modules", array("name" => $module->name))) { echo $OUTPUT->notification("Error occurred while deleting the {$strmodulename} record from modules table"); } // And the module configuration records if (!unset_all_config_for_plugin($module->name)) { echo $OUTPUT->notification(get_string('errordeletingconfig', 'admin', $strmodulename)); } // cleanup the gradebook require_once $CFG->libdir . '/gradelib.php'; grade_uninstalled_module($module->name); // Then the tables themselves drop_plugin_tables($module->name, "{$CFG->dirroot}/mod/{$module->name}/db/install.xml", false); // Delete the capabilities that were defined by this module capabilities_cleanup('mod/' . $module->name); // remove entent handlers and dequeue pending events events_uninstall('mod/' . $module->name); // Perform any custom uninstall tasks if (file_exists($CFG->dirroot . '/mod/' . $module->name . '/lib.php')) { require_once $CFG->dirroot . '/mod/' . $module->name . '/lib.php'; $uninstallfunction = $module->name . '_uninstall'; if (function_exists($uninstallfunction)) { if (!$uninstallfunction()) { echo $OUTPUT->notification('Encountered a problem running uninstall function for ' . $module->name . '!'); } } } $a->module = $strmodulename; $a->directory = "{$CFG->dirroot}/mod/{$delete}"; notice(get_string("moduledeletefiles", "", $a), "modules.php"); } }
// First delete instances and then block $instances = $DB->get_records('block_instances', array('blockname' => $block->name)); if (!empty($instances)) { foreach ($instances as $instance) { blocks_delete_instance($instance); } } // Delete block $DB->delete_records('block', array('id' => $block->id)); drop_plugin_tables($block->name, "{$CFG->dirroot}/blocks/{$block->name}/db/install.xml", false); // old obsoleted table names drop_plugin_tables('block_' . $block->name, "{$CFG->dirroot}/blocks/{$block->name}/db/install.xml", false); // Delete the capabilities that were defined by this block capabilities_cleanup('block/' . $block->name); // Remove event handlers and dequeue pending events events_uninstall('block/' . $block->name); $a->block = $strblockname; $a->directory = $CFG->dirroot . '/blocks/' . $block->name; notice(get_string('blockdeletefiles', '', $a), 'blocks.php'); } } echo $OUTPUT->header(); echo $OUTPUT->heading($strmanageblocks); /// Main display starts here /// Get and sort the existing blocks if (!($blocks = $DB->get_records('block', array(), 'name ASC'))) { print_error('noblocks', 'error'); // Should never happen } $incompatible = array(); /// Print the table of all blocks
/** * Delete the database and files associated with this plugin. * * @param string $plugin - The type of the plugin to delete * @return string the name of the next page to display */ public function delete_plugin($plugin) { global $CFG, $DB, $OUTPUT; $confirm = optional_param('confirm', null, PARAM_BOOL); if ($confirm) { // Delete any configuration records. if (!unset_all_config_for_plugin('assignsubmission_' . $plugin)) { $this->error = $OUTPUT->notification(get_string('errordeletingconfig', 'admin', $this->subtype . '_' . $plugin)); } // Should be covered by the previous function - but just in case unset_config('disabled', $this->subtype . '_' . $plugin); unset_config('sortorder', $this->subtype . '_' . $plugin); // delete the plugin specific config settings $DB->delete_records('assign_plugin_config', array('plugin'=>$plugin, 'subtype'=>$this->subtype)); // Then the tables themselves drop_plugin_tables($this->subtype . '_' . $plugin, $CFG->dirroot . '/mod/assign/' . $this->subtype . '/' .$plugin. '/db/install.xml', false); // Remove event handlers and dequeue pending events events_uninstall($this->subtype . '_' . $plugin); // the page to display return 'plugindeleted'; } else { // the page to display return 'confirmdelete'; } }
/** * Automatically clean-up all plugin data and remove the plugin DB tables * * @param string $type The subplugin type, eg. 'vmoodleadminset' etc. * @param string $name The subplugin name, eg. 'example', 'generic', etc. * @uses global $OUTPUT to produce notices and other messages * @return void */ function vmoodle_uninstall_plugin($type, $name, $plugindirectory) { global $CFG, $DB, $OUTPUT; // This may take a long time. @set_time_limit(0); $component = $type . '_' . $name; // eg. 'qtype_multichoice' or 'workshopgrading_accumulative' or 'mod_forum' $pluginname = $component; if (get_string_manager()->string_exists('pluginname', $component)) { $strpluginname = get_string('pluginname', $component); } else { $strpluginname = $component; } echo $OUTPUT->heading($pluginname); $uninstalllib = $plugindirectory . '/db/uninstall.php'; if (file_exists($uninstalllib)) { require_once $uninstalllib; $uninstallfunction = 'xmldb_' . $pluginname . '_uninstall'; // eg. 'xmldb_workshop_uninstall()' if (function_exists($uninstallfunction)) { if (!$uninstallfunction()) { echo $OUTPUT->notification('Encountered a problem running uninstall function for ' . $pluginname); } } } // Perform clean-up task common for all the plugin/subplugin types. // Delete the web service functions and pre-built services. require_once $CFG->dirroot . '/lib/externallib.php'; external_delete_descriptions($component); // Delete calendar events. $DB->delete_records('event', array('modulename' => $pluginname)); // Delete all the logs. $DB->delete_records('log', array('module' => $pluginname)); // Delete log_display information. $DB->delete_records('log_display', array('component' => $component)); // Delete the module configuration records. unset_all_config_for_plugin($pluginname); // delete message provider message_provider_uninstall($component); // Delete message processor. if ($type === 'message') { message_processor_uninstall($name); } // Delete the plugin tables. $xmldbfilepath = $plugindirectory . '/db/install.xml'; drop_plugin_tables($component, $xmldbfilepath, false); // Delete the capabilities that were defined by this module. capabilities_cleanup($component); // Remove event handlers and dequeue pending events. events_uninstall($component); echo $OUTPUT->notification(get_string('success'), 'notifysuccess'); }