MDL-17457 migrated all modules to new db/install.php; added upgrade.txt file for...
[moodle.git] / enrol / manual / enrol.php
1 <?php   /// $Id$
2 ///////////////////////////////////////////////////////////////////////////
3 //                                                                       //
4 // NOTICE OF COPYRIGHT                                                   //
5 //                                                                       //
6 // Moodle - Modular Object-Oriented Dynamic Learning Environment         //
7 //          http://moodle.org                                            //
8 //                                                                       //
9 // Copyright (C) 2004  Martin Dougiamas  http://moodle.com               //
10 //                                                                       //
11 // This program is free software; you can redistribute it and/or modify  //
12 // it under the terms of the GNU General Public License as published by  //
13 // the Free Software Foundation; either version 2 of the License, or     //
14 // (at your option) any later version.                                   //
15 //                                                                       //
16 // This program is distributed in the hope that it will be useful,       //
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of        //
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         //
19 // GNU General Public License for more details:                          //
20 //                                                                       //
21 //          http://www.gnu.org/copyleft/gpl.html                         //
22 //                                                                       //
23 ///////////////////////////////////////////////////////////////////////////
25 require_once($CFG->dirroot.'/group/lib.php');
26 require_once($CFG->libdir.'/eventslib.php');
28 /**
29 * enrolment_plugin_manual is the default enrolment plugin
30 *
31 * This class provides all the functionality for an enrolment plugin
32 * In fact it includes all the code for the default, "manual" method
33 * so that other plugins can override these as necessary.
34 */
36 class enrolment_plugin_manual {
38 var $errormsg;
40 /**
41 * Prints the entry form/page for this enrolment
42 *
43 * This is only called from course/enrol.php
44 * Most plugins will probably override this to print payment
45 * forms etc, or even just a notice to say that manual enrolment
46 * is disabled
47 *
48 * @param    course  current course object
49 */
50 function print_entry($course) {
51     global $CFG, $USER, $SESSION, $THEME;
53     $strloginto = get_string('loginto', '', $course->shortname);
54     $strcourses = get_string('courses');
56 /// Automatically enrol into courses without password
58     $context = get_context_instance(CONTEXT_SYSTEM);
60     $navlinks = array();
61     $navlinks[] = array('name' => $strcourses, 'link' => ".", 'type' => 'misc');
62     $navlinks[] = array('name' => $strloginto, 'link' => null, 'type' => 'misc');
63     $navigation = build_navigation($navlinks);
65     if ($course->password == '') {   // no password, so enrol
67         if (has_capability('moodle/legacy:guest', $context, $USER->id, false)) {
68             add_to_log($course->id, 'course', 'guest', 'view.php?id='.$course->id, getremoteaddr());
70         } else if (empty($_GET['confirm']) && empty($_GET['cancel'])) {
72             print_header($strloginto, $course->fullname, $navigation);
73             echo '<br />';
74             notice_yesno(get_string('enrolmentconfirmation'), "enrol.php?id=$course->id&amp;confirm=1",
75                                                               "enrol.php?id=$course->id&amp;cancel=1");
76             print_footer();
77             exit;
79         } else if (!empty($_GET['confirm'])) {
81             if (!enrol_into_course($course, $USER, 'manual')) {
82                 print_error('couldnotassignrole');
83             }
84             // force a refresh of mycourses
85             unset($USER->mycourses);
87             if (!empty($SESSION->wantsurl)) {
88                 $destination = $SESSION->wantsurl;
89                 unset($SESSION->wantsurl);
90             } else {
91                 $destination = "$CFG->wwwroot/course/view.php?id=$course->id";
92             }
94             redirect($destination);
96         } else if (!empty($_GET['cancel'])) {
97             unset($SESSION->wantsurl);
98             if (!empty($SESSION->enrolcancel)) {
99                 $destination = $SESSION->enrolcancel;
100                 unset($SESSION->enrolcancel);
101             } else {
102                 $destination = $CFG->wwwroot;
103             }
104             redirect($destination);
105         }
106     }
108     // if we get here we are going to display the form asking for the enrolment key
109     // and (hopefully) provide information about who to ask for it.
110     if (!isset($password)) {
111         $password = '';
112     }
114     print_header($strloginto, $course->fullname, $navigation, "form.password");
116     print_course($course, "80%");
118     include("$CFG->dirroot/enrol/manual/enrol.html");
120     print_footer();
126 /**
127 * The other half to print_entry, this checks the form data
129 * This function checks that the user has completed the task on the
130 * enrolment entry page and then enrolls them.
132 * @param    form    the form data submitted, as an object
133 * @param    course  the current course, as an object
134 */
135 function check_entry($form, $course) {
136     global $CFG, $USER, $SESSION, $THEME;
138     if (empty($form->password)) {
139         $form->password = '';
140     }
142     if (empty($course->password)) {
143         // do not allow entry when no course password set
144         // automatic login when manual primary, no login when secondary at all!!
145         print_error('invalidenrol');
146     }
148     $groupid = $this->check_group_entry($course->id, $form->password);
150     if (($form->password == $course->password) or ($groupid !== false) ) {
152         if (isguestuser()) { // only real user guest, do not use this for users with guest role
153             $USER->enrolkey[$course->id] = true;
154             add_to_log($course->id, 'course', 'guest', 'view.php?id='.$course->id, getremoteaddr());
156         } else {  /// Update or add new enrolment
157             if (enrol_into_course($course, $USER, 'manual')) {
158                 // force a refresh of mycourses
159                 unset($USER->mycourses);
160                 if ($groupid !== false) {
161                     if (!groups_add_member($groupid, $USER->id)) {
162                         print_error('couldnotassigngroup');
163                     }
164                 }
165             } else {
166                 print_error('couldnotassignrole');
167             }
168         }
170         if ($SESSION->wantsurl) {
171             $destination = $SESSION->wantsurl;
172             unset($SESSION->wantsurl);
173         } else {
174             $destination = "$CFG->wwwroot/course/view.php?id=$course->id";
175         }
177         redirect($destination);
179     } else if (!isset($CFG->enrol_manual_showhint) or $CFG->enrol_manual_showhint) {
180         $this->errormsg = get_string('enrolmentkeyhint', '', substr($course->password, 0, 1));
182     } else {
183         $this->errormsg = get_string('enrolmentkeyerror', 'enrol_manual');
184     }
188 /**
189 * Check if the given enrolment key matches a group enrolment key for the given course
191 * @param    courseid  the current course id
192 * @param    password  the submitted enrolment key
193 */
194 function check_group_entry ($courseid, $password) {
196     if ($groups = groups_get_all_groups($courseid)) {
197         foreach ($groups as $group) {
198             if ( !empty($group->enrolmentkey) and ($password == $group->enrolmentkey) ) {
199                 return $group->id;
200             }
201         }
202     }
204     return false;
208 /**
209 * Prints a form for configuring the current enrolment plugin
211 * This function is called from admin/enrol.php, and outputs a
212 * full page with a form for defining the current enrolment plugin.
214 * @param    frm  an object containing all the data for this page
215 */
216 function config_form($frm) {
217     global $CFG;
219     if (!isset( $frm->enrol_manual_keyholderrole )) {
220         $frm->enrol_manual_keyholderrole = '';
221     }
223     if (!isset($frm->enrol_manual_showhint)) {
224         $frm->enrol_manual_showhint = 1;
225     }
227     if (!isset($frm->enrol_manual_usepasswordpolicy)) {
228         $frm->enrol_manual_usepasswordpolicy = 0;
229     }
231     if (!isset($frm->enrol_manual_requirekey)) {
232         $frm->enrol_manual_requirekey = 0;
233     }
235     include ("$CFG->dirroot/enrol/manual/config.html");
239 /**
240 * Processes and stored configuration data for the enrolment plugin
242 * @param    config  all the configuration data as entered by the admin
243 */
244 function process_config($config) {
246     $return = true;
248     foreach ($config as $name => $value) {
249         if (!set_config($name, $value)) {
250             $return = false;
251         }
252     }
254     return $return;
258 /**
259 * Notify users about enrolments that are going to expire soon!
260 * This function is run by admin/cron.php
261 * @return void
262 */
263 function cron() {
264     global $CFG, $USER, $SITE, $DB;
266     if (!isset($CFG->lastexpirynotify)) {
267         set_config('lastexpirynotify', 0);
268     }
270     // notify once a day only - TODO: add some tz handling here, maybe use timestamps
271     if ($CFG->lastexpirynotify == date('Ymd')) {
272         return;
273     }
275     if ($rs = $DB->get_recordset_select('course', 'enrolperiod > 0 AND expirynotify > 0 AND expirythreshold > 0')) {
276         $admin = get_admin();
278         foreach ($rs as $course) {
279             $a = new object();
280             $a->coursename = $course->shortname .'/'. $course->fullname; // must be processed by format_string later
281             $a->threshold  = $course->expirythreshold / 86400;
282             $a->extendurl  = $CFG->wwwroot . '/user/index.php?id=' . $course->id;
283             $a->current    = array();
284             $a->past       = array();
286             $expiry = time() + $course->expirythreshold;
287             $cname  = $course->fullname;
289             /// Get all the manual role assignments for this course that have expired.
291             if (!$context = get_context_instance(CONTEXT_COURSE, $course->id)) {
292                 continue;
293             }
295             if ($oldenrolments = $DB->get_records_sql("
296                       SELECT u.*, ra.timeend
297                         FROM {user} u
298                              JOIN {role_assignments} ra ON (ra.userid = u.id)
299                         WHERE ra.contextid = $context->id
300                               AND ra.timeend > 0 AND ra.timeend <= $expiry
301                               AND ra.enrol = 'manual'")) {
303                 // inform user who can assign roles or admin
304                 if ($teachers = get_users_by_capability($context, 'moodle/role:assign', '', '', '', '', '', '', false)) {
305                     $teachers = sort_by_roleassignment_authority($teachers, $context);
306                     $teacher  = reset($teachers);
307                 } else {
308                     $teachers = array($admin);
309                     $teacher  = $admin;
310                 }
312                 $a->teacherstr = fullname($teacher, true);
314                 foreach ($oldenrolments as $user) {       /// Email all users about to expire
315                     $a->studentstr = fullname($user, true);
316                     if ($user->timeend < ($expiry - 86400)) {
317                         $a->past[] = fullname($user) . " <$user->email>";
318                     } else {
319                         $a->current[] = fullname($user) . " <$user->email>";
320                         if ($course->notifystudents) {     // Send this guy notice
321                             // setup global $COURSE properly - needed for languages
322                             cron_setup_user($user, $course);
323                             $a->coursename = format_string($cname);
324                             $a->course     = $a->coursename;
325                             $strexpirynotifystudentsemail = get_string('expirynotifystudentsemail', '', $a);
326                             $strexpirynotify              = get_string('expirynotify');
328                             $eventdata = new object();
329                             $eventdata->modulename        = 'moodle';
330                             $eventdata->userfrom          = $teacher;
331                             $eventdata->userto            = $user;
332                             $eventdata->subject           = format_string($SITE->fullname) .' '. $strexpirynotify;
333                             $eventdata->fullmessage       = $strexpirynotifystudentsemail;
334                             $eventdata->fullmessageformat = FORMAT_PLAIN;
335                             $eventdata->fullmessagehtml   = '';
336                             $eventdata->smallmessage      = '';                     
337                             events_trigger('message_send', $eventdata);
338                         }
339                     }
340                 }
342                 $a->current = implode("\n", $a->current);
343                 $a->past    = implode("\n", $a->past);
345                 if ($a->current || $a->past) {
346                     foreach ($teachers as $teacher) {
347                         // setup global $COURSE properly - needed for languages
348                         cron_setup_user($teacher, $course);
349                         $a->coursename = format_string($cname);
350                         $strexpirynotifyemail = get_string('expirynotifyemail', '', $a);
351                         $strexpirynotify      = get_string('expirynotify');
353                         $eventdata = new object();
354                         $eventdata->modulename        = 'moodle';
355                         $eventdata->userfrom          = $admin;
356                         $eventdata->userto            = $teacher;
357                         $eventdata->subject           = $a->coursename .' '. $strexpirynotify;
358                         $eventdata->fullmessage       = $strexpirynotifyemail;
359                         $eventdata->fullmessageformat = FORMAT_PLAIN;
360                         $eventdata->fullmessagehtml   = '';
361                         $eventdata->smallmessage      = '';                         
362                         events_trigger('message_send', $eventdata);
363                     }
364                 }
365             }
366         }
367         $rs->close();
368         cron_setup_user();
369     }
371     set_config('lastexpirynotify', date('Ymd'));
375 /**
376 * Returns the relevant icons for a course
378 * @param    course  the current course, as an object
379 */
380 function get_access_icons($course) {
381     global $CFG;
383     global $strallowguests;
384     global $strrequireskey;
386     if (empty($strallowguests)) {
387         $strallowguests = get_string('allowguests');
388         $strrequireskey = get_string('requireskey');
389     }
391     $str = '';
393     if (!empty($course->guest)) {
394         $str .= '<a title="'.$strallowguests.'" href="'.$CFG->wwwroot.'/course/view.php?id='.$course->id.'">';
395         $str .= '<img class="accessicon" alt="'.$strallowguests.'" src="'.$CFG->pixpath.'/i/guest.gif" /></a>&nbsp;&nbsp;';
396     }
397     if (!empty($course->password)) {
398         $str .= '<a title="'.$strrequireskey.'" href="'.$CFG->wwwroot.'/course/view.php?id='.$course->id.'">';
399         $str .= '<img class="accessicon" alt="'.$strrequireskey.'" src="'.$CFG->pixpath.'/i/key.gif" /></a>';
400     }
402     return $str;
405 /**
406  * Prints the message telling you were to get the enrolment key
407  * appropriate for the prevailing circumstances
408  * A bit clunky because I didn't want to change the standard strings
409  */
410 function print_enrolmentkeyfrom($course) {
411     global $CFG;
412     global $USER;
414     $context = get_context_instance(CONTEXT_SYSTEM);
415     $guest = has_capability('moodle/legacy:guest', $context, $USER->id, false);
417     // if a keyholder role is defined we list teachers in that role (if any exist)
418     $contactslisted = false;
419     $canseehidden = has_capability('moodle/role:viewhiddenassigns', $context);
420     if (!empty($CFG->enrol_manual_keyholderrole)) {
421         if ($contacts = get_role_users($CFG->enrol_manual_keyholderrole, get_context_instance(CONTEXT_COURSE, $course->id),true,'','u.lastname ASC',$canseehidden  )) {
422             // guest user has a slightly different message
423             if ($guest) {
424                 print_string('enrolmentkeyfromguest', '', ':<br />' );
425             }
426             else {
427                 print_string('enrolmentkeyfrom', '', ':<br />');
428             }
429             foreach ($contacts as $contact) {
430                 $contactname = "<a href=\"../user/view.php?id=$contact->id&course=".SITEID."\">".fullname($contact)."</a>.";
431                 echo "$contactname<br />";
432             }
433             $contactslisted = true;
434         }
435     }
437     // if no keyholder role is defined OR nobody is in that role we do this the 'old' way
438     // (show the first person with update rights)
439     if (!$contactslisted) {
440         if ($teachers = get_users_by_capability(get_context_instance(CONTEXT_COURSE, $course->id), 'moodle/course:update',
441             'u.*', 'u.id ASC', 0, 1, '', '', false, true)) {
442             $teacher = array_shift($teachers);
443         }
444         if (!empty($teacher)) {
445             $teachername = "<a href=\"../user/view.php?id=$teacher->id&course=".SITEID."\">".fullname($teacher)."</a>.";
446         } else {
447             $teachername = strtolower( get_string('defaultcourseteacher') );
448         }
450         // guest user has a slightly different message
451         if ($guest) {
452             print_string('enrolmentkeyfromguest', '', $teachername );
453         }
454         else {
455             print_string('enrolmentkeyfrom', '', $teachername);
456         }
457     }
460 } /// end of class
462 ?>