diff --git a/admin/repository.php b/admin/repository.php
index 26f1ba46ced..aa77af99b20 100644
--- a/admin/repository.php
+++ b/admin/repository.php
@@ -291,13 +291,13 @@ if (($action == 'edit') || ($action == 'new')) {
$table->attributes['class'] = 'admintable generaltable';
// Get list of used plug-ins
- $instances = repository::get_types();
- if (!empty($instances)) {
+ $repositorytypes = repository::get_types();
+ if (!empty($repositorytypes)) {
// Array to store plugins being used
$alreadyplugins = array();
- $totalinstances = count($instances);
+ $totalrepositorytypes = count($repositorytypes);
$updowncount = 1;
- foreach ($instances as $i) {
+ foreach ($repositorytypes as $i) {
$settings = '';
$typename = $i->get_typename();
// Display edit link only if you can config the type or if it has multiple instances (e.g. has instance config)
@@ -320,9 +320,10 @@ if (($action == 'edit') || ($action == 'new')) {
$userinstances = array();
foreach ($instances as $instance) {
- if ($instance->context->contextlevel == CONTEXT_COURSE) {
+ $repocontext = context::instance_by_id($instance->instance->contextid);
+ if ($repocontext->contextlevel == CONTEXT_COURSE) {
$courseinstances[] = $instance;
- } else if ($instance->context->contextlevel == CONTEXT_USER) {
+ } else if ($repocontext->contextlevel == CONTEXT_USER) {
$userinstances[] = $instance;
}
}
@@ -370,7 +371,7 @@ if (($action == 'edit') || ($action == 'new')) {
else {
$updown .= $spacer;
}
- if ($updowncount < $totalinstances) {
+ if ($updowncount < $totalrepositorytypes) {
$updown .= "";
$updown .= "
pix_url('t/down') . "\" alt=\"down\" />";
}
diff --git a/lib/adminlib.php b/lib/adminlib.php
index fbd7df3a27c..3156374c2df 100644
--- a/lib/adminlib.php
+++ b/lib/adminlib.php
@@ -6895,13 +6895,13 @@ class admin_setting_managerepository extends admin_setting {
$table->data = array();
// Get list of used plug-ins
- $instances = repository::get_types();
- if (!empty($instances)) {
+ $repositorytypes = repository::get_types();
+ if (!empty($repositorytypes)) {
// Array to store plugins being used
$alreadyplugins = array();
- $totalinstances = count($instances);
+ $totalrepositorytypes = count($repositorytypes);
$updowncount = 1;
- foreach ($instances as $i) {
+ foreach ($repositorytypes as $i) {
$settings = '';
$typename = $i->get_typename();
// Display edit link only if you can config the type or if it has multiple instances (e.g. has instance config)
@@ -6924,9 +6924,10 @@ class admin_setting_managerepository extends admin_setting {
$userinstances = array();
foreach ($instances as $instance) {
- if ($instance->context->contextlevel == CONTEXT_COURSE) {
+ $repocontext = context::instance_by_id($instance->instance->contextid);
+ if ($repocontext->contextlevel == CONTEXT_COURSE) {
$courseinstances[] = $instance;
- } else if ($instance->context->contextlevel == CONTEXT_USER) {
+ } else if ($repocontext->contextlevel == CONTEXT_USER) {
$userinstances[] = $instance;
}
}
@@ -6975,7 +6976,7 @@ class admin_setting_managerepository extends admin_setting {
else {
$updown .= $spacer;
}
- if ($updowncount < $totalinstances) {
+ if ($updowncount < $totalrepositorytypes) {
$updown .= "baseurl&action=movedown&repos=".$typename."\">";
$updown .= "
pix_url('t/down') . "\" alt=\"down\" class=\"iconsmall\" />";
}
diff --git a/repository/lib.php b/repository/lib.php
index 65619ce3520..8554b7373f2 100644
--- a/repository/lib.php
+++ b/repository/lib.php
@@ -527,33 +527,40 @@ abstract class repository {
/**
* Get repository instance using repository id
*
- * @param int $repositoryid repository ID
- * @param stdClass|int $context context instance or context ID
+ * Note that this function does not check permission to access repository contents
+ *
+ * @throws repository_exception
+ *
+ * @param int $repositoryid repository instance ID
+ * @param context|int $context context instance or context ID where this repository will be used
* @param array $options additional repository options
* @return repository
*/
public static function get_repository_by_id($repositoryid, $context, $options = array()) {
global $CFG, $DB;
+ if (!is_object($context)) {
+ $context = context::instance_by_id($context);
+ }
- $sql = 'SELECT i.name, i.typeid, r.type FROM {repository} r, {repository_instances} i WHERE i.id=? AND i.typeid=r.id';
+ $sql = "SELECT i.id, i.name, i.typeid, i.readonly, r.type AS repositorytype, r.visible
+ FROM {repository_instances} i
+ JOIN {repository} r ON r.id = i.typeid
+ WHERE i.id = ?";
if (!$record = $DB->get_record_sql($sql, array($repositoryid))) {
throw new repository_exception('invalidrepositoryid', 'repository');
} else {
- $type = $record->type;
+ $type = $record->repositorytype;
if (file_exists($CFG->dirroot . "/repository/$type/lib.php")) {
require_once($CFG->dirroot . "/repository/$type/lib.php");
$classname = 'repository_' . $type;
- $contextid = $context;
- if (is_object($context)) {
- $contextid = $context->id;
- }
$options['type'] = $type;
$options['typeid'] = $record->typeid;
+ $options['visible'] = $record->visible;
if (empty($options['name'])) {
$options['name'] = $record->name;
}
- $repository = new $classname($repositoryid, $contextid, $options);
+ $repository = new $classname($repositoryid, $context, $options, $record->readonly);
return $repository;
} else {
throw new repository_exception('invalidplugin', 'repository');
@@ -912,7 +919,7 @@ abstract class repository {
if (isset($args['currentcontext'])) {
$current_context = $args['currentcontext'];
} else {
- $current_context = null;
+ $current_context = get_system_context();
}
if (!empty($args['context'])) {
@@ -989,11 +996,11 @@ abstract class repository {
$options['visible'] = $record->visible;
$options['type'] = $record->repositorytype;
$options['typeid'] = $record->typeid;
- $options['sortorder'] = $sortorder++;
// tell instance what file types will be accepted by file picker
$classname = 'repository_' . $record->repositorytype;
- $repository = new $classname($record->id, $record->contextid, $options, $record->readonly);
+ $repository = new $classname($record->id, $current_context, $options, $record->readonly);
+ $repository->options['sortorder'] = $sortorder++;
$is_supported = true;
@@ -1020,18 +1027,10 @@ abstract class repository {
if (!$onlyvisible || ($repository->is_visible() && !$repository->disabled)) {
// check capability in current context
- if (!empty($current_context)) {
- $capability = has_capability('repository/'.$record->repositorytype.':view', $current_context);
- } else {
- $capability = has_capability('repository/'.$record->repositorytype.':view', get_system_context());
- }
+ $capability = has_capability('repository/'.$record->repositorytype.':view', $current_context);
if ($record->repositorytype == 'coursefiles') {
// coursefiles plugin needs managefiles permission
- if (!empty($current_context)) {
- $capability = $capability && has_capability('moodle/course:managefiles', $current_context);
- } else {
- $capability = $capability && has_capability('moodle/course:managefiles', get_system_context());
- }
+ $capability = $capability && has_capability('moodle/course:managefiles', $current_context);
}
if ($is_supported && $capability) {
$repositories[$repository->id] = $repository;
@@ -1043,32 +1042,19 @@ abstract class repository {
}
/**
- * Get single repository instance
+ * Get single repository instance for administrative actions
+ *
+ * Do not use this function to access repository contents, because it
+ * does not set the current context
+ *
+ * @see rpository::get_repository_by_id()
*
* @static
- * @param integer $id repository id
- * @return object repository instance
+ * @param integer $id repository instance id
+ * @return repository
*/
public static function get_instance($id) {
- global $DB, $CFG;
- $sql = "SELECT i.*, r.type AS repositorytype, r.visible
- FROM {repository} r
- JOIN {repository_instances} i ON i.typeid = r.id
- WHERE i.id = ?";
-
- if (!$instance = $DB->get_record_sql($sql, array($id))) {
- return false;
- }
- require_once($CFG->dirroot . '/repository/'. $instance->repositorytype.'/lib.php');
- $classname = 'repository_' . $instance->repositorytype;
- $options['typeid'] = $instance->typeid;
- $options['type'] = $instance->repositorytype;
- $options['name'] = $instance->name;
- $obj = new $classname($instance->id, $instance->contextid, $options, $instance->readonly);
- if (empty($obj->super_called)) {
- debugging('parent::__construct must be called by '.$classname.' plugin.');
- }
- return $obj;
+ return self::get_repository_by_id($id, context_system::instance());
}
/**