|
Moodle
2.2.1
http://www.collinsharper.com
|
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 }