Moodle  2.2.1
http://www.collinsharper.com
C:/xampp/htdocs/moodle/mod/lesson/lib.php
Go to the documentation of this file.
00001 <?php
00002 
00003 // This file is part of Moodle - http://moodle.org/
00004 //
00005 // Moodle is free software: you can redistribute it and/or modify
00006 // it under the terms of the GNU General Public License as published by
00007 // the Free Software Foundation, either version 3 of the License, or
00008 // (at your option) any later version.
00009 //
00010 // Moodle is distributed in the hope that it will be useful,
00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013 // GNU General Public License for more details.
00014 //
00015 // You should have received a copy of the GNU General Public License
00016 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
00017 
00027 defined('MOODLE_INTERNAL') || die();
00028 
00029 /* Do not include any libraries here! */
00030 
00042 function lesson_add_instance($data, $mform) {
00043     global $DB;
00044 
00045     $cmid = $data->coursemodule;
00046 
00047     lesson_process_pre_save($data);
00048 
00049     unset($data->mediafile);
00050     $lessonid = $DB->insert_record("lesson", $data);
00051     $data->id = $lessonid;
00052 
00053     $context = get_context_instance(CONTEXT_MODULE, $cmid);
00054     $lesson = $DB->get_record('lesson', array('id'=>$lessonid), '*', MUST_EXIST);
00055 
00056     if ($filename = $mform->get_new_filename('mediafilepicker')) {
00057         if ($file = $mform->save_stored_file('mediafilepicker', $context->id, 'mod_lesson', 'mediafile', 0, '/', $filename)) {
00058             $DB->set_field('lesson', 'mediafile', '/'.$file->get_filename(), array('id'=>$lesson->id));
00059         }
00060     }
00061 
00062     lesson_process_post_save($data);
00063 
00064     lesson_grade_item_update($data);
00065 
00066     return $lesson->id;
00067 }
00068 
00078 function lesson_update_instance($data, $mform) {
00079     global $DB;
00080 
00081     $data->id = $data->instance;
00082     $cmid = $data->coursemodule;
00083 
00084     lesson_process_pre_save($data);
00085 
00086     unset($data->mediafile);
00087     $DB->update_record("lesson", $data);
00088 
00089     $context = get_context_instance(CONTEXT_MODULE, $cmid);
00090     if ($filename = $mform->get_new_filename('mediafilepicker')) {
00091         if ($file = $mform->save_stored_file('mediafilepicker', $context->id, 'mod_lesson', 'mediafile', 0, '/', $filename, true)) {
00092             $DB->set_field('lesson', 'mediafile', '/'.$file->get_filename(), array('id'=>$data->id));
00093         } else {
00094             $DB->set_field('lesson', 'mediafile', '', array('id'=>$data->id));
00095         }
00096     } else {
00097         $DB->set_field('lesson', 'mediafile', '', array('id'=>$data->id));
00098     }
00099 
00100     lesson_process_post_save($data);
00101 
00102     // update grade item definition
00103     lesson_grade_item_update($data);
00104 
00105     // update grades - TODO: do it only when grading style changes
00106     lesson_update_grades($data, 0, false);
00107 
00108     return true;
00109 }
00110 
00111 
00121 function lesson_delete_instance($id) {
00122     global $DB, $CFG;
00123     require_once($CFG->dirroot . '/mod/lesson/locallib.php');
00124 
00125     $lesson = $DB->get_record("lesson", array("id"=>$id), '*', MUST_EXIST);
00126     $lesson = new lesson($lesson);
00127     return $lesson->delete();
00128 }
00129 
00139 function lesson_delete_course($course, $feedback=true) {
00140     return true;
00141 }
00142 
00157 function lesson_user_outline($course, $user, $mod, $lesson) {
00158     global $CFG;
00159 
00160     require_once("$CFG->libdir/gradelib.php");
00161     $grades = grade_get_grades($course->id, 'mod', 'lesson', $lesson->id, $user->id);
00162 
00163     $return = new stdClass();
00164     if (empty($grades->items[0]->grades)) {
00165         $return->info = get_string("no")." ".get_string("attempts", "lesson");
00166     } else {
00167         $grade = reset($grades->items[0]->grades);
00168         $return->info = get_string("grade") . ': ' . $grade->str_long_grade;
00169 
00170         //datesubmitted == time created. dategraded == time modified or time overridden
00171         //if grade was last modified by the user themselves use date graded. Otherwise use date submitted
00172         //TODO: move this copied & pasted code somewhere in the grades API. See MDL-26704
00173         if ($grade->usermodified == $user->id || empty($grade->datesubmitted)) {
00174             $return->time = $grade->dategraded;
00175         } else {
00176             $return->time = $grade->datesubmitted;
00177         }
00178     }
00179     return $return;
00180 }
00181 
00193 function lesson_user_complete($course, $user, $mod, $lesson) {
00194     global $DB, $OUTPUT, $CFG;
00195 
00196     require_once("$CFG->libdir/gradelib.php");
00197 
00198     $grades = grade_get_grades($course->id, 'mod', 'lesson', $lesson->id, $user->id);
00199     if (!empty($grades->items[0]->grades)) {
00200         $grade = reset($grades->items[0]->grades);
00201         echo $OUTPUT->container(get_string('grade').': '.$grade->str_long_grade);
00202         if ($grade->str_feedback) {
00203             echo $OUTPUT->container(get_string('feedback').': '.$grade->str_feedback);
00204         }
00205     }
00206 
00207     $params = array ("lessonid" => $lesson->id, "userid" => $user->id);
00208     if ($attempts = $DB->get_records_select("lesson_attempts", "lessonid = :lessonid AND userid = :userid", $params,
00209                 "retry, timeseen")) {
00210         echo $OUTPUT->box_start();
00211         $table = new html_table();
00212         $table->head = array (get_string("attempt", "lesson"),  get_string("numberofpagesviewed", "lesson"),
00213             get_string("numberofcorrectanswers", "lesson"), get_string("time"));
00214         $table->width = "100%";
00215         $table->align = array ("center", "center", "center", "center");
00216         $table->size = array ("*", "*", "*", "*");
00217         $table->cellpadding = 2;
00218         $table->cellspacing = 0;
00219 
00220         $retry = 0;
00221         $npages = 0;
00222         $ncorrect = 0;
00223 
00224         foreach ($attempts as $attempt) {
00225             if ($attempt->retry == $retry) {
00226                 $npages++;
00227                 if ($attempt->correct) {
00228                     $ncorrect++;
00229                 }
00230                 $timeseen = $attempt->timeseen;
00231             } else {
00232                 $table->data[] = array($retry + 1, $npages, $ncorrect, userdate($timeseen));
00233                 $retry++;
00234                 $npages = 1;
00235                 if ($attempt->correct) {
00236                     $ncorrect = 1;
00237                 } else {
00238                     $ncorrect = 0;
00239                 }
00240             }
00241         }
00242         if ($npages) {
00243                 $table->data[] = array($retry + 1, $npages, $ncorrect, userdate($timeseen));
00244         }
00245         echo html_writer::table($table);
00246         echo $OUTPUT->box_end();
00247     }
00248 
00249     return true;
00250 }
00251 
00267 function lesson_print_overview($courses, &$htmlarray) {
00268     global $USER, $CFG, $DB, $OUTPUT;
00269 
00270     if (!$lessons = get_all_instances_in_courses('lesson', $courses)) {
00271         return;
00272     }
00273 
00275     $strlesson       = get_string('modulename', 'lesson');
00276     $strnotattempted = get_string('nolessonattempts', 'lesson');
00277     $strattempted    = get_string('lessonattempted', 'lesson');
00278 
00279     $now = time();
00280     foreach ($lessons as $lesson) {
00281         if ($lesson->deadline != 0                                         // The lesson has a deadline
00282             and $lesson->deadline >= $now                                  // And it is before the deadline has been met
00283             and ($lesson->available == 0 or $lesson->available <= $now)) { // And the lesson is available
00284 
00285             // Lesson name
00286             if (!$lesson->visible) {
00287                 $class = ' class="dimmed"';
00288             } else {
00289                 $class = '';
00290             }
00291             $str = $OUTPUT->box("$strlesson: <a$class href=\"$CFG->wwwroot/mod/lesson/view.php?id=$lesson->coursemodule\">".
00292                              format_string($lesson->name).'</a>', 'name');
00293 
00294             // Deadline
00295             $str .= $OUTPUT->box(get_string('lessoncloseson', 'lesson', userdate($lesson->deadline)), 'info');
00296 
00297             // Attempt information
00298             if (has_capability('mod/lesson:manage', get_context_instance(CONTEXT_MODULE, $lesson->coursemodule))) {
00299                 // Number of user attempts
00300                 $attempts = $DB->count_records('lesson_attempts', array('lessonid'=>$lesson->id));
00301                 $str     .= $OUTPUT->box(get_string('xattempts', 'lesson', $attempts), 'info');
00302             } else {
00303                 // Determine if the user has attempted the lesson or not
00304                 if ($DB->count_records('lesson_attempts', array('lessonid'=>$lesson->id, 'userid'=>$USER->id))) {
00305                     $str .= $OUTPUT->box($strattempted, 'info');
00306                 } else {
00307                     $str .= $OUTPUT->box($strnotattempted, 'info');
00308                 }
00309             }
00310             $str = $OUTPUT->box($str, 'lesson overview');
00311 
00312             if (empty($htmlarray[$lesson->course]['lesson'])) {
00313                 $htmlarray[$lesson->course]['lesson'] = $str;
00314             } else {
00315                 $htmlarray[$lesson->course]['lesson'] .= $str;
00316             }
00317         }
00318     }
00319 }
00320 
00328 function lesson_cron () {
00329     global $CFG;
00330 
00331     return true;
00332 }
00333 
00343 function lesson_get_user_grades($lesson, $userid=0) {
00344     global $CFG, $DB;
00345 
00346     $params = array("lessonid" => $lesson->id,"lessonid2" => $lesson->id);
00347 
00348     if (isset($userid)) {
00349         $params["userid"] = $userid;
00350         $params["userid2"] = $userid;
00351         $user = "AND u.id = :userid";
00352         $fuser = "AND uu.id = :userid2";
00353     }
00354     else {
00355         $user="";
00356         $fuser="";
00357     }
00358 
00359     if ($lesson->retake) {
00360         if ($lesson->usemaxgrade) {
00361             $sql = "SELECT u.id, u.id AS userid, MAX(g.grade) AS rawgrade
00362                       FROM {user} u, {lesson_grades} g
00363                      WHERE u.id = g.userid AND g.lessonid = :lessonid
00364                            $user
00365                   GROUP BY u.id";
00366         } else {
00367             $sql = "SELECT u.id, u.id AS userid, AVG(g.grade) AS rawgrade
00368                       FROM {user} u, {lesson_grades} g
00369                      WHERE u.id = g.userid AND g.lessonid = :lessonid
00370                            $user
00371                   GROUP BY u.id";
00372         }
00373         unset($params['lessonid2']);
00374         unset($params['userid2']);
00375     } else {
00376         // use only first attempts (with lowest id in lesson_grades table)
00377         $firstonly = "SELECT uu.id AS userid, MIN(gg.id) AS firstcompleted
00378                         FROM {user} uu, {lesson_grades} gg
00379                        WHERE uu.id = gg.userid AND gg.lessonid = :lessonid2
00380                              $fuser
00381                        GROUP BY uu.id";
00382 
00383         $sql = "SELECT u.id, u.id AS userid, g.grade AS rawgrade
00384                   FROM {user} u, {lesson_grades} g, ($firstonly) f
00385                  WHERE u.id = g.userid AND g.lessonid = :lessonid
00386                        AND g.id = f.firstcompleted AND g.userid=f.userid
00387                        $user";
00388     }
00389 
00390     return $DB->get_records_sql($sql, $params);
00391 }
00392 
00402 function lesson_update_grades($lesson, $userid=0, $nullifnone=true) {
00403     global $CFG, $DB;
00404     require_once($CFG->libdir.'/gradelib.php');
00405 
00406     if ($lesson->grade == 0) {
00407         lesson_grade_item_update($lesson);
00408 
00409     } else if ($grades = lesson_get_user_grades($lesson, $userid)) {
00410         lesson_grade_item_update($lesson, $grades);
00411 
00412     } else if ($userid and $nullifnone) {
00413         $grade = new stdClass();
00414         $grade->userid   = $userid;
00415         $grade->rawgrade = NULL;
00416         lesson_grade_item_update($lesson, $grade);
00417 
00418     } else {
00419         lesson_grade_item_update($lesson);
00420     }
00421 }
00422 
00428 function lesson_upgrade_grades() {
00429     global $DB;
00430 
00431     $sql = "SELECT COUNT('x')
00432               FROM {lesson} l, {course_modules} cm, {modules} m
00433              WHERE m.name='lesson' AND m.id=cm.module AND cm.instance=l.id";
00434     $count = $DB->count_records_sql($sql);
00435 
00436     $sql = "SELECT l.*, cm.idnumber AS cmidnumber, l.course AS courseid
00437               FROM {lesson} l, {course_modules} cm, {modules} m
00438              WHERE m.name='lesson' AND m.id=cm.module AND cm.instance=l.id";
00439     $rs = $DB->get_recordset_sql($sql);
00440     if ($rs->valid()) {
00441         $pbar = new progress_bar('lessonupgradegrades', 500, true);
00442         $i=0;
00443         foreach ($rs as $lesson) {
00444             $i++;
00445             upgrade_set_timeout(60*5); // set up timeout, may also abort execution
00446             lesson_update_grades($lesson, 0, false);
00447             $pbar->update($i, $count, "Updating Lesson grades ($i/$count).");
00448         }
00449     }
00450     $rs->close();
00451 }
00452 
00463 function lesson_grade_item_update($lesson, $grades=NULL) {
00464     global $CFG;
00465     if (!function_exists('grade_update')) { //workaround for buggy PHP versions
00466         require_once($CFG->libdir.'/gradelib.php');
00467     }
00468 
00469     if (array_key_exists('cmidnumber', $lesson)) { //it may not be always present
00470         $params = array('itemname'=>$lesson->name, 'idnumber'=>$lesson->cmidnumber);
00471     } else {
00472         $params = array('itemname'=>$lesson->name);
00473     }
00474 
00475     if ($lesson->grade > 0) {
00476         $params['gradetype']  = GRADE_TYPE_VALUE;
00477         $params['grademax']   = $lesson->grade;
00478         $params['grademin']   = 0;
00479     } else if ($lesson->grade < 0) {
00480         $params['gradetype']  = GRADE_TYPE_SCALE;
00481         $params['scaleid']   = -$lesson->grade;
00482     } else {
00483         $params['gradetype']  = GRADE_TYPE_NONE;
00484     }
00485 
00486     if ($grades  === 'reset') {
00487         $params['reset'] = true;
00488         $grades = NULL;
00489     } else if (!empty($grades)) {
00490         // Need to calculate raw grade (Note: $grades has many forms)
00491         if (is_object($grades)) {
00492             $grades = array($grades->userid => $grades);
00493         } else if (array_key_exists('userid', $grades)) {
00494             $grades = array($grades['userid'] => $grades);
00495         }
00496         foreach ($grades as $key => $grade) {
00497             if (!is_array($grade)) {
00498                 $grades[$key] = $grade = (array) $grade;
00499             }
00500             //check raw grade isnt null otherwise we erroneously insert a grade of 0
00501             if ($grade['rawgrade'] !== null) {
00502                 $grades[$key]['rawgrade'] = ($grade['rawgrade'] * $lesson->grade / 100);
00503             } else {
00504                 //setting rawgrade to null just in case user is deleting a grade
00505                 $grades[$key]['rawgrade'] = null;
00506             }
00507         }
00508     }
00509 
00510     return grade_update('mod/lesson', $lesson->course, 'mod', 'lesson', $lesson->id, 0, $grades, $params);
00511 }
00512 
00520 function lesson_grade_item_delete($lesson) {
00521     global $CFG;
00522 
00523 }
00524 
00525 
00536 function lesson_get_participants($lessonid) {
00537     global $CFG, $DB;
00538 
00539     //Get students
00540     $params = array ("lessonid" => $lessonid);
00541     $students = $DB->get_records_sql("SELECT DISTINCT u.id, u.id
00542                                  FROM {user} u,
00543                                       {lesson_attempts} a
00544                                  WHERE a.lessonid = :lessonid and
00545                                        u.id = a.userid", $params);
00546 
00547     //Return students array (it contains an array of unique users)
00548     return ($students);
00549 }
00550 
00554 function lesson_get_view_actions() {
00555     return array('view','view all');
00556 }
00557 
00561 function lesson_get_post_actions() {
00562     return array('end','start');
00563 }
00564 
00573 function lesson_process_pre_save(&$lesson) {
00574     global $DB;
00575 
00576     $lesson->timemodified = time();
00577 
00578     if (empty($lesson->timed)) {
00579         $lesson->timed = 0;
00580     }
00581     if (empty($lesson->timespent) or !is_numeric($lesson->timespent) or $lesson->timespent < 0) {
00582         $lesson->timespent = 0;
00583     }
00584     if (!isset($lesson->completed)) {
00585         $lesson->completed = 0;
00586     }
00587     if (empty($lesson->gradebetterthan) or !is_numeric($lesson->gradebetterthan) or $lesson->gradebetterthan < 0) {
00588         $lesson->gradebetterthan = 0;
00589     } else if ($lesson->gradebetterthan > 100) {
00590         $lesson->gradebetterthan = 100;
00591     }
00592 
00593     if (empty($lesson->width)) {
00594         $lesson->width = 640;
00595     }
00596     if (empty($lesson->height)) {
00597         $lesson->height = 480;
00598     }
00599     if (empty($lesson->bgcolor)) {
00600         $lesson->bgcolor = '#FFFFFF';
00601     }
00602 
00603     // Conditions for dependency
00604     $conditions = new stdClass;
00605     $conditions->timespent = $lesson->timespent;
00606     $conditions->completed = $lesson->completed;
00607     $conditions->gradebetterthan = $lesson->gradebetterthan;
00608     $lesson->conditions = serialize($conditions);
00609     unset($lesson->timespent);
00610     unset($lesson->completed);
00611     unset($lesson->gradebetterthan);
00612 
00613     if (empty($lesson->password)) {
00614         unset($lesson->password);
00615     }
00616 }
00617 
00626 function lesson_process_post_save(&$lesson) {
00627     global $DB, $CFG;
00628     require_once($CFG->dirroot.'/calendar/lib.php');
00629     require_once($CFG->dirroot . '/mod/lesson/locallib.php');
00630 
00631     if ($events = $DB->get_records('event', array('modulename'=>'lesson', 'instance'=>$lesson->id))) {
00632         foreach($events as $event) {
00633             $event = calendar_event::load($event->id);
00634             $event->delete();
00635         }
00636     }
00637 
00638     $event = new stdClass;
00639     $event->description = $lesson->name;
00640     $event->courseid    = $lesson->course;
00641     $event->groupid     = 0;
00642     $event->userid      = 0;
00643     $event->modulename  = 'lesson';
00644     $event->instance    = $lesson->id;
00645     $event->eventtype   = 'open';
00646     $event->timestart   = $lesson->available;
00647 
00648     $event->visible     = instance_is_visible('lesson', $lesson);
00649 
00650     $event->timeduration = ($lesson->deadline - $lesson->available);
00651 
00652     if ($lesson->deadline and $lesson->available and $event->timeduration <= LESSON_MAX_EVENT_LENGTH) {
00653         // Single event for the whole lesson.
00654         $event->name = $lesson->name;
00655         calendar_event::create(clone($event));
00656     } else {
00657         // Separate start and end events.
00658         $event->timeduration  = 0;
00659         if ($lesson->available) {
00660             $event->name = $lesson->name.' ('.get_string('lessonopens', 'lesson').')';
00661             calendar_event::create(clone($event));
00662         }
00663 
00664         if ($lesson->deadline) {
00665             $event->name      = $lesson->name.' ('.get_string('lessoncloses', 'lesson').')';
00666             $event->timestart = $lesson->deadline;
00667             $event->eventtype = 'close';
00668             calendar_event::create(clone($event));
00669         }
00670     }
00671 }
00672 
00673 
00680 function lesson_reset_course_form_definition(&$mform) {
00681     $mform->addElement('header', 'lessonheader', get_string('modulenameplural', 'lesson'));
00682     $mform->addElement('advcheckbox', 'reset_lesson', get_string('deleteallattempts','lesson'));
00683 }
00684 
00690 function lesson_reset_course_form_defaults($course) {
00691     return array('reset_lesson'=>1);
00692 }
00693 
00702 function lesson_reset_gradebook($courseid, $type='') {
00703     global $CFG, $DB;
00704 
00705     $sql = "SELECT l.*, cm.idnumber as cmidnumber, l.course as courseid
00706               FROM {lesson} l, {course_modules} cm, {modules} m
00707              WHERE m.name='lesson' AND m.id=cm.module AND cm.instance=l.id AND l.course=:course";
00708     $params = array ("course" => $courseid);
00709     if ($lessons = $DB->get_records_sql($sql,$params)) {
00710         foreach ($lessons as $lesson) {
00711             lesson_grade_item_update($lesson, 'reset');
00712         }
00713     }
00714 }
00715 
00725 function lesson_reset_userdata($data) {
00726     global $CFG, $DB;
00727 
00728     $componentstr = get_string('modulenameplural', 'lesson');
00729     $status = array();
00730 
00731     if (!empty($data->reset_lesson)) {
00732         $lessonssql = "SELECT l.id
00733                          FROM {lesson} l
00734                         WHERE l.course=:course";
00735 
00736         $params = array ("course" => $data->courseid);
00737         $DB->delete_records_select('lesson_timer', "lessonid IN ($lessonssql)", $params);
00738         $DB->delete_records_select('lesson_high_scores', "lessonid IN ($lessonssql)", $params);
00739         $DB->delete_records_select('lesson_grades', "lessonid IN ($lessonssql)", $params);
00740         $DB->delete_records_select('lesson_attempts', "lessonid IN ($lessonssql)", $params);
00741 
00742         // remove all grades from gradebook
00743         if (empty($data->reset_gradebook_grades)) {
00744             lesson_reset_gradebook($data->courseid);
00745         }
00746 
00747         $status[] = array('component'=>$componentstr, 'item'=>get_string('deleteallattempts', 'lesson'), 'error'=>false);
00748     }
00749 
00751     if ($data->timeshift) {
00752         shift_course_mod_dates('lesson', array('available', 'deadline'), $data->timeshift, $data->courseid);
00753         $status[] = array('component'=>$componentstr, 'item'=>get_string('datechanged'), 'error'=>false);
00754     }
00755 
00756     return $status;
00757 }
00758 
00763 function lesson_get_extra_capabilities() {
00764     return array('moodle/site:accessallgroups');
00765 }
00766 
00778 function lesson_supports($feature) {
00779     switch($feature) {
00780         case FEATURE_GROUPS:                  return false;
00781         case FEATURE_GROUPINGS:               return false;
00782         case FEATURE_GROUPMEMBERSONLY:        return true;
00783         case FEATURE_MOD_INTRO:               return false;
00784         case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
00785         case FEATURE_GRADE_HAS_GRADE:         return true;
00786         case FEATURE_GRADE_OUTCOMES:          return true;
00787         case FEATURE_BACKUP_MOODLE2:          return true;
00788         default: return null;
00789     }
00790 }
00791 
00803 function lesson_extend_navigation($navigation, $course, $module, $cm) {
00809     $navigation->nodetype = navigation_node::NODETYPE_LEAF;
00810 }
00811 
00821 function lesson_extend_settings_navigation($settings, $lessonnode) {
00822     global $PAGE, $DB;
00823 
00824     $canedit = has_capability('mod/lesson:edit', $PAGE->cm->context);
00825 
00826     $url = new moodle_url('/mod/lesson/view.php', array('id'=>$PAGE->cm->id));
00827     $lessonnode->add(get_string('preview', 'lesson'), $url);
00828 
00829     if ($canedit) {
00830         $url = new moodle_url('/mod/lesson/edit.php', array('id'=>$PAGE->cm->id));
00831         $lessonnode->add(get_string('edit', 'lesson'), $url);
00832     }
00833 
00834     if (has_capability('mod/lesson:manage', $PAGE->cm->context)) {
00835         $reportsnode = $lessonnode->add(get_string('reports', 'lesson'));
00836         $url = new moodle_url('/mod/lesson/report.php', array('id'=>$PAGE->cm->id, 'action'=>'reportoverview'));
00837         $reportsnode->add(get_string('overview', 'lesson'), $url);
00838         $url = new moodle_url('/mod/lesson/report.php', array('id'=>$PAGE->cm->id, 'action'=>'reportdetail'));
00839         $reportsnode->add(get_string('detailedstats', 'lesson'), $url);
00840     }
00841 
00842     if ($canedit) {
00843         $url = new moodle_url('/mod/lesson/essay.php', array('id'=>$PAGE->cm->id));
00844         $lessonnode->add(get_string('manualgrading', 'lesson'), $url);
00845     }
00846 
00847     if ($PAGE->activityrecord->highscores) {
00848         $url = new moodle_url('/mod/lesson/highscores.php', array('id'=>$PAGE->cm->id));
00849         $lessonnode->add(get_string('highscores', 'lesson'), $url);
00850     }
00851 }
00852 
00861 function lesson_get_import_export_formats($type) {
00862     global $CFG;
00863     $fileformats = get_plugin_list("qformat");
00864 
00865     $fileformatname=array();
00866     foreach ($fileformats as $fileformat=>$fdir) {
00867         $format_file = "$fdir/format.php";
00868         if (file_exists($format_file) ) {
00869             require_once($format_file);
00870         } else {
00871             continue;
00872         }
00873         $classname = "qformat_$fileformat";
00874         $format_class = new $classname();
00875         if ($type=='import') {
00876             $provided = $format_class->provide_import();
00877         } else {
00878             $provided = $format_class->provide_export();
00879         }
00880         if ($provided) {
00881             $fileformatnames[$fileformat] = get_string('pluginname', 'qformat_'.$fileformat);
00882         }
00883     }
00884     natcasesort($fileformatnames);
00885 
00886     return $fileformatnames;
00887 }
00888 
00900 function lesson_pluginfile($course, $cm, $context, $filearea, $args, $forcedownload) {
00901     global $CFG, $DB;
00902 
00903     if ($context->contextlevel != CONTEXT_MODULE) {
00904         return false;
00905     }
00906 
00907     $fileareas = lesson_get_file_areas();
00908     if (!array_key_exists($filearea, $fileareas)) {
00909         return false;
00910     }
00911 
00912     if (!$lesson = $DB->get_record('lesson', array('id'=>$cm->instance))) {
00913         return false;
00914     }
00915 
00916     require_course_login($course, true, $cm);
00917 
00918     if ($filearea === 'page_contents') {
00919         $pageid = (int)array_shift($args);
00920         if (!$page = $DB->get_record('lesson_pages', array('id'=>$pageid))) {
00921             return false;
00922         }
00923         $fullpath = "/$context->id/mod_lesson/$filearea/$pageid/".implode('/', $args);
00924 
00925     } else if ($filearea === 'mediafile') {
00926         array_shift($args); // ignore itemid - caching only
00927         $fullpath = "/$context->id/mod_lesson/$filearea/0/".implode('/', $args);
00928 
00929     } else {
00930         return false;
00931     }
00932 
00933     $fs = get_file_storage();
00934     if (!$file = $fs->get_file_by_hash(sha1($fullpath)) or $file->is_directory()) {
00935         return false;
00936     }
00937 
00938     // finally send the file
00939     send_stored_file($file, 0, 0, $forcedownload); // download MUST be forced - security!
00940 }
00941 
00946 function lesson_get_file_areas() {
00947     $areas = array();
00948     $areas['page_contents'] = 'Page contents'; //TODO: localize!!!!
00949     $areas['mediafile'] = 'Media file'; //TODO: localize!!!!
00950 
00951     return $areas;
00952 }
00953 
00969 function lesson_get_file_info($browser, $areas, $course, $cm, $context, $filearea, $itemid, $filepath, $filename) {
00970     global $CFG;
00971     if (has_capability('moodle/course:managefiles', $context)) {
00972         // no peaking here for students!!
00973         return null;
00974     }
00975 
00976     $fs = get_file_storage();
00977     $filepath = is_null($filepath) ? '/' : $filepath;
00978     $filename = is_null($filename) ? '.' : $filename;
00979     $urlbase = $CFG->wwwroot.'/pluginfile.php';
00980     if (!$storedfile = $fs->get_file($context->id, 'mod_lesson', $filearea, $itemid, $filepath, $filename)) {
00981         return null;
00982     }
00983     return new file_info_stored($browser, $context, $storedfile, $urlbase, $filearea, $itemid, true, true, false);
00984 }
00985 
00986 
00993 function lesson_page_type_list($pagetype, $parentcontext, $currentcontext) {
00994     $module_pagetype = array(
00995         'mod-lesson-*'=>get_string('page-mod-lesson-x', 'lesson'),
00996         'mod-lesson-view'=>get_string('page-mod-lesson-view', 'lesson'),
00997         'mod-lesson-edit'=>get_string('page-mod-lesson-edit', 'lesson'));
00998     return $module_pagetype;
00999 }
 All Data Structures Namespaces Files Functions Variables Enumerations