From b8e13a57429abd80c6ffd4d04f4fd6c70fd8b559 Mon Sep 17 00:00:00 2001 From: moodler Date: Fri, 25 Jun 2004 03:28:12 +0000 Subject: [PATCH] Enrolment architecture version 0.5 ! The internal method (the default) simply replicates Moodle's existing behaviour and is working fine. The new flatfile module also works. There is no admin config interface yet, I'm still implementing this using templates. --- enrol/README.txt | 15 ++ enrol/enrol.class.php | 286 +++++++++++++++++++++++++++++++++++++ enrol/flatfile/enrol.php | 208 +++++++++++++++++++++++++++ enrol/flatfile/example.txt | 5 + enrol/internal/enrol.html | 45 ++++++ enrol/internal/enrol.php | 8 ++ 6 files changed, 567 insertions(+) create mode 100644 enrol/README.txt create mode 100644 enrol/enrol.class.php create mode 100644 enrol/flatfile/enrol.php create mode 100644 enrol/flatfile/example.txt create mode 100644 enrol/internal/enrol.html create mode 100644 enrol/internal/enrol.php diff --git a/enrol/README.txt b/enrol/README.txt new file mode 100644 index 0000000000..552d8b6414 --- /dev/null +++ b/enrol/README.txt @@ -0,0 +1,15 @@ +ENROLMENT MODULES +----------------- + +(Yes, that's the correct English spelling ;-) ) + +enrol.class.php contains the base class and explains +all the possible functions that an enrolment module +can have. + +Each plugin is in a subfolder here and extends the +base class as necessary. + + +Martin Dougiamas and Shane Elliott, Moodle.com + diff --git a/enrol/enrol.class.php b/enrol/enrol.class.php new file mode 100644 index 0000000000..d41fd573bf --- /dev/null +++ b/enrol/enrol.class.php @@ -0,0 +1,286 @@ +student course array +* Set the $user->timeaccess course array +* +* @param user referenced object, must contain $user->id already set +*/ +function get_student_courses(&$user) { + + if ($students = get_records("user_students", "userid", $user->id)) { + $currenttime = time(); + foreach ($students as $student) { + + /// Is course visible? + + if (get_field("course", "visible", "id", $student->course)) { + + /// Is student enrolled for a specific time period? + + if ( ( $student->timestart == 0 or ( $currenttime > $student->timestart )) and + ( $student->timeend == 0 or ( $currenttime < $student->timeend )) ) { + $user->student[$student->course] = true; + $user->timeaccess[$student->course] = $student->timeaccess; + } + } + } + } +} + + + +/** +* Returns information about the courses a student has access to +* +* Set the $user->teacher course array +* Set the $user->teacheredit course array +* Set the $user->timeaccess course array +* +* @param user referenced object, must contain $user->id already set +*/ +function get_teacher_courses(&$user) { + + if ($teachers = get_records("user_teachers", "userid", $user->id)) { + $currenttime = time(); + foreach ($teachers as $teacher) { + + /// Is teacher only teaching this course for a specific time period? + + if ( ( $teacher->timestart == 0 or ( $currenttime > $teacher->timestart )) and + ( $teacher->timeend == 0 or ( $currenttime < $teacher->timeend )) ) { + + $user->teacher[$teacher->course] = true; + + if ($teacher->editall) { + $user->teacheredit[$teacher->course] = true; + } + + $user->timeaccess[$teacher->course] = $teacher->timeaccess; + } + } + } +} + + + + +/** +* Prints the entry form/page for this enrolment +* +* This is only called from course/enrol.php +* Most plugins will probably override this to print payment +* forms etc, or even just a notice to say that manual enrolment +* is disabled +* +* @param course current course object +*/ +function print_entry($course) { + global $CFG, $USER, $SESSION; + + $strloginto = get_string("loginto", "", $course->shortname); + $strcourses = get_string("courses"); + + +/// Double check just in case they are actually enrolled already +/// This might occur if they were manually enrolled during this session + + if (record_exists("user_students", "userid", $USER->id, "course", $course->id)) { + $USER->student[$course->id] = true; + + if ($SESSION->wantsurl) { + $destination = $SESSION->wantsurl; + unset($SESSION->wantsurl); + } else { + $destination = "$CFG->wwwroot/course/view.php?id=$course->id"; + } + + redirect($destination); + } + + +/// Automatically enrol into courses without password + + if ($course->password == "") { // no password, so enrol + + if (isguest()) { + add_to_log($course->id, "course", "guest", "view.php?id=$course->id", "$USER->id"); + + } else if (empty($_GET['confirm'])) { + + print_header($strloginto, $course->fullname, "$strcourses -> $strloginto"); + echo "
"; + notice_yesno(get_string("enrolmentconfirmation"), "enrol.php?id=$course->id&confirm=1", $CFG->wwwroot); + print_footer(); + exit; + + } else { + + if (! enrol_student($USER->id, $course->id)) { + error("An error occurred while trying to enrol you."); + } + add_to_log($course->id, "course", "enrol", "view.php?id=$course->id", "$USER->id"); + + $USER->student[$course->id] = true; + + if ($SESSION->wantsurl) { + $destination = $SESSION->wantsurl; + unset($SESSION->wantsurl); + } else { + $destination = "$CFG->wwwroot/course/view.php?id=$course->id"; + } + + redirect($destination); + } + } + + $teacher = get_teacher($course->id); + if (!isset($password)) { + $password = ""; + } + + + print_header($strloginto, $course->fullname, "$strcourses -> $strloginto", "form.password"); + + print_course($course); + + include("$CFG->dirroot/enrol/internal/enrol.html"); + + print_footer(); + +} + + + +/** +* The other half to print_entry, this checks the form data +* +* This function checks that the user has completed the task on the +* enrolment entry page and then enrolls them. +* +* @param form the form data submitted, as an object +* @param course the current course, as an object +*/ +function check_entry($form, $course) { + global $CFG, $USER, $SESSION; + + if ($form->password == $course->password) { + + if (isguest()) { + + add_to_log($course->id, "course", "guest", "view.php?id=$course->id", $_SERVER['REMOTE_ADDR']); + + } else if (!record_exists("user_students", "userid", $USER->id, "course", $course->id)) { + + if (! enrol_student($USER->id, $course->id)) { + error("An error occurred while trying to enrol you."); + } + + $subject = get_string("welcometocourse", "", $course->fullname); + $a->coursename = $course->fullname; + $a->profileurl = "$CFG->wwwroot/user/view.php?id=$USER->id&course=$course->id"; + $message = get_string("welcometocoursetext", "", $a); + + if (! $teacher = get_teacher($course->id)) { + $teacher = get_admin(); + } + + email_to_user($USER, $teacher, $subject, $message); + add_to_log($course->id, "course", "enrol", "view.php?id=$course->id", "$USER->id"); + } + + $USER->student[$course->id] = true; + + if ($SESSION->wantsurl) { + $destination = $SESSION->wantsurl; + unset($SESSION->wantsurl); + } else { + $destination = "$CFG->wwwroot/course/view.php?id=$course->id"; + } + + redirect($destination); + + } else { + $this->errormsg = get_string("enrolmentkeyhint", "", substr($course->password,0,1)); + } + +} + + +/** +* Prints a form for configuring the current enrolment plugin +* +* This function is called from admin/enrol.php, and outputs a +* full page with a form for defining the current enrolment plugin. +* +* @param page an object containing all the data for this page +*/ +function print_config($page) { +} + + +/** +* Processes and stored configuration data for the enrolment plugin +* +* Processes and stored configuration data for the enrolment plugin +* +* @param config all the configuration data as entered by the admin +*/ +function process_config($config) { +} + + +/** +* This function is run by admin/cron.php every time +* +* The cron function can perform regular checks for the current +* enrollment plugin. For example it can check a foreign database, +* all look for a file to pull data in from +* +*/ +function cron() { +} + + +} /// end of class + +?> diff --git a/enrol/flatfile/enrol.php b/enrol/flatfile/enrol.php new file mode 100644 index 0000000000..d43440d226 --- /dev/null +++ b/enrol/flatfile/enrol.php @@ -0,0 +1,208 @@ +dirroot/enrol/enrol.class.php"); + +// The following flags are set in the configuration +// $CFG->enrol_flatfilelocation: where is the file we are looking for? +// $CFG->enrol_flatfilemailusers: send email to users when they are enrolled in a course +// $CFG->enrol_flatfilemailadmin: email the log from the cron job to the admin +// $CFG->enrol_flatfileallowinternal: allow internal enrolment in courses + + + + +class enrolment_plugin extends enrolment_base { + + var $log; + +/// Override the base print_entry() function +function print_entry($course) { + global $CFG; + + if (! empty($CFG->enrol_flatfileallowinternal) ) { + parent::print_entry($course); + } else { + print_header(); + notice(get_string("enrolmentnointernal"), $CFG->wwwroot); + } +} + + +/// Override the base check_entry() function +function check_entry($form, $course) { + global $CFG; + + if (! empty($CFG->enrol_flatfileallowinternal) ) { + parent::check_entry($form, $course); + } +} + + + +/** +* Override the base cron() function to read in a file +* +* Comma separated file assumed to have four fields per line: +* operation, role, idnumber(user), idnumber(course) +* where: +* operation = add | del +* role = student | teacher | teacheredit +* idnumber(user) = idnumber in the user table NB not id +* idnumber(course) = idnumber in the course table NB not id +*/ + function cron() { + global $CFG; + + if (empty($CFG->enrol_flatfilelocation)) { + $filename = "$CFG->dataroot/1/enrolments.txt"; // Default location + } else { + $filename = $CFG->enrol_flatfilelocation; + } + + if ( file_exists($filename) ) { + + $this->log = userdate(time()) . "\n"; + $this->log .= "Flatfile enrol cron found file: $filename\n\n"; + + if (($fh = fopen($filename, "r")) != false) { + + $line = 0; + while (!feof($fh)) { + + $line++; + $fields = explode( ",", str_replace( "\r", "", fgets($fh) ) ); + + + /// If a line is incorrectly formatted ie does not have 4 comma separated fields then ignore it + if ( count($fields) != 4) { + if ( count($fields) > 1 or strlen($fields[0]) > 1) { // no error for blank lines + $this->log .= "$line: Line incorrectly formatted - ignoring\n"; + } + continue; + } + + + $fields[0] = trim(strtolower($fields[0])); + $fields[1] = trim(strtolower($fields[1])); + $fields[2] = trim($fields[2]); + $fields[3] = trim($fields[3]); + + + $this->log .= "$line: $fields[0] $fields[1] $fields[2] $fields[3]: "; + + + + /// check correct formatting of operation field + if ($fields[0] != "add" and $fields[0] != "del") { + $this->log .= "Unknown operation in field 1 - ignoring line\n"; + continue; + } + + + /// check correct formatting of role field + if ($fields[1] != "student" and $fields[1] != "teacher" and $fields[1] != "teacheredit") { + $this->log .= "Unknown role in field2 - ignoring line\n"; + continue; + } + + + if (! $user = get_record("user", "idnumber", $fields[2]) ) { + $this->log .= "Unknown user idnumber in field 3 - ignoring line\n"; + continue; + } + + + if (! $course = get_record("course", "idnumber", $fields[3]) ) { + $this->log .= "Unknown course idnumber in field 4 - ignoring line\n"; + continue; + } + + + unset($elog); + switch ($fields[1]) { + case "student": + if ($fields[0] == "add") { + if (! enrol_student($user->id, $course->id)) { + $elog = "Error enrolling in course\n"; + } + } else { + if (! unenrol_student($user->id, $course->id)) { + $elog = "Error unenrolling from course\n"; + } + } + break; + + case "teacher": + if ($fields[0] == "add") { + if (! add_teacher($user->id, $course->id, 0)) { + $elog = "Error adding teacher to course\n"; + } + } else { + if (! remove_teacher($user->id, $course->id)) { + $elog = "Error removing teacher from course\n"; + } + } + break; + + case "teacheredit": + if ($fields[0] == "add") { + if (! add_teacher($user->id, $course->id, 1)) { + $elog = "Error adding teacher to course\n"; + } + } else { + if (! remove_teacher($user->id, $course->id)) { + $elog = "Error removing teacher from course\n"; + } + } + break; + + default: // should never get here as checks made above for correct values of $fields[1] + + } // end of switch + + + + if ( (! empty($CFG->enrol_flatfilemailusers)) and empty($elog) and ($fields[0] == "add") ) { + $subject = get_string("welcometocourse", "", $course->fullname); + $a->coursename = $course->fullname; + $a->profileurl = "$CFG->wwwroot/user/view.php?id=$user->id&course=$course->id"; + $message = get_string("welcometocoursetext", "", $a); + + if ($fields[1] == "student") { + if (! $teacher = get_teacher($course->id)) { + $teacher = get_admin(); + } + } else { + $teacher = get_admin(); + } + + email_to_user($user, $teacher, $subject, $message); + } + + + + if (empty($elog)) { + $elog = "OK\n"; + } + $this->log .= $elog; + + } // end of while loop + + fclose($fh); + } // end of if(file_open) + + if(! @unlink($filename)) { + email_to_user(get_admin(), get_admin(), get_string("filelockedmailsubject", "enrol_flatfile"), get_string("filelockedmail", "enrol_flatfile", $filename)); + $this->log .= "Error unlinking file $filename\n"; + } + + if (! empty($CFG->enrol_flatfilemailadmin)) { + email_to_user(get_admin(), get_admin(), "Flatfile Enrolment Log", $this->log); + } + + } // end of if(file_exists) + + } // end of function + +} // end of class + +?> diff --git a/enrol/flatfile/example.txt b/enrol/flatfile/example.txt new file mode 100644 index 0000000000..256a67626e --- /dev/null +++ b/enrol/flatfile/example.txt @@ -0,0 +1,5 @@ +add, student, 5, CF101 +add, teacher, 6, CF101 +add, teacheredit, 7, CF101 +del, student, 8, CF101 +del, student, 17, CF101 diff --git a/enrol/internal/enrol.html b/enrol/internal/enrol.html new file mode 100644 index 0000000000..3c89b1ccb9 --- /dev/null +++ b/enrol/internal/enrol.html @@ -0,0 +1,45 @@ + + + + + + + +
+

+ id&course=$site->id\">". + "$teacher->firstname $teacher->lastname."; + } else { + $teachername = get_string("yourteacher", "", strtolower($course->teacher)); + } + print_string("enrolmentkeyfrom", "", $teachername); + ?> +

+
errormsg)) {formerr($this->errormsg);} ?>
+
+ + + + + + + +

:

+ + +
  + + + + + + +
">  
+ ">
+
+ + +
+ diff --git a/enrol/internal/enrol.php b/enrol/internal/enrol.php new file mode 100644 index 0000000000..038393c971 --- /dev/null +++ b/enrol/internal/enrol.php @@ -0,0 +1,8 @@ +dirroot/enrol/enrol.class.php"); + +class enrolment_plugin extends enrolment_base { + /// nothing to do - it's already perfect! +} + +?> -- 2.39.5