See Release Notes
Long Term Support Release
Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401] [Versions 400 and 401] [Versions 401 and 402] [Versions 401 and 403]
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 require_once(__DIR__ . '/../config.php'); 18 require_once($CFG->dirroot . '/repository/lib.php'); 19 require_once($CFG->libdir . '/adminlib.php'); 20 21 $repository = optional_param('repos', '', PARAM_ALPHANUMEXT); 22 $action = optional_param('action', '', PARAM_ALPHANUMEXT); 23 $sure = optional_param('sure', '', PARAM_ALPHA); 24 $downloadcontents = optional_param('downloadcontents', false, PARAM_BOOL); 25 26 $display = true; // fall through to normal display 27 28 $pagename = 'managerepositories'; 29 30 if ($action == 'edit') { 31 $pagename = 'repositorysettings' . $repository; 32 } else if ($action == 'delete') { 33 $pagename = 'repositorydelete'; 34 } else if (($action == 'newon') || ($action == 'newoff')) { 35 $pagename = 'repositorynew'; 36 } 37 38 // Need to remember this for form 39 $formaction = $action; 40 41 // Check what visibility to show the new repository 42 if ($action == 'newon') { 43 $action = 'new'; 44 $visible = true; 45 } else if ($action == 'newoff') { 46 $action = 'new'; 47 $visible = false; 48 } 49 50 admin_externalpage_setup($pagename); 51 52 $sesskeyurl = $CFG->wwwroot.'/'.$CFG->admin.'/repository.php?sesskey=' . sesskey(); 53 $baseurl = $CFG->wwwroot.'/'.$CFG->admin.'/repository.php'; 54 55 $configstr = get_string('manage', 'repository'); 56 57 $return = true; 58 59 if (!empty($action)) { 60 require_sesskey(); 61 } 62 63 /** 64 * Helper function that generates a moodle_url object 65 * relevant to the repository 66 */ 67 function repository_action_url($repository) { 68 global $baseurl; 69 return new moodle_url($baseurl, array('sesskey'=>sesskey(), 'repos'=>$repository)); 70 } 71 72 if (($action == 'edit') || ($action == 'new')) { 73 $pluginname = ''; 74 if ($action == 'edit') { 75 $repositorytype = repository::get_type_by_typename($repository); 76 $classname = 'repository_' . $repositorytype->get_typename(); 77 $configs = call_user_func(array($classname, 'get_type_option_names')); 78 $plugin = $repositorytype->get_typename(); 79 // looking for instance to edit plugin name 80 $instanceoptions = call_user_func(array($classname, 'get_instance_option_names')); 81 if (empty($instanceoptions)) { 82 $params = array(); 83 $params['type'] = $plugin; 84 $instances = repository::get_instances($params); 85 if ($instance = array_pop($instances)) { 86 // use the one form db record 87 $pluginname = $instance->instance->name; 88 } 89 } 90 91 } else { 92 $repositorytype = null; 93 $plugin = $repository; 94 $typeid = $repository; 95 } 96 $PAGE->set_pagetype('admin-repository-' . $plugin); 97 // display the edit form for this instance 98 $mform = new repository_type_form('', array('pluginname'=>$pluginname, 'plugin' => $plugin, 'instance' => $repositorytype, 'action' => $formaction)); 99 $fromform = $mform->get_data(); 100 101 //detect if we create a new type without config (in this case if don't want to display a setting page during creation) 102 $nosettings = false; 103 if ($action == 'new') { 104 $adminconfignames = repository::static_function($repository, 'get_type_option_names'); 105 $nosettings = empty($adminconfignames); 106 } 107 // end setup, begin output 108 109 if ($mform->is_cancelled()){ 110 redirect($baseurl); 111 } else if (!empty($fromform) || $nosettings) { 112 require_sesskey(); 113 if ($action == 'edit') { 114 $settings = array(); 115 foreach($configs as $config) { 116 if (!empty($fromform->$config)) { 117 $settings[$config] = $fromform->$config; 118 } else { 119 // if the config name is not appear in $fromform 120 // empty this config value 121 $settings[$config] = ''; 122 } 123 } 124 $instanceoptionnames = repository::static_function($repository, 'get_instance_option_names'); 125 if (!empty($instanceoptionnames)) { 126 if (property_exists($fromform, 'enablecourseinstances')) { 127 $settings['enablecourseinstances'] = $fromform->enablecourseinstances; 128 } 129 else { 130 $settings['enablecourseinstances'] = 0; 131 } 132 if (property_exists($fromform, 'enableuserinstances')) { 133 $settings['enableuserinstances'] = $fromform->enableuserinstances; 134 } 135 else { 136 $settings['enableuserinstances'] = 0; 137 } 138 } 139 $success = $repositorytype->update_options($settings); 140 } else { 141 $type = new repository_type($plugin, (array)$fromform, $visible); 142 $success = true; 143 if (!$repoid = $type->create()) { 144 $success = false; 145 } else { 146 add_to_config_log('repository_visibility', '', (int)$visible, $plugin); 147 } 148 $data = data_submitted(); 149 } 150 if ($success) { 151 // configs saved 152 core_plugin_manager::reset_caches(); 153 redirect($baseurl); 154 } else { 155 throw new \moodle_exception('instancenotsaved', 'repository', $baseurl); 156 } 157 exit; 158 } else { 159 echo $OUTPUT->header(); 160 echo $OUTPUT->heading(get_string('configplugin', 'repository_'.$plugin)); 161 $displaysettingform = true; 162 if ($action == 'edit') { 163 $typeoptionnames = repository::static_function($repository, 'get_type_option_names'); 164 $instanceoptionnames = repository::static_function($repository, 'get_instance_option_names'); 165 if (empty($typeoptionnames) && empty($instanceoptionnames)) { 166 $displaysettingform = false; 167 } 168 } 169 if ($displaysettingform){ 170 $OUTPUT->box_start(); 171 $mform->display(); 172 $OUTPUT->box_end(); 173 } 174 $return = false; 175 176 // Display instances list and creation form 177 if ($action == 'edit') { 178 $instanceoptionnames = repository::static_function($repository, 'get_instance_option_names'); 179 if (!empty($instanceoptionnames)) { 180 repository::display_instances_list(context_system::instance(), $repository); 181 } 182 } 183 } 184 } else if ($action == 'show') { 185 if (!confirm_sesskey()) { 186 throw new \moodle_exception('confirmsesskeybad', '', $baseurl); 187 } 188 $class = \core_plugin_manager::resolve_plugininfo_class('repository'); 189 $class::enable_plugin($repository, 1); 190 $return = true; 191 } else if ($action == 'hide') { 192 if (!confirm_sesskey()) { 193 throw new \moodle_exception('confirmsesskeybad', '', $baseurl); 194 } 195 $class = \core_plugin_manager::resolve_plugininfo_class('repository'); 196 $class::enable_plugin($repository, 0); 197 $return = true; 198 } else if ($action == 'delete') { 199 $repositorytype = repository::get_type_by_typename($repository); 200 if ($sure) { 201 $PAGE->set_pagetype('admin-repository-' . $repository); 202 if (!confirm_sesskey()) { 203 throw new \moodle_exception('confirmsesskeybad', '', $baseurl); 204 } 205 206 if ($repositorytype->delete($downloadcontents)) { 207 // Include this information into config changes table. 208 add_to_config_log('repository_visibility', $repositorytype->get_visible(), '', $repository); 209 core_plugin_manager::reset_caches(); 210 redirect($baseurl); 211 } else { 212 throw new \moodle_exception('instancenotdeleted', 'repository', $baseurl); 213 } 214 exit; 215 } else { 216 echo $OUTPUT->header(); 217 218 $message = get_string('confirmremove', 'repository', $repositorytype->get_readablename()); 219 220 $output = $OUTPUT->box_start('generalbox', 'notice'); 221 $output .= html_writer::tag('p', $message); 222 223 $removeurl = new moodle_url($sesskeyurl); 224 $removeurl->params(array( 225 'action' =>'delete', 226 'repos' => $repository, 227 'sure' => 'yes', 228 )); 229 230 $removeanddownloadurl = new moodle_url($sesskeyurl); 231 $removeanddownloadurl->params(array( 232 'action' =>'delete', 233 'repos'=> $repository, 234 'sure' => 'yes', 235 'downloadcontents' => 1, 236 )); 237 238 $output .= $OUTPUT->single_button($removeurl, get_string('continueuninstall', 'repository')); 239 $output .= $OUTPUT->single_button($removeanddownloadurl, get_string('continueuninstallanddownload', 'repository')); 240 $output .= $OUTPUT->single_button($baseurl, get_string('cancel')); 241 $output .= $OUTPUT->box_end(); 242 243 echo $output; 244 245 $return = false; 246 } 247 } else if ($action == 'moveup') { 248 $repositorytype = repository::get_type_by_typename($repository); 249 $repositorytype->move_order('up'); 250 } else if ($action == 'movedown') { 251 $repositorytype = repository::get_type_by_typename($repository); 252 $repositorytype->move_order('down'); 253 } else { 254 // If page is loaded directly 255 echo $OUTPUT->header(); 256 echo $OUTPUT->heading(get_string('manage', 'repository')); 257 258 // Get strings that are used 259 $strshow = get_string('on', 'repository'); 260 $strhide = get_string('off', 'repository'); 261 $strdelete = get_string('disabled', 'repository'); 262 $struninstall = get_string('uninstallplugin', 'core_admin'); 263 264 $actionchoicesforexisting = array( 265 'show' => $strshow, 266 'hide' => $strhide, 267 'delete' => $strdelete 268 ); 269 270 $actionchoicesfornew = array( 271 'newon' => $strshow, 272 'newoff' => $strhide, 273 'delete' => $strdelete 274 ); 275 276 $output = ''; 277 $output .= $OUTPUT->box_start('generalbox'); 278 279 // Set strings that are used multiple times 280 $settingsstr = get_string('settings'); 281 $disablestr = get_string('disable'); 282 283 // Table to list plug-ins 284 $table = new html_table(); 285 $table->head = array(get_string('name'), get_string('isactive', 'repository'), get_string('order'), $settingsstr, $struninstall); 286 287 $table->colclasses = array('leftalign', 'centeralign', 'centeralign', 'centeralign', 'centeralign', 'centeralign'); 288 $table->id = 'repositoriessetting'; 289 $table->data = array(); 290 $table->attributes['class'] = 'admintable generaltable'; 291 292 // Get list of used plug-ins 293 $repositorytypes = repository::get_types(); 294 // Array to store plugins being used 295 $alreadyplugins = array(); 296 if (!empty($repositorytypes)) { 297 $totalrepositorytypes = count($repositorytypes); 298 $updowncount = 1; 299 foreach ($repositorytypes as $i) { 300 $settings = ''; 301 $typename = $i->get_typename(); 302 // Display edit link only if you can config the type or if it has multiple instances (e.g. has instance config) 303 $typeoptionnames = repository::static_function($typename, 'get_type_option_names'); 304 $instanceoptionnames = repository::static_function($typename, 'get_instance_option_names'); 305 306 if (!empty($typeoptionnames) || !empty($instanceoptionnames)) { 307 // Calculate number of instances in order to display them for the Moodle administrator 308 if (!empty($instanceoptionnames)) { 309 $params = array(); 310 $params['context'] = array(context_system::instance()); 311 $params['onlyvisible'] = false; 312 $params['type'] = $typename; 313 $admininstancenumber = count(repository::static_function($typename, 'get_instances', $params)); 314 // site instances 315 $admininstancenumbertext = get_string('instancesforsite', 'repository', $admininstancenumber); 316 $params['context'] = array(); 317 $instances = repository::static_function($typename, 'get_instances', $params); 318 $courseinstances = array(); 319 $userinstances = array(); 320 321 foreach ($instances as $instance) { 322 $repocontext = context::instance_by_id($instance->instance->contextid); 323 if ($repocontext->contextlevel == CONTEXT_COURSE) { 324 $courseinstances[] = $instance; 325 } else if ($repocontext->contextlevel == CONTEXT_USER) { 326 $userinstances[] = $instance; 327 } 328 } 329 // course instances 330 $instancenumber = count($courseinstances); 331 $courseinstancenumbertext = get_string('instancesforcourses', 'repository', $instancenumber); 332 333 // user private instances 334 $instancenumber = count($userinstances); 335 $userinstancenumbertext = get_string('instancesforusers', 'repository', $instancenumber); 336 } else { 337 $admininstancenumbertext = ""; 338 $courseinstancenumbertext = ""; 339 $userinstancenumbertext = ""; 340 } 341 342 $settings .= '<a href="' . $sesskeyurl . '&action=edit&repos=' . $typename . '">' . $settingsstr .'</a>'; 343 344 $settings .= $OUTPUT->container_start('mdl-left'); 345 $settings .= '<br/>'; 346 $settings .= $admininstancenumbertext; 347 $settings .= '<br/>'; 348 $settings .= $courseinstancenumbertext; 349 $settings .= '<br/>'; 350 $settings .= $userinstancenumbertext; 351 $settings .= $OUTPUT->container_end(); 352 } 353 // Get the current visibility 354 if ($i->get_visible()) { 355 $currentaction = 'show'; 356 } else { 357 $currentaction = 'hide'; 358 } 359 360 $select = new single_select(repository_action_url($typename, 'repos'), 'action', $actionchoicesforexisting, $currentaction, null, 'applyto' . basename($typename)); 361 $select->set_label(get_string('action'), array('class' => 'accesshide')); 362 // Display up/down link 363 $updown = ''; 364 $spacer = $OUTPUT->spacer(array('height'=>15, 'width'=>15)); // should be done with CSS instead 365 366 if ($updowncount > 1) { 367 $updown .= "<a href=\"$sesskeyurl&action=moveup&repos=".$typename."\">"; 368 $updown .= $OUTPUT->pix_icon('t/up', get_string('moveup')) . "</a> "; 369 } 370 else { 371 $updown .= $spacer; 372 } 373 if ($updowncount < $totalrepositorytypes) { 374 $updown .= "<a href=\"$sesskeyurl&action=movedown&repos=".$typename."\">"; 375 $updown .= $OUTPUT->pix_icon('t/down', get_string('movedown')) . "</a> "; 376 } 377 else { 378 $updown .= $spacer; 379 } 380 381 $updowncount++; 382 383 $uninstall = ''; 384 if ($uninstallurl = core_plugin_manager::instance()->get_uninstall_url('repository_' . $typename, 'manage')) { 385 $uninstall = html_writer::link($uninstallurl, $struninstall); 386 } 387 388 $table->data[] = array($i->get_readablename(), $OUTPUT->render($select), $updown, $settings, $uninstall); 389 $table->rowclasses[] = ''; 390 391 if (!in_array($typename, $alreadyplugins)) { 392 $alreadyplugins[] = $typename; 393 } 394 } 395 } 396 397 // Get all the plugins that exist on disk 398 $plugins = core_component::get_plugin_list('repository'); 399 if (!empty($plugins)) { 400 foreach ($plugins as $plugin => $dir) { 401 // Check that it has not already been listed 402 if (!in_array($plugin, $alreadyplugins)) { 403 $select = new single_select(repository_action_url($plugin, 'repos'), 'action', $actionchoicesfornew, 'delete', null, 'applyto' . basename($plugin)); 404 $select->set_label(get_string('action'), array('class' => 'accesshide')); 405 $uninstall = ''; 406 if ($uninstallurl = core_plugin_manager::instance()->get_uninstall_url('repository_' . $plugin, 'manage')) { 407 $uninstall = html_writer::link($uninstallurl, $struninstall); 408 } 409 $table->data[] = array(get_string('pluginname', 'repository_'.$plugin), $OUTPUT->render($select), '', '', $uninstall); 410 $table->rowclasses[] = 'dimmed_text'; 411 } 412 } 413 } 414 415 $output .= html_writer::table($table); 416 $output .= $OUTPUT->box_end(); 417 print $output; 418 $return = false; 419 } 420 421 if ($return) { 422 redirect($baseurl); 423 } 424 echo $OUTPUT->footer();
title
Description
Body
title
Description
Body
title
Description
Body
title
Body