Merge branch 'MDL-79937_fixlessonmatching' of https://github.com/catalystfd/moodle
[moodle.git] / course / mod.php
blob3fc5647df946a3646b71a67f85b7da9a58d866e6
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
18 /**
19 * Moves, adds, updates, duplicates or deletes modules in a course
21 * @copyright 1999 Martin Dougiamas http://dougiamas.com
22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23 * @package course
26 require("../config.php");
27 require_once("lib.php");
29 $sectionreturn = optional_param('sr', null, PARAM_INT);
30 $add = optional_param('add', '', PARAM_ALPHANUM);
31 $type = optional_param('type', '', PARAM_ALPHA);
32 $indent = optional_param('indent', 0, PARAM_INT);
33 $update = optional_param('update', 0, PARAM_INT);
34 $duplicate = optional_param('duplicate', 0, PARAM_INT);
35 $hide = optional_param('hide', 0, PARAM_INT);
36 $stealth = optional_param('stealth', 0, PARAM_INT);
37 $show = optional_param('show', 0, PARAM_INT);
38 $copy = optional_param('copy', 0, PARAM_INT);
39 $moveto = optional_param('moveto', 0, PARAM_INT);
40 $movetosection = optional_param('movetosection', 0, PARAM_INT);
41 $delete = optional_param('delete', 0, PARAM_INT);
42 $course = optional_param('course', 0, PARAM_INT);
43 $groupmode = optional_param('groupmode', -1, PARAM_INT);
44 $cancelcopy = optional_param('cancelcopy', 0, PARAM_BOOL);
45 $confirm = optional_param('confirm', 0, PARAM_BOOL);
47 // This page should always redirect
48 $url = new moodle_url('/course/mod.php');
49 foreach (compact('indent','update','hide','show','copy','moveto','movetosection','delete','course','cancelcopy','confirm') as $key=>$value) {
50 if ($value !== 0) {
51 $url->param($key, $value);
54 $url->param('sr', $sectionreturn);
55 if ($add !== '') {
56 $url->param('add', $add);
58 if ($type !== '') {
59 $url->param('type', $type);
61 if ($groupmode !== '') {
62 $url->param('groupmode', $groupmode);
64 $PAGE->set_url($url);
66 require_login();
68 //check if we are adding / editing a module that has new forms using formslib
69 if (!empty($add)) {
70 $id = required_param('id', PARAM_INT);
71 $section = required_param('section', PARAM_INT);
72 $type = optional_param('type', '', PARAM_ALPHA);
73 $returntomod = optional_param('return', 0, PARAM_BOOL);
74 $beforemod = optional_param('beforemod', 0, PARAM_INT);
76 redirect(
77 new moodle_url(
78 '/course/modedit.php',
80 'add' => $add,
81 'type' => $type,
82 'course' => $id,
83 'section' => $section,
84 'return' => $returntomod,
85 'sr' => $sectionreturn,
86 'beforemod' => $beforemod,
91 } else if (!empty($update)) {
92 $cm = get_coursemodule_from_id('', $update, 0, true, MUST_EXIST);
93 $returntomod = optional_param('return', 0, PARAM_BOOL);
94 redirect("$CFG->wwwroot/course/modedit.php?update=$update&return=$returntomod&sr=$sectionreturn");
96 } else if (!empty($duplicate) and confirm_sesskey()) {
97 $cm = get_coursemodule_from_id('', $duplicate, 0, true, MUST_EXIST);
98 $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
100 require_login($course, false, $cm);
101 $modcontext = context_module::instance($cm->id);
102 require_capability('moodle/course:manageactivities', $modcontext);
104 // Duplicate the module.
105 $newcm = duplicate_module($course, $cm);
106 redirect(course_get_url($course, $cm->sectionnum, array('sr' => $sectionreturn)));
108 } else if (!empty($delete)) {
109 $cm = get_coursemodule_from_id('', $delete, 0, true, MUST_EXIST);
110 $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
112 require_login($course, false, $cm);
113 $modcontext = context_module::instance($cm->id);
114 require_capability('moodle/course:manageactivities', $modcontext);
116 $return = course_get_url($course, $cm->sectionnum, array('sr' => $sectionreturn));
118 if (!$confirm or !confirm_sesskey()) {
119 $fullmodulename = get_string('modulename', $cm->modname);
121 $optionsyes = array('confirm'=>1, 'delete'=>$cm->id, 'sesskey'=>sesskey(), 'sr' => $sectionreturn);
123 $strdeletecheck = get_string('deletecheck', '', $fullmodulename);
124 $strparams = (object)array('type' => $fullmodulename, 'name' => $cm->name);
125 $strdeletechecktypename = get_string('deletechecktypename', '', $strparams);
127 $PAGE->set_pagetype('mod-' . $cm->modname . '-delete');
128 $PAGE->set_title($strdeletecheck);
129 $PAGE->set_heading($course->fullname);
130 $PAGE->navbar->add($strdeletecheck);
132 echo $OUTPUT->header();
133 echo $OUTPUT->box_start('noticebox');
134 $formcontinue = new single_button(new moodle_url("$CFG->wwwroot/course/mod.php", $optionsyes), get_string('yes'));
135 $formcancel = new single_button($return, get_string('no'), 'get');
136 echo $OUTPUT->confirm($strdeletechecktypename, $formcontinue, $formcancel);
137 echo $OUTPUT->box_end();
138 echo $OUTPUT->footer();
140 exit;
143 // Delete the module.
144 course_delete_module($cm->id);
146 redirect($return);
150 if ((!empty($movetosection) or !empty($moveto)) and confirm_sesskey()) {
151 $cm = get_coursemodule_from_id('', $USER->activitycopy, 0, true, MUST_EXIST);
152 $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
154 require_login($course, false, $cm);
155 $coursecontext = context_course::instance($course->id);
156 $modcontext = context_module::instance($cm->id);
157 require_capability('moodle/course:manageactivities', $modcontext);
159 if (!empty($movetosection)) {
160 if (!$section = $DB->get_record('course_sections', array('id'=>$movetosection, 'course'=>$cm->course))) {
161 throw new \moodle_exception('sectionnotexist');
163 $beforecm = NULL;
165 } else { // normal moveto
166 if (!$beforecm = get_coursemodule_from_id('', $moveto, $cm->course, true)) {
167 throw new \moodle_exception('invalidcoursemodule');
169 if (!$section = $DB->get_record('course_sections', array('id'=>$beforecm->section, 'course'=>$cm->course))) {
170 throw new \moodle_exception('sectionnotexist');
174 if (!ismoving($section->course)) {
175 throw new \moodle_exception('needcopy', '', "view.php?id=$section->course");
178 moveto_module($cm, $section, $beforecm);
180 $sectionreturn = $USER->activitycopysectionreturn;
181 unset($USER->activitycopy);
182 unset($USER->activitycopycourse);
183 unset($USER->activitycopyname);
184 unset($USER->activitycopysectionreturn);
186 redirect(course_get_url($course, $section->section, array('sr' => $sectionreturn)));
188 } else if (!empty($indent) and confirm_sesskey()) {
189 $id = required_param('id', PARAM_INT);
191 $cm = get_coursemodule_from_id('', $id, 0, true, MUST_EXIST);
192 $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
194 require_login($course, false, $cm);
195 $coursecontext = context_course::instance($course->id);
196 $modcontext = context_module::instance($cm->id);
197 require_capability('moodle/course:manageactivities', $modcontext);
199 $cm->indent += $indent;
201 if ($cm->indent < 0) {
202 $cm->indent = 0;
205 $DB->set_field('course_modules', 'indent', $cm->indent, array('id'=>$cm->id));
207 \course_modinfo::purge_course_module_cache($cm->course, $cm->id);
208 // Rebuild invalidated module cache.
209 rebuild_course_cache($cm->course, false, true);
211 redirect(course_get_url($course, $cm->sectionnum, array('sr' => $sectionreturn)));
213 } else if (!empty($hide) and confirm_sesskey()) {
214 $cm = get_coursemodule_from_id('', $hide, 0, true, MUST_EXIST);
215 $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
217 require_login($course, false, $cm);
218 $coursecontext = context_course::instance($course->id);
219 $modcontext = context_module::instance($cm->id);
220 require_capability('moodle/course:activityvisibility', $modcontext);
222 if (set_coursemodule_visible($cm->id, 0)) {
223 \core\event\course_module_updated::create_from_cm($cm, $modcontext)->trigger();
225 redirect(course_get_url($course, $cm->sectionnum, array('sr' => $sectionreturn)));
227 } else if (!empty($stealth) and confirm_sesskey()) {
228 list($course, $cm) = get_course_and_cm_from_cmid($stealth);
229 require_login($course, false, $cm);
230 require_capability('moodle/course:activityvisibility', $cm->context);
232 if (set_coursemodule_visible($cm->id, 1, 0)) {
233 \core\event\course_module_updated::create_from_cm($cm)->trigger();
235 redirect(course_get_url($course, $cm->sectionnum, array('sr' => $sectionreturn)));
237 } else if (!empty($show) and confirm_sesskey()) {
238 list($course, $cm) = get_course_and_cm_from_cmid($show);
239 require_login($course, false, $cm);
240 require_capability('moodle/course:activityvisibility', $cm->context);
241 $section = $cm->get_section_info();
243 if (set_coursemodule_visible($cm->id, 1)) {
244 \core\event\course_module_updated::create_from_cm($cm)->trigger();
246 redirect(course_get_url($course, $section->section, array('sr' => $sectionreturn)));
248 } else if ($groupmode > -1 and confirm_sesskey()) {
249 $id = required_param('id', PARAM_INT);
251 $cm = get_coursemodule_from_id('', $id, 0, true, MUST_EXIST);
252 $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
254 require_login($course, false, $cm);
255 $coursecontext = context_course::instance($course->id);
256 $modcontext = context_module::instance($cm->id);
257 require_capability('moodle/course:manageactivities', $modcontext);
259 set_coursemodule_groupmode($cm->id, $groupmode);
260 \core\event\course_module_updated::create_from_cm($cm, $modcontext)->trigger();
261 redirect(course_get_url($course, $cm->sectionnum, array('sr' => $sectionreturn)));
263 } else if (!empty($copy) and confirm_sesskey()) { // value = course module
264 $cm = get_coursemodule_from_id('', $copy, 0, true, MUST_EXIST);
265 $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
267 require_login($course, false, $cm);
268 $coursecontext = context_course::instance($course->id);
269 $modcontext = context_module::instance($cm->id);
270 require_capability('moodle/course:manageactivities', $modcontext);
272 $section = $DB->get_record('course_sections', array('id'=>$cm->section), '*', MUST_EXIST);
274 $USER->activitycopy = $copy;
275 $USER->activitycopycourse = $cm->course;
276 $USER->activitycopyname = $cm->name;
277 $USER->activitycopysectionreturn = $sectionreturn;
279 redirect(course_get_url($course, $section->section, array('sr' => $sectionreturn)));
281 } else if (!empty($cancelcopy) and confirm_sesskey()) { // value = course module
283 $courseid = $USER->activitycopycourse;
284 $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
286 $cm = get_coursemodule_from_id('', $USER->activitycopy, 0, true, IGNORE_MISSING);
287 $sectionreturn = $USER->activitycopysectionreturn;
288 unset($USER->activitycopy);
289 unset($USER->activitycopycourse);
290 unset($USER->activitycopyname);
291 unset($USER->activitycopysectionreturn);
292 redirect(course_get_url($course, $cm->sectionnum, array('sr' => $sectionreturn)));
293 } else {
294 throw new \moodle_exception('unknowaction');