/** * Reorders plugin types into a sequence to be displayed * * For technical reasons, plugin types returned by {@link core_component::get_plugin_types()} are * in a certain order that does not need to fit the expected order for the display. * Particularly, activity modules should be displayed first as they represent the * real heart of Moodle. They should be followed by other plugin types that are * used to build the courses (as that is what one expects from LMS). After that, * other supportive plugin types follow. * * @param array $types associative array * @return array same array with altered order of items */ protected function reorder_plugin_types(array $types) { $fix = array('mod' => $types['mod']); foreach (core_component::get_plugin_list('mod') as $plugin => $fulldir) { if (!($subtypes = core_component::get_subplugins('mod_' . $plugin))) { continue; } foreach ($subtypes as $subtype => $ignored) { $fix[$subtype] = $types[$subtype]; } } $fix['mod'] = $types['mod']; $fix['block'] = $types['block']; $fix['qtype'] = $types['qtype']; $fix['qbehaviour'] = $types['qbehaviour']; $fix['qformat'] = $types['qformat']; $fix['filter'] = $types['filter']; $fix['editor'] = $types['editor']; foreach (core_component::get_plugin_list('editor') as $plugin => $fulldir) { if (!($subtypes = core_component::get_subplugins('editor_' . $plugin))) { continue; } foreach ($subtypes as $subtype => $ignored) { $fix[$subtype] = $types[$subtype]; } } $fix['enrol'] = $types['enrol']; $fix['auth'] = $types['auth']; $fix['tool'] = $types['tool']; foreach (core_component::get_plugin_list('tool') as $plugin => $fulldir) { if (!($subtypes = core_component::get_subplugins('tool_' . $plugin))) { continue; } foreach ($subtypes as $subtype => $ignored) { $fix[$subtype] = $types[$subtype]; } } foreach ($types as $type => $path) { if (!isset($fix[$type])) { $fix[$type] = $path; } } return $fix; }
public function test_get_subplugins() { global $CFG; // Any plugin with more subtypes is ok here. $this->assertFileExists("{$CFG->dirroot}/mod/assign/db/subplugins.php"); $subplugins = core_component::get_subplugins('mod_assign'); $this->assertSame(array('assignsubmission', 'assignfeedback'), array_keys($subplugins)); $subs = core_component::get_plugin_list('assignsubmission'); $feeds = core_component::get_plugin_list('assignfeedback'); $this->assertSame(array_keys($subs), $subplugins['assignsubmission']); $this->assertSame(array_keys($feeds), $subplugins['assignfeedback']); // Any plugin without subtypes is ok here. $this->assertFileExists("{$CFG->dirroot}/mod/choice"); $this->assertFileNotExists("{$CFG->dirroot}/mod/choice/db/subplugins.php"); $this->assertNull(core_component::get_subplugins('mod_choice')); $this->assertNull(core_component::get_subplugins('xxxx_yyyy')); }