diff --git a/admin/replace.php b/admin/replace.php
index 5f72748671b..ff145dc2721 100644
--- a/admin/replace.php
+++ b/admin/replace.php
@@ -46,7 +46,7 @@ $instances = $DB->get_recordset('block_instances', array('blockname' => 'html'))
foreach ($instances as $instance) {
$blockobject = block_instance('html', $instance);
$blockobject->config->text = str_replace($search, $replace, $blockobject->config->text);
- $blockobject->instance_config_commit($blockobject->pinned);
+ $blockobject->instance_config_commit();
}
$instances->close();
diff --git a/admin/roles/assign.php b/admin/roles/assign.php
index afcb7004fe6..54625a26190 100755
--- a/admin/roles/assign.php
+++ b/admin/roles/assign.php
@@ -43,13 +43,15 @@
$extendperiod = optional_param('extendperiod', 0, PARAM_INT);
$extendbase = optional_param('extendbase', 3, PARAM_INT);
- $baseurl = $CFG->wwwroot . '/' . $CFG->admin . '/roles/assign.php?contextid=' . $contextid;
+ $urlparams = array('contextid' => $contextid);
if (!empty($userid)) {
- $baseurl .= '&userid='.$userid;
+ $urlparams['userid'] = $userid;
}
if ($courseid && $courseid != SITEID) {
- $baseurl .= '&courseid='.$courseid;
+ $urlparams['courseid'] = $courseid;
}
+ $PAGE->set_url($CFG->admin . '/roles/assign.php', $urlparams);
+ $baseurl = $PAGE->url->out();
if (! $context = get_context_instance_by_id($contextid)) {
print_error('wrongcontextid', 'error');
@@ -149,11 +151,8 @@
/// Create the user selector objects.
$options = array('context' => $context, 'roleid' => $roleid);
- if ($context->contextlevel > CONTEXT_COURSE && !is_inside_frontpage($context)) {
- $potentialuserselector = new potential_assignees_below_course('addselect', $options);
- } else {
- $potentialuserselector = new potential_assignees_course_and_above('addselect', $options);
- }
+
+ $potentialuserselector = roles_get_potential_user_selector($context, 'addselect', $options);
if ($context->contextlevel == CONTEXT_SYSTEM && is_admin_role($roleid)) {
$currentuserselector = new existing_role_holders_site_admin('removeselect', $options);
} else {
@@ -377,7 +376,7 @@
} else if (empty($assignableroles)) {
/// Print a message that there are no roles that can me assigned here.
- print_heading(get_string('notabletoassignroleshere', 'role'), 'center', 3);
+ print_heading(get_string('notabletoassignroleshere', 'role'), '', 3);
} else {
/// Show UI for choosing a role to assign.
@@ -388,7 +387,7 @@
}
// Print instruction
- print_heading(get_string('chooseroletoassign', 'role'), 'center', 3);
+ print_heading(get_string('chooseroletoassign', 'role'), '', 3);
// sync metacourse enrolments if needed
if ($inmeta) {
@@ -452,6 +451,6 @@
if ($context->contextlevel == CONTEXT_SYSTEM || $isfrontpage) {
admin_externalpage_print_footer();
} else {
- print_footer($course);
+ print_footer();
}
?>
diff --git a/admin/roles/check.php b/admin/roles/check.php
index abd55d84474..4153ae8db55 100755
--- a/admin/roles/check.php
+++ b/admin/roles/check.php
@@ -37,6 +37,15 @@
$userid = optional_param('userid', 0, PARAM_INT); // needed for user tabs
$courseid = optional_param('courseid', 0, PARAM_INT); // needed for user tabs
+ $urlparams = array('contextid' => $contextid);
+ if (!empty($userid)) {
+ $urlparams['userid'] = $userid;
+ }
+ if ($courseid && $courseid != SITEID) {
+ $urlparams['courseid'] = $courseid;
+ }
+ $PAGE->set_url($CFG->admin . '/roles/check.php', $urlparams);
+
if (! $context = get_context_instance_by_id($contextid)) {
print_error('wrongcontextid', 'error');
}
@@ -75,10 +84,10 @@
/// Teachers within a course just get to see the same list of people they can
/// assign roles to. Admins (people with moodle/role:manage) can run this report for any user.
$options = array('context' => $context, 'roleid' => 0);
- if ($context->contextlevel > CONTEXT_COURSE && !is_inside_frontpage($context) && !has_capability('moodle/role:manage', $context)) {
- $userselector = new potential_assignees_below_course('reportuser', $options);
- } else {
+ if (has_capability('moodle/role:manage', $context)) {
$userselector = new potential_assignees_course_and_above('reportuser', $options);
+ } else {
+ $userselector = roles_get_potential_user_selector($context, 'reportuser', $options);
}
$userselector->set_multiselect(false);
$userselector->set_rows(10);
@@ -177,5 +186,5 @@
get_string('backto', '', $contextname) . '';
}
- print_footer($course);
+ print_footer();
?>
diff --git a/admin/roles/lib.php b/admin/roles/lib.php
index a67421f0d46..792be3633e7 100644
--- a/admin/roles/lib.php
+++ b/admin/roles/lib.php
@@ -961,7 +961,7 @@ abstract class role_assign_user_selector_base extends user_selector_base {
/**
* User selector subclass for the list of potential users on the assign roles page,
* when we are assigning in a context below the course level. (CONTEXT_MODULE and
- * CONTEXT_BLOCK).
+ * some CONTEXT_BLOCK).
*
* In this case we replicate part of get_users_by_capability() get the users
* with moodle/course:view (or moodle/site:doanything). We can't use
@@ -1468,4 +1468,32 @@ class role_allow_switch_page extends role_allow_role_page {
}
}
+/**
+ * Get the potential assignees selector for a given context.
+ *
+ * If this context is a course context, or inside a course context (module or
+ * some blocks) then return a potential_assignees_below_course object. Otherwise
+ * return a potential_assignees_course_and_above.
+ *
+ * @param $context a context.
+ * @param $name passed to user selector constructor.
+ * @param $options to user selector constructor.
+ * @return user_selector_base an appropriate user selector.
+ */
+function roles_get_potential_user_selector($context, $name, $options) {
+ $blockinsidecourse = false;
+ if ($context->contextlevel == CONTEXT_BLOCK) {
+ $parentcontext = get_context_instance_by_id(get_parent_contextid($context));
+ $blockinsidecourse = in_array($parentcontext->contextlevel, array(CONTEXT_MODULE, CONTEXT_COURSE));
+ }
+
+ if (($context->contextlevel == CONTEXT_MODULE || $blockinsidecourse) &&
+ !is_inside_frontpage($context)) {
+ $potentialuserselector = new potential_assignees_below_course('addselect', $options);
+ } else {
+ $potentialuserselector = new potential_assignees_course_and_above('addselect', $options);
+ }
+ return $potentialuserselector;
+}
+
?>
\ No newline at end of file
diff --git a/admin/roles/override.php b/admin/roles/override.php
index d85cb30556f..85ce08860cf 100755
--- a/admin/roles/override.php
+++ b/admin/roles/override.php
@@ -39,13 +39,15 @@
$courseid = optional_param('courseid', 0, PARAM_INT); // needed for user tabs
/// Get the base URL for this and related pages into a convenient variable.
- $baseurl = $CFG->wwwroot . '/' . $CFG->admin . '/roles/override.php?contextid=' . $contextid;
+ $urlparams = array('contextid' => $contextid);
if (!empty($userid)) {
- $baseurl .= '&userid=' . $userid;
+ $urlparams['userid'] = $userid;
}
if ($courseid && $courseid != SITEID) {
- $baseurl .= '&courseid=' . $courseid;
+ $urlparams['courseid'] = $courseid;
}
+ $PAGE->set_url($CFG->admin . '/roles/override.php', $urlparams);
+ $baseurl = $PAGE->url->out();
/// Validate the contextid parameter.
if (!$context = $DB->get_record('context', array('id'=>$contextid))) {
@@ -258,6 +260,5 @@
}
}
- print_footer($course);
-
+ print_footer();
?>
\ No newline at end of file
diff --git a/admin/roles/tabs.php b/admin/roles/tabs.php
index 1d37a0dfa4c..0d106bb60b2 100755
--- a/admin/roles/tabs.php
+++ b/admin/roles/tabs.php
@@ -121,7 +121,7 @@ if ($currenttab != 'update') {
if ($blockinstance = $DB->get_record('block_instances', array('id' => $context->instanceid))) {
$blockname = print_context_name($context);
- $parentcontext = get_context_instance_by_id($blockinstance->contextid);
+ $parentcontext = get_context_instance_by_id($blockinstance->parentcontextid);
$navlinks[] = array('name' => $blockname, 'link' => null, 'type' => 'misc');
$navlinks[] = array('name' => $straction, 'link' => null, 'type' => 'misc');
switch ($parentcontext->contextlevel) {
diff --git a/blocks/admin/block_admin.php b/blocks/admin/block_admin.php
index 9b0cddfc93b..bfe5f8c5d6d 100644
--- a/blocks/admin/block_admin.php
+++ b/blocks/admin/block_admin.php
@@ -18,10 +18,9 @@ class block_admin extends block_list {
$this->content->icons = array();
$this->content->footer = '';
- $context = $this->page->context;
$course = $this->page->course;
- if (!has_capability('moodle/course:view', $context)) { // Just return
+ if (!has_capability('moodle/course:view', $this->page->context)) { // Just return
return $this->content;
}
@@ -32,7 +31,7 @@ class block_admin extends block_list {
}
/// Course editing on/off
- if ($course->id !== SITEID and has_capability('moodle/course:update', $context)) {
+ if ($course->id !== SITEID and has_capability('moodle/course:update', $this->page->context)) {
$this->content->icons[]='
';
if ($this->page->user_is_editing()) {
$this->content->items[]=''.get_string('turneditingoff').'';
@@ -46,11 +45,11 @@ class block_admin extends block_list {
/// Assign roles to the course
if ($course->id != SITEID) {
- if (has_capability('moodle/role:assign', $context)) {
- $this->content->items[]=''.get_string('assignroles', 'role').'';
+ if (has_capability('moodle/role:assign', $this->page->context)) {
+ $this->content->items[]=''.get_string('assignroles', 'role').'';
$this->content->icons[]='
';
- } else if (get_overridable_roles($context, ROLENAME_ORIGINAL)) {
- $this->content->items[]=''.get_string('overridepermissions', 'role').'';
+ } else if (get_overridable_roles($this->page->context, ROLENAME_ORIGINAL)) {
+ $this->content->items[]=''.get_string('overridepermissions', 'role').'';
$this->content->icons[]='
';
}
}
@@ -59,13 +58,13 @@ class block_admin extends block_list {
/// find all accessible reports
if ($course->id !== SITEID) {
$reportavailable = false;
- if (has_capability('moodle/grade:viewall', $context)) {
+ if (has_capability('moodle/grade:viewall', $this->page->context)) {
$reportavailable = true;
} else if (!empty($course->showgrades)) {
if ($reports = get_plugin_list('gradereport')) { // Get all installed reports
arsort($reports); // user is last, we want to test it first
foreach ($reports as $plugin => $plugindir) {
- if (has_capability('gradereport/'.$plugin.':view', $context)) {
+ if (has_capability('gradereport/'.$plugin.':view', $this->page->context)) {
//stop when the first visible plugin is found
$reportavailable = true;
break;
@@ -82,7 +81,7 @@ class block_admin extends block_list {
/// Course outcomes (to help give it more prominence because it's important)
if (!empty($CFG->enableoutcomes)) {
- if ($course->id!==SITEID and has_capability('moodle/course:update', $context)) {
+ if ($course->id!==SITEID and has_capability('moodle/course:update', $this->page->context)) {
$this->content->items[]=''.get_string('outcomes', 'grades').'';
$this->content->icons[]='
';
}
@@ -90,11 +89,11 @@ class block_admin extends block_list {
/// Manage metacourses
if ($course->metacourse) {
- if (has_capability('moodle/course:managemetacourse', $context)) {
+ if (has_capability('moodle/course:managemetacourse', $this->page->context)) {
$strchildcourses = get_string('childcourses');
$this->content->items[]=''.$strchildcourses.'';
$this->content->icons[]='
';
- } else if (has_capability('moodle/role:assign', $context)) {
+ } else if (has_capability('moodle/role:assign', $this->page->context)) {
$strchildcourses = get_string('childcourses');
$this->content->items[]=''.$strchildcourses.'';
$this->content->icons[]='
';
@@ -103,38 +102,38 @@ class block_admin extends block_list {
/// Manage groups in this course
- if (($course->id!==SITEID) && ($course->groupmode || !$course->groupmodeforce) && has_capability('moodle/course:managegroups', $context)) {
+ if (($course->id!==SITEID) && ($course->groupmode || !$course->groupmodeforce) && has_capability('moodle/course:managegroups', $this->page->context)) {
$strgroups = get_string('groups');
$this->content->items[]=''.$strgroups.'';
$this->content->icons[]='
';
}
/// Backup this course
- if ($course->id!==SITEID and has_capability('moodle/site:backup', $context)) {
+ if ($course->id!==SITEID and has_capability('moodle/site:backup', $this->page->context)) {
$this->content->items[]=''.get_string('backup').'';
$this->content->icons[]='
';
}
/// Restore to this course
- if ($course->id !== SITEID and has_capability('moodle/site:restore', $context)) {
+ if ($course->id !== SITEID and has_capability('moodle/site:restore', $this->page->context)) {
$this->content->items[]=''.get_string('restore').'';
$this->content->icons[]='
';
}
/// Import data from other courses
- if ($course->id !== SITEID and has_capability('moodle/site:import', $context)) {
+ if ($course->id !== SITEID and has_capability('moodle/site:import', $this->page->context)) {
$this->content->items[]=''.get_string('import').'';
$this->content->icons[]='
';
}
/// Reset this course
- if ($course->id!==SITEID and has_capability('moodle/course:reset', $context)) {
+ if ($course->id!==SITEID and has_capability('moodle/course:reset', $this->page->context)) {
$this->content->items[]=''.get_string('reset').'';
$this->content->icons[]='
';
}
/// View course reports
- if ($course->id !== SITEID and has_capability('moodle/site:viewreports', $context)) { // basic capability for listing of reports
+ if ($course->id !== SITEID and has_capability('moodle/site:viewreports', $this->page->context)) { // basic capability for listing of reports
$this->content->items[]=''.get_string('reports').'';
$this->content->icons[]='
';
}
@@ -151,12 +150,12 @@ class block_admin extends block_list {
'moodle/question:movemine',
'moodle/question:moveall');
foreach ($questioncaps as $questioncap){
- if (has_capability($questioncap, $context)){
+ if (has_capability($questioncap, $this->page->context)){
$questionlink = 'edit.php';
break;
}
}
- if (!$questionlink && has_capability('moodle/question:managecategory', $context)) {
+ if (!$questionlink && has_capability('moodle/question:managecategory', $this->page->context)) {
$questionlink = 'category.php';
}
if ($questionlink) {
@@ -168,14 +167,14 @@ class block_admin extends block_list {
/// Repository Instances
require_once($CFG->dirroot.'/repository/lib.php');
- $editabletypes = repository::get_editable_types($context);
- if ($course->id !== SITEID && has_capability('moodle/course:update', $context) && !empty($editabletypes)) {
- $this->content->items[]=''.get_string('repositories').'';
+ $editabletypes = repository::get_editable_types($this->page->context);
+ if ($course->id !== SITEID && has_capability('moodle/course:update', $this->page->context) && !empty($editabletypes)) {
+ $this->content->items[]=''.get_string('repositories').'';
$this->content->icons[]='
';
}
/// Manage files
- if ($course->id !== SITEID and has_capability('moodle/course:managefiles', $context)) {
+ if ($course->id !== SITEID and has_capability('moodle/course:managefiles', $this->page->context)) {
$this->content->items[]=''.get_string('files').'';
$this->content->icons[]='
';
}
@@ -184,7 +183,7 @@ class block_admin extends block_list {
if ($course->enrol == 'authorize' || (empty($course->enrol) && $CFG->enrol == 'authorize') && ($course->id!==SITEID)) {
require_once($CFG->dirroot.'/enrol/authorize/const.php');
$paymenturl = ''.get_string('payments').' ';
- if (has_capability('enrol/authorize:managepayments', $context)) {
+ if (has_capability('enrol/authorize:managepayments', $this->page->context)) {
if ($cnt = $DB->count_records('enrol_authorize', array('status'=>AN_STATUS_AUTH, 'courseid'=>$course->id))) {
$paymenturl .= ''.get_string('paymentpending', 'moodle', $cnt).'';
}
@@ -195,10 +194,10 @@ class block_admin extends block_list {
/// Unenrol link
if (empty($course->metacourse) && ($course->id!==SITEID)) {
- if (has_capability('moodle/legacy:guest', $context, NULL, false)) { // Are a guest now
+ if (has_capability('moodle/legacy:guest', $this->page->context, NULL, false)) { // Are a guest now
$this->content->items[]=''.get_string('enrolme', '', format_string($course->shortname)).'';
$this->content->icons[]='
';
- } else if (has_capability('moodle/role:unassignself', $context, NULL, false) and get_user_roles($context, $USER->id, false)) { // Have some role
+ } else if (has_capability('moodle/role:unassignself', $this->page->context, NULL, false) and get_user_roles($this->page->context, $USER->id, false)) { // Have some role
$this->content->items[]=''.get_string('unenrolme', '', format_string($course->shortname)).'';
$this->content->icons[]='
';
}
diff --git a/blocks/html/block_html.php b/blocks/html/block_html.php
index e55f5785dbb..16be06b64dc 100755
--- a/blocks/html/block_html.php
+++ b/blocks/html/block_html.php
@@ -25,7 +25,7 @@ class block_html extends block_base {
}
if ($this->content_is_trusted()) {
- // fancy html allowed only on course page and in pinned blocks for security reasons
+ // fancy html allowed only on course, category and system blocks.
$filteropt = new stdClass;
$filteropt->noclean = true;
} else {
@@ -88,7 +88,7 @@ class block_html extends block_base {
$blockobject = block_instance('html', $instance);
$blockobject->config->text = restore_decode_absolute_links($blockobject->config->text);
$blockobject->config->text = restore_decode_content_links_worker($blockobject->config->text, $restore);
- $blockobject->instance_config_commit($blockobject->pinned);
+ $blockobject->instance_config_commit();
}
}
}
diff --git a/blocks/mentees/block_mentees.php b/blocks/mentees/block_mentees.php
index cf645fe4e1a..1c7dbc745d6 100755
--- a/blocks/mentees/block_mentees.php
+++ b/blocks/mentees/block_mentees.php
@@ -38,10 +38,9 @@ class block_mentees extends block_base {
foreach ($usercontexts as $usercontext) {
$this->content->text .= '
'.fullname($usercontext).'';
}
- $this->content->text .= '';
+ $this->content->text .= '';
}
-
-
+
$this->content->footer = '';
return $this->content;
diff --git a/blocks/moodleblock.class.php b/blocks/moodleblock.class.php
index 9f1bf0159db..8a4626f4585 100644
--- a/blocks/moodleblock.class.php
+++ b/blocks/moodleblock.class.php
@@ -75,6 +75,12 @@ class block_base {
*/
public $page = NULL;
+ /**
+ * This blocks's context.
+ * @var stdClass
+ */
+ public $context = NULL;
+
/**
* An object containing the instance configuration information for the current instance of this block.
* @var stdObject $config
@@ -88,11 +94,6 @@ class block_base {
var $cron = NULL;
- /**
- * Indicates blocked is pinned - can not be moved, always present, does not have own context
- */
- var $pinned = false;
-
/// Class Functions
/**
@@ -300,16 +301,7 @@ class block_base {
* @return boolean
*/
function is_empty() {
-
- // TODO - temporary hack to get the block context only if it already exists.
- global $DB;
- if ($DB->record_exists('context', array('contextlevel' => CONTEXT_BLOCK, 'instanceid' => $this->instance->id))) {
- $context = get_context_instance(CONTEXT_BLOCK, $this->instance->id);
- } else {
- $context = get_context_instance(CONTEXT_SYSTEM); // pinned blocks do not have own context
- }
-
- if ( !has_capability('moodle/block:view', $context) ) {
+ if ( !has_capability('moodle/block:view', $this->context) ) {
return true;
}
@@ -419,15 +411,7 @@ class block_base {
* @since Moodle 2.0.
*/
protected function get_edit_controls($output) {
- global $CFG, $DB;
-
- // TODO - temporary hack to get the block context only if it already exists.
- global $DB;
- if ($DB->record_exists('context', array('contextlevel' => CONTEXT_BLOCK, 'instanceid' => $this->instance->id))) {
- $context = get_context_instance(CONTEXT_BLOCK, $this->instance->id);
- } else {
- $context = get_context_instance(CONTEXT_SYSTEM); // pinned blocks do not have own context
- }
+ global $CFG;
$returnurlparam = '&returnurl=' . urlencode($this->page->url->out_returnurl());
$actionurl = $CFG->wwwroot.'/blocks/action.php?block=' . $this->instance->id .
@@ -436,8 +420,8 @@ class block_base {
$controls = array();
// Assign roles icon.
- if ($context->contextlevel == CONTEXT_BLOCK && has_capability('moodle/role:assign', $context)) {
- $controls[] = array('url' => $CFG->wwwroot.'/'.$CFG->admin.'/roles/assign.php?contextid='.$context->id,
+ if (has_capability('moodle/role:assign', $this->context)) {
+ $controls[] = array('url' => $CFG->wwwroot.'/'.$CFG->admin.'/roles/assign.php?contextid='.$this->context->id,
'icon' => $output->old_icon_url('i/roles'), 'caption' => get_string('assignroles', 'role'));
}
@@ -604,12 +588,12 @@ class block_base {
if (!empty($instance->configdata)) {
$this->config = unserialize(base64_decode($instance->configdata));
}
- // [pj] This line below is supposed to be an optimization (we don't need configdata anymore)
- // but what it does is break in PHP5 because the same instance object will be passed to
- // this function twice in each page view, and the second time it won't have any configdata
- // so it won't work correctly. Thus it's commented out.
- // unset($instance->configdata);
$this->instance = $instance;
+ if (isset($instance->context)) {
+ $this->context = $instance->context;
+ } else {
+ $this->context = get_context_instance(CONTEXT_BLOCK, $instance->id);
+ }
$this->page = $page;
$this->specialization();
}
@@ -795,16 +779,7 @@ class block_list extends block_base {
var $content_type = BLOCK_TYPE_LIST;
function is_empty() {
-
- // TODO - temporary hack to get the block context only if it already exists.
- global $DB;
- if ($DB->record_exists('context', array('contextlevel' => CONTEXT_BLOCK, 'instanceid' => $this->instance->id))) {
- $context = get_context_instance(CONTEXT_BLOCK, $this->instance->id);
- } else {
- $context = get_context_instance(CONTEXT_SYSTEM); // pinned blocks do not have own context
- }
-
- if ( !has_capability('moodle/block:view', $context) ) {
+ if ( !has_capability('moodle/block:view', $this->context) ) {
return true;
}
diff --git a/blocks/online_users/block_online_users.php b/blocks/online_users/block_online_users.php
index d51cdc6cbb0..c850cc2cb4c 100644
--- a/blocks/online_users/block_online_users.php
+++ b/blocks/online_users/block_online_users.php
@@ -34,21 +34,10 @@ class block_online_users extends block_base {
}
$timefrom = 100 * floor((time()-$timetoshowusers) / 100); // Round to nearest 100 seconds for better query cache
- // Get context so we can check capabilities.
- $context = $this->page->context;
-
- // TODO - temporary hack to get the block context only if it already exists.
- global $DB;
- if ($DB->record_exists('context', array('contextlevel' => CONTEXT_BLOCK, 'instanceid' => $this->instance->id))) {
- $context = get_context_instance(CONTEXT_BLOCK, $this->instance->id);
- } else {
- $context = get_context_instance(CONTEXT_SYSTEM); // pinned blocks do not have own context
- }
-
//Calculate if we are in separate groups
$isseparategroups = ($this->page->course->groupmode == SEPARATEGROUPS
&& $this->page->course->groupmodeforce
- && !has_capability('moodle/site:accessallgroups', $context));
+ && !has_capability('moodle/site:accessallgroups', $this->page->context));
//Get the user current group
$currentgroup = $isseparategroups ? groups_get_course_group($this->page->course) : NULL;
@@ -81,8 +70,8 @@ class block_online_users extends block_base {
GROUP BY u.id";
} else { // Course-level
- if (!has_capability('moodle/role:viewhiddenassigns', $context)) {
- $pcontext = get_related_contexts_string($context);
+ if (!has_capability('moodle/role:viewhiddenassigns', $this->page->context)) {
+ $pcontext = get_related_contexts_string($this->page->context);
$rafrom = ", {role_assignments} ra";
$rawhere = " AND ra.userid = u.id AND ra.contextid $pcontext AND ra.hidden = 0";
}
@@ -111,7 +100,7 @@ class block_online_users extends block_base {
$minutes = floor($timetoshowusers/60);
// Verify if we can see the list of users, if not just print number of users
- if (!has_capability('block/online_users:viewlist', $context)) {
+ if (!has_capability('block/online_users:viewlist', $this->page->context)) {
if (!$usercount = $DB->count_records_sql($csql, $params)) {
$usercount = get_string("none");
}
@@ -142,7 +131,7 @@ class block_online_users extends block_base {
//Accessibility: Don't want 'Alt' text for the user picture; DO want it for the envelope/message link (existing lang string).
//Accessibility: Converted to
, inherit existing classes & styles.
$this->content->text .= "\n";
- if (!empty($USER->id) && has_capability('moodle/site:sendmessage', $context)
+ if (!empty($USER->id) && has_capability('moodle/site:sendmessage', $this->page->context)
&& !empty($CFG->messaging) && !isguest()) {
$canshowicon = true;
} else {
diff --git a/blocks/quiz_results/block_quiz_results.php b/blocks/quiz_results/block_quiz_results.php
index d24acf95d23..d7050667e61 100644
--- a/blocks/quiz_results/block_quiz_results.php
+++ b/blocks/quiz_results/block_quiz_results.php
@@ -50,8 +50,6 @@ class block_quiz_results extends block_base {
$quizid = 0;
}
- $context = $this->page->context;
-
if (empty($quizid)) {
$this->content->text = get_string('error_emptyquizid', 'block_quiz_results');
return $this->content;
@@ -84,15 +82,17 @@ class block_quiz_results extends block_base {
if (!empty($this->config->usegroups)) {
if ($inquiz) {
$cm = $this->page->cm;
+ $context = $this->page->context;
} else {
$cm = get_coursemodule_from_instance('quiz', $quizid, $courseid);
+ $context = get_context_instance(CONTEXT_MODULE, $cm->id);
}
$groupmode = groups_get_activity_groupmode($cm);
- }
- if (has_capability('moodle/site:accessallgroups', $context) && $groupmode == SEPARATEGROUPS) {
- // We 'll make an exception in this case
- $groupmode = VISIBLEGROUPS;
+ if ($groupmode == SEPARATEGROUPS && has_capability('moodle/site:accessallgroups', $context)) {
+ // We 'll make an exception in this case
+ $groupmode = VISIBLEGROUPS;
+ }
}
switch ($groupmode) {
diff --git a/blocks/rss_client/block_rss_client.php b/blocks/rss_client/block_rss_client.php
index 0b3b9f74c58..3dfc24b5e36 100644
--- a/blocks/rss_client/block_rss_client.php
+++ b/blocks/rss_client/block_rss_client.php
@@ -96,16 +96,7 @@
}
}
- // TODO - temporary hack to get the block context only if it already exists.
- global $DB;
- if ($DB->record_exists('context', array('contextlevel' => CONTEXT_BLOCK, 'instanceid' => $this->instance->id))) {
- $context = get_context_instance(CONTEXT_BLOCK, $this->instance->id);
- } else {
- $context = get_context_instance(CONTEXT_SYSTEM); // pinned blocks do not have own context
- }
-
- if (has_capability('block/rss_client:createsharedfeeds', $context)
- || has_capability('block/rss_client:createprivatefeeds', $context)) {
+ if (has_any_capability(array('block/rss_client:createsharedfeeds', 'block/rss_client:createprivatefeeds'), $this->context)) {
$page = $this->page;
//if ($page->user_allowed_editing()) { // for SUBMITTERS_ALL_ACCOUNT_HOLDERS we're going to run into trouble later if we show it and then they don't have write access to the page.
@@ -122,7 +113,7 @@
$output .= '';
} else {
// This instance has not been configured yet - show configure link?
- if (has_capability('block/rss_client:manageanyfeeds', $context)) {
+ if (has_capability('block/rss_client:manageanyfeeds', $this->context)) {
$script = $page->url->out(
array('instanceid' => $this->instance->id,
'sesskey' => sesskey(),
diff --git a/blocks/rss_client/config_instance.html b/blocks/rss_client/config_instance.html
index 2fc69e1aadc..9de7b3b3de3 100644
--- a/blocks/rss_client/config_instance.html
+++ b/blocks/rss_client/config_instance.html
@@ -93,17 +93,10 @@ print_box_start();
print $checkbox . $feedtitle .'
'."\n";
}
} else {
- // TODO - temporary hack to get the block context only if it already exists.
- global $DB;
- if ($DB->record_exists('context', array('contextlevel' => CONTEXT_BLOCK, 'instanceid' => $this->instance->id))) {
- $context = get_context_instance(CONTEXT_BLOCK, $this->instance->id);
- } else {
- $context = get_context_instance(CONTEXT_SYSTEM); // pinned blocks do not have own context
- }
print_string('nofeeds', 'block_rss_client');
- if (has_capability('block/rss_client:createprivatefeeds', $context)
- || has_capability('block/rss_client:createsharedfeeds', $context)) {
+ if (has_capability('block/rss_client:createprivatefeeds', $this->context)
+ || has_capability('block/rss_client:createsharedfeeds', $this->context)) {
$addrsspage = $page->url->out(array('instanceid' => $this->instance->id,
'sesskey' => sesskey(),
@@ -175,17 +168,10 @@ print_box_start();
} else {
global $act, $url, $rssid, $preferredtitle, $shared;
print '
'; // Closes off page form
- // TODO - temporary hack to get the block context only if it already exists.
- global $DB;
- if ($DB->record_exists('context', array('contextlevel' => CONTEXT_BLOCK, 'instanceid' => $this->instance->id))) {
- $context = get_context_instance(CONTEXT_BLOCK, $this->instance->id);
- } else {
- $context = get_context_instance(CONTEXT_SYSTEM); // pinned blocks do not have own context
- }
print_box_start();
rss_display_feeds($id, $USER->id, '', $context);
- rss_print_form($act, $url, $rssid, $preferredtitle, $shared, $id, $context);
+ rss_print_form($act, $url, $rssid, $preferredtitle, $shared, $id, $this->context);
print_box_end();
}
?>
diff --git a/blocks/rss_client/config_instance_tabs.php b/blocks/rss_client/config_instance_tabs.php
index a577497a150..a7ac1d45d8f 100644
--- a/blocks/rss_client/config_instance_tabs.php
+++ b/blocks/rss_client/config_instance_tabs.php
@@ -5,15 +5,7 @@
global $USER;
$tabs = $row = array();
- // TODO - temporary hack to get the block context only if it already exists.
- global $DB;
- if ($DB->record_exists('context', array('contextlevel' => CONTEXT_BLOCK, 'instanceid' => $this->instance->id))) {
- $context = get_context_instance(CONTEXT_BLOCK, $this->instance->id);
- } else {
- $context = get_context_instance(CONTEXT_SYSTEM); // pinned blocks do not have own context
- }
-
-if (has_capability('moodle/site:manageblocks', $context)) {
+if (has_capability('moodle/site:manageblocks', $this->context)) {
$script = $page->url->out(array('instanceid' => $this->instance->id, 'sesskey' => sesskey(), 'blockaction' => 'config', 'currentaction' => 'configblock', 'id' => $id, 'section' => 'rss'));
$row[] = new tabobject('configblock', $script,
get_string('configblock', 'block_rss_client'));
diff --git a/lib/accesslib.php b/lib/accesslib.php
index 325bd485b50..3124f5024ad 100755
--- a/lib/accesslib.php
+++ b/lib/accesslib.php
@@ -483,8 +483,9 @@ function has_capability($capability, $context, $userid=NULL, $doanything=true) {
if (empty($USER->id)) {
// Session not set up yet.
$userid = 0;
+ } else {
+ $userid = $USER->id;
}
- $userid = $USER->id;
}
if (is_null($context->path) or $context->depth == 0) {
@@ -2221,11 +2222,10 @@ function create_context($contextlevel, $instanceid) {
break;
case CONTEXT_BLOCK:
- // Only non-pinned & course-page based
$sql = "SELECT ctx.path, ctx.depth
FROM {context} ctx
JOIN {block_instances} bi ON (bi.parentcontextid=ctx.id)
- WHERE bi.id=? AND ctx.contextlevel=?";
+ WHERE bi.id = ?";
$params = array($instanceid, CONTEXT_COURSE);
if ($p = $DB->get_record_sql($sql, $params)) {
$basepath = $p->path;
@@ -2410,7 +2410,8 @@ function create_contexts($contextlevel=null, $buildpaths=true) {
}
- if (empty($contextlevel) or $contextlevel == CONTEXT_MODULE) {
+ if (empty($contextlevel) or $contextlevel == CONTEXT_MODULE
+ or $contextlevel == CONTEXT_BLOCK) {
$sql = "INSERT INTO {context} (contextlevel, instanceid)
SELECT ".CONTEXT_MODULE.", cm.id
FROM {course}_modules cm
@@ -2420,6 +2421,19 @@ function create_contexts($contextlevel=null, $buildpaths=true) {
$DB->execute($sql);
}
+ if (empty($contextlevel) or $contextlevel == CONTEXT_USER
+ or $contextlevel == CONTEXT_BLOCK) {
+ $sql = "INSERT INTO {context} (contextlevel, instanceid)
+ SELECT ".CONTEXT_USER.", u.id
+ FROM {user} u
+ WHERE u.deleted=0
+ AND NOT EXISTS (SELECT 'x'
+ FROM {context} cx
+ WHERE u.id = cx.instanceid AND cx.contextlevel=".CONTEXT_USER.")";
+ $DB->execute($sql);
+
+ }
+
if (empty($contextlevel) or $contextlevel == CONTEXT_BLOCK) {
$sql = "INSERT INTO {context} (contextlevel, instanceid)
SELECT ".CONTEXT_BLOCK.", bi.id
@@ -2430,18 +2444,6 @@ function create_contexts($contextlevel=null, $buildpaths=true) {
$DB->execute($sql);
}
- if (empty($contextlevel) or $contextlevel == CONTEXT_USER) {
- $sql = "INSERT INTO {context} (contextlevel, instanceid)
- SELECT ".CONTEXT_USER.", u.id
- FROM {user} u
- WHERE u.deleted=0
- AND NOT EXISTS (SELECT 'x'
- FROM {context} cx
- WHERE u.id = cx.instanceid AND cx.contextlevel=".CONTEXT_USER.")";
- $DB->execute($sql);
-
- }
-
if ($buildpaths) {
build_context_path(false);
}
@@ -2513,10 +2515,10 @@ function cleanup_contexts() {
}
/**
- * Preloads all contexts relating to a course: course, modules, and blocks.
+ * Preloads all contexts relating to a course: course, modules. Block contexts
+ * are no longer loaded here. The contexts for all the blocks on the current
+ * page are now efficiently loaded by {@link block_manager::load_blocks()}.
*
- * @global object
- * @global object
* @param int $courseid Course ID
* @return void
*/
@@ -2535,15 +2537,6 @@ function preload_course_contexts($courseid) {
JOIN {context} x ON x.instanceid=cm.id
WHERE cm.course=? AND x.contextlevel=".CONTEXT_MODULE."
- UNION ALL
-
- SELECT x.instanceid, x.id, x.contextlevel, x.path, x.depth
- FROM {context} px
- JOIN {block_instances} bi ON bi.parentcontextid = px.id
- JOIN {context} x ON x.instanceid=bi.id
- WHERE px.instanceid = ? AND px.contextlevel = ".CONTEXT_COURSE."
- AND x.contextlevel=".CONTEXT_BLOCK."
-
UNION ALL
SELECT x.instanceid, x.id, x.contextlevel, x.path, x.depth
@@ -2564,8 +2557,6 @@ function preload_course_contexts($courseid) {
*
* @todo Remove code branch from previous fix MDL-9016 which is no longer needed
*
- * @global object
- * @global object
* @param integer $level The context level, for example CONTEXT_COURSE, or CONTEXT_MODULE.
* @param integer $instance The instance id. For $level = CONTEXT_COURSE, this would be $course->id,
* for $level = CONTEXT_MODULE, this would be $cm->id. And so on. Defaults to 0
@@ -3482,7 +3473,7 @@ function print_context_name($context, $withprefix = true, $short = false) {
$name = '';
switch ($context->contextlevel) {
- case CONTEXT_SYSTEM: // by now it's a definite an inherit
+ case CONTEXT_SYSTEM:
$name = get_string('coresystem');
break;
@@ -3495,7 +3486,7 @@ function print_context_name($context, $withprefix = true, $short = false) {
}
break;
- case CONTEXT_COURSECAT: // Coursecat -> coursecat or site
+ case CONTEXT_COURSECAT:
if ($category = $DB->get_record('course_categories', array('id'=>$context->instanceid))) {
if ($withprefix){
$name = get_string('category').': ';
@@ -3504,7 +3495,7 @@ function print_context_name($context, $withprefix = true, $short = false) {
}
break;
- case CONTEXT_COURSE: // 1 to 1 to course cat
+ case CONTEXT_COURSE:
if ($context->instanceid == SITEID) {
$name = get_string('frontpage', 'admin');
} else {
@@ -3521,7 +3512,7 @@ function print_context_name($context, $withprefix = true, $short = false) {
}
break;
- case CONTEXT_MODULE: // 1 to 1 to course
+ case CONTEXT_MODULE:
if ($cm = $DB->get_record_sql('SELECT cm.*, md.name AS modname FROM {course_modules} cm ' .
'JOIN {modules} md ON md.id = cm.module WHERE cm.id = ?', array($context->instanceid))) {
if ($mod = $DB->get_record($cm->modname, array('id' => $cm->instance))) {
@@ -3533,7 +3524,7 @@ function print_context_name($context, $withprefix = true, $short = false) {
}
break;
- case CONTEXT_BLOCK: // not necessarily 1 to 1 to course
+ case CONTEXT_BLOCK:
if ($blockinstance = $DB->get_record('block_instances', array('id'=>$context->instanceid))) {
global $CFG;
require_once("$CFG->dirroot/blocks/moodleblock.class.php");
@@ -3893,14 +3884,12 @@ function get_sorted_contexts($select, $params = array()) {
* displayed in the course page.
*
* For course category contexts it will return categories and courses. It will
- * NOT recurse into courses - if you want to do that, call it on the returned
- * courses.
+ * NOT recurse into courses, nor return blocks on the category pages. If you
+ * want to do that, call it on the returned courses.
*
* If called on a course context it _will_ populate the cache with the appropriate
* contexts ;-)
*
- * @global object
- * @global object
* @param object $context.
* @return array Array of child records
*/
@@ -3920,14 +3909,23 @@ function get_child_contexts($context) {
break;
case CONTEXT_MODULE:
- // No children.
- return array();
- break;
+ // Find
+ // - blocks under this context path.
+ $sql = " SELECT ctx.*
+ FROM {context} ctx
+ WHERE ctx.path LIKE ?
+ AND ctx.contextlevel = ".CONTEXT_BLOCK;
+ $params = array("{$context->path}/%", $context->instanceid);
+ $records = $DB->get_recordset_sql($sql, $params);
+ foreach ($records as $rec) {
+ cache_context($rec);
+ }
+ return $records;
+ break;
case CONTEXT_COURSE:
// Find
- // - module instances - easy
- // - blocks assigned to the course-view page explicitly - easy
+ // - modules and blocks under this context path.
$sql = " SELECT ctx.*
FROM {context} ctx
WHERE ctx.path LIKE ?
@@ -3957,9 +3955,20 @@ function get_child_contexts($context) {
break;
case CONTEXT_USER:
- // No children.
- return array();
- break;
+ // Find
+ // - blocks under this context path.
+ $sql = " SELECT ctx.*
+ FROM {context} ctx
+ WHERE ctx.path LIKE ?
+ AND ctx.contextlevel = ".CONTEXT_BLOCK;
+ $params = array("{$context->path}/%", $context->instanceid);
+ $records = $DB->get_recordset_sql($sql, $params);
+ foreach ($records as $rec) {
+ cache_context($rec);
+ }
+ return $records;
+ break;
+ break;
case CONTEXT_SYSTEM:
// Just get all the contexts except for CONTEXT_SYSTEM level
@@ -3973,7 +3982,7 @@ function get_child_contexts($context) {
default:
print_error('unknowcontext', '', '', $context->contextlevel);
- return false;
+ return false;
}
}
@@ -5828,10 +5837,16 @@ function role_fix_names($roleoptions, $context, $rolenamedisplay=ROLENAME_ALIAS)
// If necessary, get the localised names.
if ($rolenamedisplay != ROLENAME_ORIGINAL && !empty($context->id)) {
// Make sure we have a course context.
- if ($context->contextlevel == CONTEXT_MODULE || $context->contextlevel == CONTEXT_BLOCK) { // find the parent course context
+ if ($context->contextlevel == CONTEXT_MODULE) {
if ($parentcontextid = array_shift(get_parent_contexts($context))) {
$context = get_context_instance_by_id($parentcontextid);
}
+ } else if ($context->contextlevel == CONTEXT_BLOCK) {
+ do {
+ if ($parentcontextid = array_shift(get_parent_contexts($context))) {
+ $context = get_context_instance_by_id($parentcontextid);
+ }
+ } while ($parentcontextid && $context->contextlevel != CONTEXT_COURSE);
}
// The get the relevant renames, and use them.
@@ -5925,8 +5940,6 @@ function rebuild_contexts(array $fixcontexts) {
/**
* Populate context.path and context.depth where missing.
*
- * @global object
- * @global object
* @param bool $force force a complete rebuild of the path and depth fields, defaults to false
*/
function build_context_path($force=false) {
diff --git a/lib/blocklib.php b/lib/blocklib.php
index f6cb661198d..f667c86b23d 100644
--- a/lib/blocklib.php
+++ b/lib/blocklib.php
@@ -407,6 +407,7 @@ class block_manager {
'contextid1' => $context->id,
'contextid2' => $context->id,
'pagetype' => $this->page->pagetype,
+ 'contextblock' => CONTEXT_BLOCK,
);
$sql = "SELECT
bi.id,
@@ -419,7 +420,11 @@ class block_manager {
COALESCE(bp.visible, 1) AS visible,
COALESCE(bp.region, bi.defaultregion) AS region,
COALESCE(bp.weight, bi.defaultweight) AS weight,
- bi.configdata
+ bi.configdata,
+ ctx.id AS ctxid,
+ ctx.path AS ctxpath,
+ ctx.depth AS ctxdepth,
+ ctx.contextlevel AS ctxlevel
FROM {block_instances} bi
JOIN {block} b ON bi.blockname = b.name
@@ -427,6 +432,8 @@ class block_manager {
AND bp.contextid = :contextid1
AND bp.pagetype = :pagetype
AND bp.subpage = :subpage1
+ JOIN {context} ctx ON ctx.contextlevel = :contextblock
+ AND ctx.instanceid = bi.id
WHERE
$contexttest
@@ -444,6 +451,7 @@ class block_manager {
$this->birecordsbyregion = $this->prepare_per_region_arrays();
$unknown = array();
foreach ($blockinstances as $bi) {
+ $bi = make_context_subobj($bi);
if ($this->is_known_region($bi->region)) {
$this->birecordsbyregion[$bi->region][] = $bi;
} else {
@@ -491,12 +499,11 @@ class block_manager {
$blockinstance->configdata = '';
$blockinstance->id = $DB->insert_record('block_instances', $blockinstance);
- if ($this->page->context->contextlevel == CONTEXT_COURSE) {
- get_context_instance(CONTEXT_BLOCK, $blockinstance->id);
- }
+ // Ensure the block context is created.
+ get_context_instance(CONTEXT_BLOCK, $blockinstance->id);
// If the new instance was created, allow it to do additional setup
- if($block = block_instance($blockname, $blockinstance)) {
+ if ($block = block_instance($blockname, $blockinstance)) {
$block->instance_create();
}
}
diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php
index 27d603694d4..8371ff076f2 100644
--- a/lib/db/upgrade.php
+++ b/lib/db/upgrade.php
@@ -2302,8 +2302,29 @@ WHERE gradeitemid IS NOT NULL AND grademax IS NOT NULL");
upgrade_main_savepoint($result, 2009071000);
}
+ if ($result && $oldversion < 2009071300) {
+
+ /// Create contexts for every block. In the past, only non-sticky course block had contexts.
+ /// This is a copy of the code in create_contexts.
+ $sql = "INSERT INTO {context} (contextlevel, instanceid)
+ SELECT " . CONTEXT_BLOCK . ", bi.id
+ FROM {block_instances} bi
+ WHERE NOT EXISTS (SELECT 'x'
+ FROM {context} ctx
+ WHERE bi.id = ctx.instanceid AND ctx.contextlevel=" . CONTEXT_BLOCK . ")";
+ $DB->execute($sql);
+
+ /// TODO MDL-19776 We should not really use API funcitons in upgrade.
+ /// If MDL-19776 is done, we can remove this whole upgrade block.
+ build_context_path();
+
+ /// Main savepoint reached
+ upgrade_main_savepoint($result, 2009071300);
+ }
+
return $result;
}
-//TODO: before 2.0 release
-// 1/ remove the automatic enabling of completion lib if debug enabled
\ No newline at end of file
+//TODO: Before 2.0 release
+// 1/ remove the automatic enabling of completion lib if debug enabled ( in 2008121701 block)
+// 2/ move 2009061300 block to the top of the file so that we may log upgrade queries
diff --git a/version.php b/version.php
index 97234875aa2..e2fd037dae0 100644
--- a/version.php
+++ b/version.php
@@ -6,7 +6,7 @@
// This is compared against the values stored in the database to determine
// whether upgrades should be performed (see lib/db/*.php)
- $version = 2009071000; // YYYYMMDD = date of the last version bump
+ $version = 2009071300; // YYYYMMDD = date of the last version bump
// XX = daily increments
$release = '2.0 dev (Build: 20090713)'; // Human-friendly version name