Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.

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 . '&amp;action=edit&amp;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&amp;action=moveup&amp;repos=".$typename."\">";
 368                  $updown .= $OUTPUT->pix_icon('t/up', get_string('moveup')) . "</a>&nbsp;";
 369              }
 370              else {
 371                  $updown .= $spacer;
 372              }
 373              if ($updowncount < $totalrepositorytypes) {
 374                  $updown .= "<a href=\"$sesskeyurl&amp;action=movedown&amp;repos=".$typename."\">";
 375                  $updown .= $OUTPUT->pix_icon('t/down', get_string('movedown')) . "</a>&nbsp;";
 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();