mirror of
https://github.com/moodle/moodle.git
synced 2025-08-05 08:56:36 +02:00

Credit: original version done by Kirill Astashov of NetSpot (netspot.com.au), finished and tweaked by sam. This change adds conditional availability support for sections analagous to that already available for activities. (Backend, UI, backup/restore.) In order that this feature does not reduce performance, section cacheing has also been added using a new course 'sectioncache' field analagous to modinfo. The new feature integrates with activity availability so that activities inside sections which are not available are automatically not available themselves (meaning it works to restrict access).
244 lines
9.3 KiB
PHP
244 lines
9.3 KiB
PHP
<?php
|
|
|
|
// Display the course home page.
|
|
|
|
require_once('../config.php');
|
|
require_once('lib.php');
|
|
require_once($CFG->dirroot.'/mod/forum/lib.php');
|
|
require_once($CFG->libdir.'/conditionlib.php');
|
|
require_once($CFG->libdir.'/completionlib.php');
|
|
|
|
$id = optional_param('id', 0, PARAM_INT);
|
|
$name = optional_param('name', '', PARAM_RAW);
|
|
$edit = optional_param('edit', -1, PARAM_BOOL);
|
|
$hide = optional_param('hide', 0, PARAM_INT);
|
|
$show = optional_param('show', 0, PARAM_INT);
|
|
$idnumber = optional_param('idnumber', '', PARAM_RAW);
|
|
$section = optional_param('section', 0, PARAM_INT);
|
|
$move = optional_param('move', 0, PARAM_INT);
|
|
$marker = optional_param('marker',-1 , PARAM_INT);
|
|
$switchrole = optional_param('switchrole',-1, PARAM_INT);
|
|
|
|
$params = array();
|
|
if (!empty($name)) {
|
|
$params = array('shortname' => $name);
|
|
} else if (!empty($idnumber)) {
|
|
$params = array('idnumber' => $idnumber);
|
|
} else if (!empty($id)) {
|
|
$params = array('id' => $id);
|
|
}else {
|
|
print_error('unspecifycourseid', 'error');
|
|
}
|
|
|
|
$course = $DB->get_record('course', $params, '*', MUST_EXIST);
|
|
|
|
$urlparams = array('id' => $course->id);
|
|
if ($section) {
|
|
$urlparams['section'] = $section;
|
|
}
|
|
|
|
$PAGE->set_url('/course/view.php', $urlparams); // Defined here to avoid notices on errors etc
|
|
|
|
preload_course_contexts($course->id);
|
|
$context = context_course::instance($course->id, MUST_EXIST);
|
|
|
|
// Remove any switched roles before checking login
|
|
if ($switchrole == 0 && confirm_sesskey()) {
|
|
role_switch($switchrole, $context);
|
|
}
|
|
|
|
require_login($course);
|
|
|
|
// Switchrole - sanity check in cost-order...
|
|
$reset_user_allowed_editing = false;
|
|
if ($switchrole > 0 && confirm_sesskey() &&
|
|
has_capability('moodle/role:switchroles', $context)) {
|
|
// is this role assignable in this context?
|
|
// inquiring minds want to know...
|
|
$aroles = get_switchable_roles($context);
|
|
if (is_array($aroles) && isset($aroles[$switchrole])) {
|
|
role_switch($switchrole, $context);
|
|
// Double check that this role is allowed here
|
|
require_login($course);
|
|
}
|
|
// reset course page state - this prevents some weird problems ;-)
|
|
$USER->activitycopy = false;
|
|
$USER->activitycopycourse = NULL;
|
|
unset($USER->activitycopyname);
|
|
unset($SESSION->modform);
|
|
$USER->editing = 0;
|
|
$reset_user_allowed_editing = true;
|
|
}
|
|
|
|
//If course is hosted on an external server, redirect to corresponding
|
|
//url with appropriate authentication attached as parameter
|
|
if (file_exists($CFG->dirroot .'/course/externservercourse.php')) {
|
|
include $CFG->dirroot .'/course/externservercourse.php';
|
|
if (function_exists('extern_server_course')) {
|
|
if ($extern_url = extern_server_course($course)) {
|
|
redirect($extern_url);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
require_once($CFG->dirroot.'/calendar/lib.php'); /// This is after login because it needs $USER
|
|
|
|
//TODO: danp do we need different urls?
|
|
add_to_log($course->id, 'course', 'view', "view.php?id=$course->id", "$course->id");
|
|
|
|
$course->format = clean_param($course->format, PARAM_ALPHA);
|
|
if (!file_exists($CFG->dirroot.'/course/format/'.$course->format.'/format.php')) {
|
|
$course->format = 'weeks'; // Default format is weeks
|
|
}
|
|
|
|
$PAGE->set_pagelayout('course');
|
|
$PAGE->set_pagetype('course-view-' . $course->format);
|
|
$PAGE->set_other_editing_capability('moodle/course:manageactivities');
|
|
|
|
if ($reset_user_allowed_editing) {
|
|
// ugly hack
|
|
unset($PAGE->_user_allowed_editing);
|
|
}
|
|
|
|
if (!isset($USER->editing)) {
|
|
$USER->editing = 0;
|
|
}
|
|
if ($PAGE->user_allowed_editing()) {
|
|
if (($edit == 1) and confirm_sesskey()) {
|
|
$USER->editing = 1;
|
|
// Redirect to site root if Editing is toggled on frontpage
|
|
if ($course->id == SITEID) {
|
|
redirect($CFG->wwwroot .'/?redirect=0');
|
|
} else {
|
|
redirect($PAGE->url);
|
|
}
|
|
} else if (($edit == 0) and confirm_sesskey()) {
|
|
$USER->editing = 0;
|
|
if(!empty($USER->activitycopy) && $USER->activitycopycourse == $course->id) {
|
|
$USER->activitycopy = false;
|
|
$USER->activitycopycourse = NULL;
|
|
}
|
|
// Redirect to site root if Editing is toggled on frontpage
|
|
if ($course->id == SITEID) {
|
|
redirect($CFG->wwwroot .'/?redirect=0');
|
|
} else {
|
|
redirect($PAGE->url);
|
|
}
|
|
}
|
|
|
|
if (has_capability('moodle/course:update', $context)) {
|
|
if ($hide && confirm_sesskey()) {
|
|
set_section_visible($course->id, $hide, '0');
|
|
redirect($PAGE->url);
|
|
}
|
|
|
|
if ($show && confirm_sesskey()) {
|
|
set_section_visible($course->id, $show, '1');
|
|
redirect($PAGE->url);
|
|
}
|
|
|
|
if (!empty($section)) {
|
|
if (!empty($move) and confirm_sesskey()) {
|
|
if (move_section($course, $section, $move)) {
|
|
if ($course->id == SITEID) {
|
|
redirect($CFG->wwwroot . '/?redirect=0');
|
|
} else {
|
|
redirect(course_get_url($course));
|
|
}
|
|
} else {
|
|
echo $OUTPUT->notification('An error occurred while moving a section');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
$USER->editing = 0;
|
|
}
|
|
|
|
$SESSION->fromdiscussion = $PAGE->url->out(false);
|
|
|
|
|
|
if ($course->id == SITEID) {
|
|
// This course is not a real course.
|
|
redirect($CFG->wwwroot .'/');
|
|
}
|
|
|
|
$completion = new completion_info($course);
|
|
if ($completion->is_enabled() && ajaxenabled()) {
|
|
$PAGE->requires->string_for_js('completion-title-manual-y', 'completion');
|
|
$PAGE->requires->string_for_js('completion-title-manual-n', 'completion');
|
|
$PAGE->requires->string_for_js('completion-alt-manual-y', 'completion');
|
|
$PAGE->requires->string_for_js('completion-alt-manual-n', 'completion');
|
|
|
|
$PAGE->requires->js_init_call('M.core_completion.init');
|
|
}
|
|
|
|
// We are currently keeping the button here from 1.x to help new teachers figure out
|
|
// what to do, even though the link also appears in the course admin block. It also
|
|
// means you can back out of a situation where you removed the admin block. :)
|
|
if ($PAGE->user_allowed_editing()) {
|
|
$buttons = $OUTPUT->edit_button($PAGE->url);
|
|
$PAGE->set_button($buttons);
|
|
}
|
|
|
|
$PAGE->set_title(get_string('course') . ': ' . $course->fullname);
|
|
$PAGE->set_heading($course->fullname);
|
|
echo $OUTPUT->header();
|
|
|
|
if ($completion->is_enabled() && ajaxenabled()) {
|
|
// This value tracks whether there has been a dynamic change to the page.
|
|
// It is used so that if a user does this - (a) set some tickmarks, (b)
|
|
// go to another page, (c) clicks Back button - the page will
|
|
// automatically reload. Otherwise it would start with the wrong tick
|
|
// values.
|
|
echo html_writer::start_tag('form', array('action'=>'.', 'method'=>'get'));
|
|
echo html_writer::start_tag('div');
|
|
echo html_writer::empty_tag('input', array('type'=>'hidden', 'id'=>'completion_dynamic_change', 'name'=>'completion_dynamic_change', 'value'=>'0'));
|
|
echo html_writer::end_tag('div');
|
|
echo html_writer::end_tag('form');
|
|
}
|
|
|
|
// Course wrapper start.
|
|
echo html_writer::start_tag('div', array('class'=>'course-content'));
|
|
|
|
$modinfo = get_fast_modinfo($COURSE);
|
|
get_all_mods($course->id, $mods, $modnames, $modnamesplural, $modnamesused);
|
|
foreach($mods as $modid=>$unused) {
|
|
if (!isset($modinfo->cms[$modid])) {
|
|
rebuild_course_cache($course->id);
|
|
$modinfo = get_fast_modinfo($COURSE);
|
|
debugging('Rebuilding course cache', DEBUG_DEVELOPER);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (! $sections = $modinfo->get_section_info_all()) { // No sections found
|
|
$section = new stdClass;
|
|
$section->course = $course->id; // Create a default section.
|
|
$section->section = 0;
|
|
$section->visible = 1;
|
|
$section->summaryformat = FORMAT_HTML;
|
|
$section->id = $DB->insert_record('course_sections', $section);
|
|
rebuild_course_cache($course->id);
|
|
$modinfo = get_fast_modinfo($COURSE);
|
|
if (! $sections = $modinfo->get_section_info_all()) { // Try again
|
|
print_error('cannotcreateorfindstructs', 'error');
|
|
}
|
|
}
|
|
|
|
// CAUTION, hacky fundamental variable defintion to follow!
|
|
// Note that because of the way course fromats are constructed though
|
|
// inclusion we pass parameters around this way..
|
|
$displaysection = $section;
|
|
|
|
// Include the actual course format.
|
|
require($CFG->dirroot .'/course/format/'. $course->format .'/format.php');
|
|
// Content wrapper end.
|
|
|
|
echo html_writer::end_tag('div');
|
|
|
|
// Include the command toolbox YUI module
|
|
include_course_ajax($course, $modnamesused);
|
|
|
|
echo $OUTPUT->footer();
|