no message
[moodle.git] / course / lib.php
CommitLineData
f9903ed0 1<? // $Id$
97c270e9 2 // Library of useful functions
f9903ed0 3
f9903ed0 4
97c270e9 5$COURSE_MAX_LOG_DISPLAY = 150; // days
d9d1c35d 6
97c270e9 7$COURSE_TEACHER_COLOR = "#990000"; // To hilight certain items that are teacher-only
87ffed0d 8
97c270e9 9$COURSE_LIVELOG_REFRESH = 60; // Seconds
ef58b822 10
f9903ed0 11
f9903ed0 12function print_log_selector_form($course, $selecteduser=0, $selecteddate="today") {
13
9481285b 14 global $USER, $CFG;
15
f9903ed0 16 // Get all the possible users
17 $users = array();
720a43ce 18
19 if ($course->category) {
20 if ($students = get_records_sql("SELECT u.* FROM user u, user_students s
21 WHERE s.course = '$course->id' AND s.user = u.id
22 ORDER BY u.lastaccess DESC")) {
23 foreach ($students as $student) {
24 $users["$student->id"] = "$student->firstname $student->lastname";
25 }
26 }
27 if ($teachers = get_records_sql("SELECT u.* FROM user u, user_teachers t
28 WHERE t.course = '$course->id' AND t.user = u.id
29 ORDER BY u.lastaccess DESC")) {
30 foreach ($teachers as $teacher) {
31 $users["$teacher->id"] = "$teacher->firstname $teacher->lastname";
32 }
f9903ed0 33 }
122cffc9 34 if ($guest = get_user_info_from_db("username", "guest")) {
35 $users["$guest->id"] = "$guest->firstname $guest->lastname";
36 }
f9903ed0 37 }
720a43ce 38
39 if (isadmin()) {
40 if ($ccc = get_records_sql("SELECT * FROM course ORDER BY fullname")) {
41 foreach ($ccc as $cc) {
cfa5d3f2 42 if ($cc->category) {
43 $courses["$cc->id"] = "$cc->fullname";
44 } else {
45 $courses["$cc->id"] = " $cc->fullname (Site)";
46 }
720a43ce 47 }
f9903ed0 48 }
cfa5d3f2 49 asort($courses);
f9903ed0 50 }
51
52 asort($users);
53
54 // Get all the possible dates
9481285b 55 // Note that we are keeping track of real (GMT) time and user time
56 // User time is only used in displays - all calcs and passing is GMT
57
58 $timenow = time(); // GMT
59
60 // What day is it now for the user, and when is midnight that day (in GMT).
9604ccb1 61 $timemidnight = $today = usergetmidnight($timenow);
9481285b 62
63 // Put today up the top of the list
62c13a2f 64 $dates = array("$timemidnight" => get_string("today").", ".userdate($timenow, "%d %B %Y") );
9481285b 65
66 if (! $course->startdate) {
67 $course->startdate = $course->timecreated;
68 }
f9903ed0 69
9481285b 70 $numdates = 1;
71 while ($timemidnight > $course->startdate and $numdates < 365) {
f9903ed0 72 $timemidnight = $timemidnight - 86400;
9481285b 73 $timenow = $timenow - 86400;
62c13a2f 74 $dates["$timemidnight"] = userdate($timenow, "%A, %d %B %Y");
9481285b 75 $numdates++;
f9903ed0 76 }
77
78 if ($selecteddate == "today") {
79 $selecteddate = $today;
80 }
81
82 echo "<CENTER>";
83 echo "<FORM ACTION=log.php METHOD=get>";
720a43ce 84 if (isadmin()) {
849bc02a 85 choose_from_menu ($courses, "id", $course->id, "");
720a43ce 86 } else {
87 echo "<INPUT TYPE=hidden NAME=id VALUE=\"$course->id\">";
88 }
89 if ($course->category) {
97c270e9 90 choose_from_menu ($users, "user", $selecteduser, get_string("allparticipants") );
720a43ce 91 }
97c270e9 92 choose_from_menu ($dates, "date", $selecteddate, get_string("alldays"));
93 echo "<INPUT TYPE=submit VALUE=\"".get_string("showtheselogs")."\">";
f9903ed0 94 echo "</FORM>";
95 echo "</CENTER>";
96}
97
600149be 98function make_log_url($module, $url) {
99 switch ($module) {
100 case "course":
101 case "user":
102 case "file":
103 case "login":
104 case "lib":
105 case "admin":
106 return "/$module/$url";
107 break;
108 default:
109 return "/mod/$module/$url";
110 break;
111 }
112}
113
114
f9903ed0 115function print_log($course, $user=0, $date=0, $order="ORDER BY l.time ASC") {
9481285b 116// It is assumed that $date is the GMT time of midnight for that day,
117// and so the next 86400 seconds worth of logs are printed.
f9903ed0 118
720a43ce 119 if ($course->category) {
120 $selector = "WHERE l.course='$course->id' AND l.user = u.id";
a2ab3b05 121
720a43ce 122 } else {
123 $selector = "WHERE l.user = u.id"; // Show all courses
124 if ($ccc = get_records_sql("SELECT * FROM course ORDER BY fullname")) {
125 foreach ($ccc as $cc) {
126 $courses[$cc->id] = "$cc->shortname";
127 }
128 }
129 }
f9903ed0 130
131 if ($user) {
132 $selector .= " AND l.user = '$user'";
133 }
134
135 if ($date) {
136 $enddate = $date + 86400;
137 $selector .= " AND l.time > '$date' AND l.time < '$enddate'";
138 }
139
140 if (!$logs = get_records_sql("SELECT l.*, u.firstname, u.lastname, u.picture
600149be 141 FROM log l, user u $selector $order")){
f9903ed0 142 notify("No logs found!");
143 print_footer($course);
144 exit;
145 }
146
147 $count=0;
148 $tt = getdate(time());
149 $today = mktime (0, 0, 0, $tt["mon"], $tt["mday"], $tt["year"]);
150 echo "<P ALIGN=CENTER>Displaying ".count($logs)." records</P>";
151 echo "<TABLE BORDER=0 ALIGN=center CELLPADDING=3 CELLSPACING=3>";
152 foreach ($logs as $log) {
600149be 153
154 if ($ld = get_record_sql("SELECT * FROM log_display WHERE module='$log->module' AND action='$log->action'")) {
565f7a95 155 $log->info = get_field($ld->mtable, $ld->field, "id", $log->info);
600149be 156 }
157
f58d18bc 158 echo "<TR NOWRAP>";
720a43ce 159 if (! $course->category) {
f58d18bc 160 echo "<TD NOWRAP><FONT SIZE=2><A HREF=\"view.php?id=$log->course\">".$courses[$log->course]."</A></TD>";
720a43ce 161 }
f58d18bc 162 echo "<TD NOWRAP ALIGN=right><FONT SIZE=2>".userdate($log->time, "%A")."</TD>";
62c13a2f 163 echo "<TD NOWRAP><FONT SIZE=2>".userdate($log->time, "%d %B %Y, %I:%M %p")."</TD>";
ebea4e27 164 echo "<TD NOWRAP><FONT SIZE=2>";
ef4743b9 165 link_to_popup_window("$CFG->wwwroot/lib/ipatlas/plot.php?address=$log->ip&user=$log->user", "ipatlas","$log->ip", 400, 700);
ebea4e27 166 echo "</TD>";
f58d18bc 167 echo "<TD NOWRAP><FONT SIZE=2><A HREF=\"../user/view.php?id=$log->user&course=$log->course\"><B>$log->firstname $log->lastname</B></TD>";
168 echo "<TD NOWRAP><FONT SIZE=2>";
600149be 169 link_to_popup_window( make_log_url($log->module,$log->url), "fromloglive","$log->module $log->action", 400, 600);
f9903ed0 170 echo "</TD>";
f58d18bc 171 echo "<TD NOWRAP><FONT SIZE=2>$log->info</TD>";
f9903ed0 172 echo "</TR>";
173 }
174 echo "</TABLE>";
175}
176
177
776dc270 178function print_all_courses($category="all", $style="full", $maxcount=999, $width=180) {
0a263205 179 global $CFG, $USER;
d887b5a7 180
ba2e5d73 181 if ($category == "all") {
182 $courses = get_records_sql("SELECT * FROM course WHERE category > 0 ORDER BY fullname ASC");
0a263205 183
184 } else if ($category == "my") {
185 if (isset($USER->id)) {
186 if ($courses = get_records_sql("SELECT * FROM course WHERE category > 0 ORDER BY fullname ASC")) {
187 foreach ($courses as $key => $course) {
188 if (!isteacher($course->id) and !isstudent($course->id)) {
189 unset($courses[$key]);
190 }
191 }
192 }
193 }
194
ba2e5d73 195 } else {
196 $courses = get_records("course", "category", $category, "fullname ASC");
197 }
198
393cc508 199 if ($style == "minimal") {
200 $count = 0;
201 $icon = "<IMG SRC=\"pix/i/course.gif\" HEIGHT=16 WIDTH=16 ALT=\"".get_string("course")."\">";
202 if ($courses) {
94361e02 203 foreach ($courses as $course) {
565f7a95 204 $moddata[]="<A TITLE=\"$course->shortname\" HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->fullname</A>";
94361e02 205 $modicon[]=$icon;
206 if ($count++ >= $maxcount) {
207 break;
208 }
209 }
210 $fulllist = "<P><A HREF=\"$CFG->wwwroot/course/\">".get_string("fulllistofcourses")."</A>...";
94361e02 211 } else {
393cc508 212 $moddata = array();
213 $modicon = array();
214 $fulllist = get_string("nocoursesyet");
215 }
216 print_side_block(get_string("courses"), "", $moddata, $modicon, $fulllist, $width);
217
218 } else if ($courses) {
219 foreach ($courses as $course) {
220 print_course($course);
221 echo "<BR>\n";
d887b5a7 222 }
223
224 } else {
393cc508 225 echo "<P>".get_string("nocoursesyet")."</P>";
d887b5a7 226 }
227}
228
229
f9903ed0 230function print_course($course) {
231
d887b5a7 232 global $CFG;
233
a83fded1 234 if (! $site = get_site()) {
f9903ed0 235 error("Could not find a site!");
236 }
237
d887b5a7 238 print_simple_box_start("CENTER", "100%");
f9903ed0 239
240 echo "<TABLE WIDTH=100%>";
da5c172a 241 echo "<TR VALIGN=top>";
242 echo "<TD VALIGN=top WIDTH=50%>";
7a302afc 243 echo "<P><FONT SIZE=3><B><A TITLE=\"".get_string("entercourse")."\"
9481285b 244 HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->fullname</A></B></FONT></P>";
0c71c9ae 245 if ($teachers = get_course_teachers($course->id)) {
f9903ed0 246 echo "<P><FONT SIZE=1>\n";
247 foreach ($teachers as $teacher) {
0c71c9ae 248 if ($teacher->authority > 0) {
b4d7002e 249 if (!$teacher->role) {
250 $teacher->role = $course->teacher;
251 }
252 echo "$teacher->role: <A HREF=\"$CFG->wwwroot/user/view.php?id=$teacher->id&course=$site->id\">$teacher->firstname $teacher->lastname</A><BR>";
0c71c9ae 253 }
f9903ed0 254 }
255 echo "</FONT></P>";
da5c172a 256 }
f25f1e1b 257 if ($course->guest) {
5e367a2d 258 $strallowguests = get_string("allowguests");
259 echo "<A TITLE=\"$strallowguests\" HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">";
260 echo "<IMG VSPACE=4 ALT=\"$strallowguests\" HEIGHT=16 WIDTH=16 BORDER=0 SRC=\"$CFG->wwwroot/user/user.gif\"></A>&nbsp;&nbsp;";
da5c172a 261 }
262 if ($course->password) {
5e367a2d 263 $strrequireskey = get_string("requireskey");
264 echo "<A TITLE=\"$strrequireskey\" HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">";
265 echo "<IMG VSPACE=4 ALT=\"$strrequireskey\" HEIGHT=16 WIDTH=16 BORDER=0 SRC=\"$CFG->wwwroot/pix/i/key.gif\"></A>";
da5c172a 266 }
267
268
269 echo "</TD><TD VALIGN=top WIDTH=50%>";
270 echo "<P><FONT SIZE=2>".text_to_html($course->summary)."</FONT></P>";
271 echo "</TD></TR>";
272 echo "</TABLE>";
f9903ed0 273
da5c172a 274 print_simple_box_end();
f9903ed0 275}
276
600149be 277function print_headline($text, $size=2) {
278 echo "<B><FONT SIZE=\"$size\">$text</FONT></B><BR>\n";
279}
280
281function print_recent_activity($course) {
282 // $course is an object
283 // This function trawls through the logs looking for
284 // anything new since the user's last login
285
97c270e9 286 global $CFG, $USER, $COURSE_TEACHER_COLOR;
600149be 287
288 if (! $USER->lastlogin ) {
4c654ee3 289 echo "<P ALIGN=CENTER><FONT SIZE=1>";
4b1371a7 290 print_string("welcometocourse", "", $course->shortname);
4c654ee3 291 echo "</FONT></P>";
600149be 292 return;
4c654ee3 293 } else {
294 echo "<P ALIGN=CENTER><FONT SIZE=1>";
295 echo get_string("yourlastlogin").":<BR>";
62c13a2f 296 echo userdate($USER->lastlogin, "%A, %d %b %Y, %H:%M");
4c654ee3 297 echo "</FONT></P>";
600149be 298 }
299
300 if (! $logs = get_records_sql("SELECT * FROM log WHERE time > '$USER->lastlogin' AND course = '$course->id' ORDER BY time ASC")) {
301 return;
302 }
303
304
305 // Firstly, have there been any new enrolments?
306
307 $heading = false;
308 $content = false;
309 foreach ($logs as $log) {
310 if ($log->module == "course" and $log->action == "enrol") {
311 if (! $heading) {
4c654ee3 312 print_headline(get_string("newusers").":");
600149be 313 $heading = true;
314 $content = true;
315 }
316 $user = get_record("user", "id", $log->info);
d578afc8 317 if (isstudent($course->id, $user->id)) {
318 echo "<P><FONT SIZE=1><A HREF=\"../user/view.php?id=$user->id&course=$course->id\">$user->firstname $user->lastname</A></FONT></P>";
319 }
600149be 320 }
321 }
322
323 // Next, have there been any changes to the course structure?
324
600149be 325 foreach ($logs as $log) {
326 if ($log->module == "course") {
327 if ($log->action == "add mod" or $log->action == "update mod" or $log->action == "delete mod") {
600149be 328 $info = split(" ", $log->info);
329 $modname = get_field($info[0], "name", "id", $info[1]);
330
600149be 331 switch ($log->action) {
332 case "add mod":
27038d9f 333 $stradded = get_string("added", "moodle", get_string("modulename", $info[0]));
4c654ee3 334 $changelist["$log->info"] = array ("operation" => "add", "text" => "$stradded:<BR><A HREF=\"$CFG->wwwroot/course/$log->url\">$modname</A>");
600149be 335 break;
336 case "update mod":
27038d9f 337 $strupdated = get_string("updated", "moodle", get_string("modulename", $info[0]));
ef25340c 338 if (! $changelist["$log->info"]) {
4c654ee3 339 $changelist["$log->info"] = array ("operation" => "update", "text" => "$strupdated:<BR><A HREF=\"$CFG->wwwroot/course/$log->url\">$modname</A>");
ef25340c 340 }
600149be 341 break;
342 case "delete mod":
ef25340c 343 if ($changelist["$log->info"]["operation"] == "add") {
344 $changelist["$log->info"] = NULL;
345 } else {
27038d9f 346 $strdeleted = get_string("deletedactivity", "moodle", get_string("modulename", $info[0]));
4c654ee3 347 $changelist["$log->info"] = array ("operation" => "delete", "text" => $strdeleted);
ef25340c 348 }
600149be 349 break;
350 }
ef25340c 351 }
352 }
353 }
354
355 if ($changelist) {
356 foreach ($changelist as $changeinfo => $change) {
357 if ($change) {
358 $changes[$changeinfo] = $change;
359 }
360 }
361 if (count($changes) > 0) {
4c654ee3 362 print_headline(get_string("courseupdates").":");
ef25340c 363 $content = true;
364 foreach ($changes as $changeinfo => $change) {
365 echo "<P><FONT SIZE=1>".$change["text"]."</FONT></P>";
600149be 366 }
367 }
368 }
369
370
3869a2ac 371 // Now display new things from each module
600149be 372
3869a2ac 373 $mods = get_list_of_plugins("mod");
600149be 374
3869a2ac 375 foreach ($mods as $mod) {
376 include_once("$CFG->dirroot/mod/$mod/lib.php");
377 $print_recent_activity = $mod."_print_recent_activity";
378 if (function_exists($print_recent_activity)) {
379 $modcontent = $print_recent_activity($logs, isteacher($course->id));
380 if ($modcontent) {
381 $content = true;
600149be 382 }
600149be 383 }
384 }
385
3869a2ac 386
600149be 387 if (! $content) {
97c270e9 388 echo "<FONT SIZE=2>".get_string("nothingnew")."</FONT>";
600149be 389 }
600149be 390}
391
e1360728 392
d897cae4 393function get_array_of_activities($courseid) {
394// For a given course, returns an array of course activity objects
395// Each item in the array contains he following properties:
396// cm - course module id
397// mod - name of the module (eg forum)
398// section - the number of the section (eg week or topic)
399// name - the name of the instance
400
401 $mod = array();
402
403 if (!$rawmods = get_records_sql("SELECT cm.*, m.name as modname
404 FROM modules m, course_modules cm
405 WHERE cm.course = '$courseid'
406 AND cm.deleted = '0'
407 AND cm.module = m.id ") ) {
408 return NULL;
409 }
410
411 if ($sections = get_records("course_sections", "course", $courseid, "section ASC")) {
412 foreach ($sections as $section) {
413 if ($section->sequence) {
414 $sequence = explode(",", $section->sequence);
415 foreach ($sequence as $seq) {
416 $mod[$seq]->cm = $rawmods[$seq]->id;
417 $mod[$seq]->mod = $rawmods[$seq]->modname;
418 $mod[$seq]->section = $section->section;
419 $mod[$seq]->name = urlencode(get_field($rawmods[$seq]->modname, "name", "id", $rawmods[$seq]->instance));
420 }
421 }
422 }
423 }
424 return $mod;
425}
426
427
428
e1360728 429
90845098 430function get_all_mods($courseid, &$mods, &$modnames, &$modnamesplural, &$modnamesused) {
431// Returns a number of useful structures for course displays
7468bf01 432
90845098 433 $mods = NULL; // course modules indexed by id
434 $modnames = NULL; // all course module names
94361e02 435 $modnamesplural= NULL; // all course module names (plural form)
90845098 436 $modnamesused = NULL; // course module names used
7468bf01 437
90845098 438 if ($allmods = get_records_sql("SELECT * FROM modules") ) {
439 foreach ($allmods as $mod) {
440 $modnames[$mod->name] = get_string("modulename", "$mod->name");
441 $modnamesplural[$mod->name] = get_string("modulenameplural", "$mod->name");
442 }
443 asort($modnames);
444 } else {
445 error("No modules are installed!");
446 }
447
448 if ($rawmods = get_records_sql("SELECT cm.*, m.name as modname
449 FROM modules m, course_modules cm
450 WHERE cm.course = '$courseid'
451 AND cm.deleted = '0'
94361e02 452 AND cm.module = m.id ") ) {
7468bf01 453 foreach($rawmods as $mod) { // Index the mods
454 $mods[$mod->id] = $mod;
90845098 455 $mods[$mod->id]->modfullname = $modnames[$mod->modname];
456 $modnamesused[$mod->modname] = $modnames[$mod->modname];
7468bf01 457 }
90845098 458 asort($modnamesused);
7468bf01 459 }
7468bf01 460}
461
462function get_all_sections($courseid) {
463
464 return get_records_sql("SELECT section, id, course, summary, sequence
465 FROM course_sections
466 WHERE course = '$courseid'
467 ORDER BY section");
468}
469
ba2e5d73 470function get_all_categories() {
471 return get_records_sql("SELECT * FROM course_categories ORDER by name");
472}
473
5e367a2d 474function print_section_block($heading, $course, $section, $mods, $modnames, $modnamesused,
475 $absolute=true, $width="100%", $isediting=false) {
476
477 global $CFG;
478
479 $modinfo = unserialize($course->modinfo);
480 $moddata = array();
481 $modicon = array();
482 $editbuttons = "";
483
484 if ($section->sequence) {
485
486 $sectionmods = explode(",", $section->sequence);
487
488 foreach ($sectionmods as $modnumber) {
489 $mod = $mods[$modnumber];
490 if ($isediting) {
491 $editbuttons = make_editing_buttons($mod->id, $absolute);
492 }
493 $instancename = urldecode($modinfo[$modnumber]->name);
494 $modicon[] = "<img src=\"$CFG->wwwroot/mod/$mod->modname/icon.gif\" height=\"16\" width=\"16\" alt=\"$mod->modfullname\">";
495 $moddata[] = "<a title=\"$mod->modfullname\" href=\"$CFG->wwwroot/mod/$mod->modname/view.php?id=$mod->id\">$instancename</a><BR>$editbuttons";
496 }
497 }
498 if (isediting($site->id)) {
499 $editmenu = popup_form("$CFG->wwwroot/course/mod.php?id=$course->id&section=0&add=",
500 $modnames, "section0", "", get_string("add")."...", "mods", get_string("activities"), true);
501 $editmenu = "<DIV ALIGN=right>$editmenu</DIV>";
502 }
503
504 print_side_block($heading, "", $moddata, $modicon, $editmenu, $width);
505}
506
507
d897cae4 508function print_section($course, $section, $mods, $modnamesused, $absolute=false, $width="100%") {
94361e02 509 global $CFG;
510
c408b0c4 511 $modinfo = unserialize($course->modinfo);
94361e02 512
19a55d67 513 echo "<TABLE WIDTH=\"$width\"><TR><TD>\n";
94361e02 514 if ($section->sequence) {
515
516 $sectionmods = explode(",", $section->sequence);
517
518 foreach ($sectionmods as $modnumber) {
519 $mod = $mods[$modnumber];
c408b0c4 520 $instancename = urldecode($modinfo[$modnumber]->name);
94361e02 521 echo "<IMG SRC=\"$CFG->wwwroot/mod/$mod->modname/icon.gif\" HEIGHT=16 WIDTH=16 ALT=\"$mod->modfullname\">";
a7ad3ea6 522 echo " <FONT SIZE=2><A TITLE=\"$mod->modfullname\"";
523 echo " HREF=\"$CFG->wwwroot/mod/$mod->modname/view.php?id=$mod->id\">$instancename</A></FONT>";
d897cae4 524 if (isediting($course->id)) {
5e367a2d 525 echo "&nbsp;&nbsp;";
94361e02 526 echo make_editing_buttons($mod->id, $absolute);
527 }
528 echo "<BR>\n";
529 }
530 }
47ef8795 531 echo "</TD></TR></TABLE><BR>\n\n";
a7ad3ea6 532}
533
7541bc3e 534function print_heading_block($heading, $width="100%", $class="headingblock") {
5e367a2d 535 global $THEME;
536
7541bc3e 537 echo "<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"5\">";
538 echo "<tr><td bgcolor=\"$THEME->cellheading\" class=\"$class\">";
5e367a2d 539 echo stripslashes($heading);
540 echo "</td></tr></table>";
5e367a2d 541}
542
543function print_side_block($heading="", $content="", $list=NULL, $icons=NULL, $footer="", $width=180) {
544// Prints a nice side block with an optional header. The content can either
545// be a block of HTML or a list of text with optional icons.
a7ad3ea6 546
5e367a2d 547 global $THEME;
548
7541bc3e 549 print_side_block_start($heading, $width);
550
5e367a2d 551 if ($content) {
7541bc3e 552 echo "$content";
5e367a2d 553 } else {
5e367a2d 554 echo "<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"2\">";
555 foreach ($list as $key => $string) {
7541bc3e 556 echo "<tr bgcolor=\"$THEME->cellcontent2\">";
5e367a2d 557 if ($icons) {
7541bc3e 558 echo "<td class=\"sideblocklinks\" valign=\"top\" width=\"16\">".$icons[$key]."</td>";
a7ad3ea6 559 }
7541bc3e 560 echo "<td class=\"sideblocklinks\" valign=\"top\" width=\"*\"><font size=\"-1\">$string</font></td>";
5e367a2d 561 echo "</tr>";
a7ad3ea6 562 }
5e367a2d 563 if ($footer) {
7541bc3e 564 echo "<tr bgcolor=\"$THEME->cellcontent2\">";
5e367a2d 565 if ($icons) {
7541bc3e 566 echo "<td class=\"sideblocklinks\" valign=\"top\" width=\"16\">&nbsp;</td>";
5e367a2d 567 }
7541bc3e 568 echo "<td class=\"sideblocklinks\"><font size=\"-1\">$footer</td>";
5e367a2d 569 echo "</tr>";
570 }
571 echo "</table>";
a7ad3ea6 572 }
5e367a2d 573
7541bc3e 574 print_side_block_end();
575}
576
577function print_side_block_start($heading="", $width=180, $class="sideblockmain") {
578// Starts a nice side block with an optional header.
579
580 global $THEME;
581
582 echo "<table class=\"sideblock\" width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"5\">";
583 if ($heading) {
584 echo "<tr>";
585 echo "<td class=\"sideblockheading\" bgcolor=\"$THEME->cellheading\">$heading</td>";
586 echo "</tr>";
587 }
588 echo "<tr>";
589 echo "<td class=\"$class\" bgcolor=\"$THEME->cellcontent2\">";
590}
591
592function print_side_block_end() {
593 echo "</td></tr>";
5e367a2d 594 echo "</table><br \>";
94361e02 595}
596
5e367a2d 597
670fddf1 598function print_admin_links ($siteid, $width=180) {
2b25f2a0 599 global $THEME, $CFG;
600
2b25f2a0 601 $icon = "<IMG SRC=\"$CFG->wwwroot/pix/i/settings.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
74944b73 602 $moddata[]="<A HREF=\"$CFG->wwwroot/admin/config.php\">".get_string("configvariables")."</A>";
2b25f2a0 603 $modicon[]=$icon;
604 $moddata[]="<A HREF=\"$CFG->wwwroot/admin/site.php\">".get_string("sitesettings")."</A>";
605 $modicon[]=$icon;
74944b73 606 $moddata[]="<A HREF=\"$CFG->wwwroot/course/log.php?id=$siteid\">".get_string("sitelogs")."</A>";
607 $modicon[]=$icon;
1e3e716f 608 $moddata[]="<A HREF=\"$CFG->wwwroot/theme/index.php\">".get_string("choosetheme")."</A>";
609 $modicon[]=$icon;
31410e9a 610 $moddata[]="<A HREF=\"$CFG->wwwroot/admin/lang.php\">".get_string("checklanguage")."</A>";
611 $modicon[]=$icon;
077f9a67 612 if (file_exists("$CFG->dirroot/admin/$CFG->dbtype")) {
613 $moddata[]="<A HREF=\"$CFG->wwwroot/admin/$CFG->dbtype/\">".get_string("managedatabase")."</A>";
614 $modicon[]=$icon;
615 }
74944b73 616 $moddata[]="<HR>";
617 $modicon[]="";
2b25f2a0 618 $moddata[]="<A HREF=\"$CFG->wwwroot/course/edit.php\">".get_string("addnewcourse")."</A>";
619 $modicon[]=$icon;
ba2e5d73 620 $moddata[]="<A HREF=\"$CFG->wwwroot/course/categories.php\">".get_string("categories")."</A>";
621 $modicon[]=$icon;
2b25f2a0 622 $moddata[]="<A HREF=\"$CFG->wwwroot/course/teacher.php\">".get_string("assignteachers")."</A>";
623 $modicon[]=$icon;
624 $moddata[]="<A HREF=\"$CFG->wwwroot/course/delete.php\">".get_string("deletecourse")."</A>";
625 $modicon[]=$icon;
74944b73 626 $moddata[]="<HR>";
627 $modicon[]="";
2b25f2a0 628 $moddata[]="<A HREF=\"$CFG->wwwroot/admin/user.php?newuser=true\">".get_string("addnewuser")."</A>";
629 $modicon[]=$icon;
630 $moddata[]="<A HREF=\"$CFG->wwwroot/admin/user.php\">".get_string("edituser")."</A>";
631 $modicon[]=$icon;
d7facad8 632 $moddata[]="<A HREF=\"$CFG->wwwroot/admin/admin.php\">".get_string("assignadmins")."</A>";
633 $modicon[]=$icon;
60459ef7 634 $moddata[]="<A HREF=\"$CFG->wwwroot/admin/auth.php\">".get_string("authentication")."</A>";
635 $modicon[]=$icon;
2b25f2a0 636 $fulladmin = "<P><A HREF=\"$CFG->wwwroot/admin/\">".get_string("admin")."</A>...";
5e367a2d 637
638 print_side_block(get_string("administration"), "", $moddata, $modicon, $fulladmin, $width);
639
19a55d67 640 echo "<IMG SRC=\"$CFG->wwwroot/pix/spacer.gif\" WIDTH=\"$width\" HEIGHT=1><BR>";
2b25f2a0 641}
642
b4d7002e 643function print_course_admin_links($course, $width=180) {
44dad735 644 global $THEME, $CFG;
645
44dad735 646 $adminicon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/edit.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
b4d7002e 647 if (isediting($course->id)) {
648 $admindata[]="<A HREF=\"view.php?id=$course->id&edit=off\">".get_string("turneditingoff")."</A>";
44dad735 649 } else {
b4d7002e 650 $admindata[]="<A HREF=\"view.php?id=$course->id&edit=on\">".get_string("turneditingon")."</A>";
651 }
652 $admindata[]="<A HREF=\"edit.php?id=$course->id\">".get_string("settings")."...</A>";
653 $adminicon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/settings.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
654 if (!$course->teachers) {
655 $course->teachers = get_string("defaultcourseteachers");
44dad735 656 }
b4d7002e 657 $admindata[]="<A HREF=\"teachers.php?id=$course->id\">$course->teachers...</A>";
44dad735 658 $adminicon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/settings.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
b4d7002e 659
3486b7be 660 $admindata[]="<A HREF=\"grades.php?id=$course->id\">".get_string("grades")."...</A>";
661 $adminicon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/grades.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
662
b4d7002e 663 $admindata[]="<A HREF=\"log.php?id=$course->id\">".get_string("logs")."...</A>";
44dad735 664 $adminicon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/log.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
b4d7002e 665 $admindata[]="<A HREF=\"$CFG->wwwroot/files/index.php?id=$course->id\">".get_string("files")."...</A>";
44dad735 666 $adminicon[]="<IMG SRC=\"$CFG->wwwroot/files/pix/files.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
667
b4d7002e 668 $admindata[]="<A HREF=\"$CFG->wwwroot/doc/view.php?id=$course->id&file=teacher.html\">".get_string("help")."...</A>";
2a439ba7 669 $adminicon[]="<IMG SRC=\"$CFG->wwwroot/mod/resource/icon.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
44dad735 670
b4d7002e 671
672 if ($teacherforum = forum_get_course_forum($course->id, "teacher")) {
673 $admindata[]="<A HREF=\"$CFG->wwwroot/mod/forum/view.php?f=$teacherforum->id\">".get_string("nameteacher", "forum")."</A>";
44dad735 674 $adminicon[]="<IMG SRC=\"$CFG->wwwroot/mod/forum/icon.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
675 }
676
5e367a2d 677 print_side_block(get_string("administration"), "", $admindata, $adminicon, "", $width);
44dad735 678}
2b25f2a0 679
ba2e5d73 680function print_course_categories($categories, $selected="none", $width=180) {
0a263205 681 global $CFG, $THEME, $USER;
85098089 682
683 $strallowguests = get_string("allowguests");
684 $strrequireskey = get_string("requireskey");
ba2e5d73 685
0c656181 686 if ($selected == "index") { // Print comprehensive index of categories with courses
687 if ($courses = get_records_sql("SELECT * FROM course WHERE category > 0 ORDER BY shortname")) {
688 if (isset($USER->id) and !isadmin()) {
39246b72 689 print_simple_box_start("CENTER", "100%", $THEME->cellheading);
0c656181 690 print_heading("<A HREF=\"course/index.php?category=my\">".get_string("mycourses")."</A>", "LEFT");
691 $some = false;
692 echo "<UL>";
693 foreach ($courses as $key => $course) {
694 if (isteacher($course->id) or isstudent($course->id)) {
85098089 695 echo "<A HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->fullname</A>";
696 echo "<BR>";
0c656181 697 $some = true;
698 }
699 }
700 if (!$some) {
701 print_string("nocoursesyet");
702 }
703 echo "</UL>";
704 print_simple_box_end();
705 print_spacer(8,1);
706 }
707 foreach ($categories as $category) {
bd4707bf 708 print_simple_box_start("CENTER", "100%");
7ef459eb 709 print_heading("<A HREF=\"course/index.php?category=$category->id\">$category->name</A>", "LEFT");
0c656181 710 $some = false;
711 echo "<UL>";
712 foreach ($courses as $key => $course) {
713 if ($course->category == $category->id) {
85098089 714 echo "<A HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->fullname</A>";
715 echo "&nbsp;&nbsp;";
0c656181 716 unset($courses[$key]);
85098089 717 if ($course->guest ) {
718 echo "<A TITLE=\"$strallowguests\" HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">";
719 echo "<IMG ALT=\"\" HEIGHT=16 WIDTH=16 BORDER=0 SRC=\"$CFG->wwwroot/user/user.gif\"></A>";
720 }
721 if ($course->password) {
722 echo "<A TITLE=\"$strrequireskey\" HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">";
723 echo "<IMG ALT=\"\" HEIGHT=16 WIDTH=16 BORDER=0 SRC=\"$CFG->wwwroot/pix/i/key.gif\"></A>";
724 }
725 echo "<BR>";
0c656181 726 $some = true;
727 }
728 }
729 if (!$some) {
730 print_string("nocoursesyet");
731 }
732 echo "</UL>";
733 print_simple_box_end();
734 print_spacer(8,1);
735 }
ba2e5d73 736 }
0c656181 737
738 } else { // Print short list of categories only
739 foreach ($categories as $cat) {
740 $caticon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/course.gif\" HEIGHT=16 WIDTH=16>";
741 if ($cat->id == $selected) {
742 $catdata[]="$cat->name";
743 } else {
744 $catdata[]="<A HREF=\"$CFG->wwwroot/course/index.php?category=$cat->id\">$cat->name</A>";
745 }
746 }
747 $catdata[] = "<A HREF=\"$CFG->wwwroot/course/index.php?category=all\">".get_string("fulllistofcourses")."</A>";
748 if (isset($USER->id)) {
749 $catdata[] = "<A HREF=\"$CFG->wwwroot/course/index.php?category=my\">".get_string("mycourses")."</A>";
750 }
5e367a2d 751 print_side_block(get_string("categories"), "", $catdata, $caticon, $showall.$mine, $width);
ba2e5d73 752 }
ba2e5d73 753}
94361e02 754
2b8cef80 755function print_log_graph($course, $userid=0, $type="course.png", $date=0) {
756 global $CFG;
757 echo "<IMG BORDER=0 SRC=\"$CFG->wwwroot/course/loggraph.php?id=$course->id&user=$userid&type=$type&date=$date\">";
758}
759
11b0c469 760
761
762/// MODULE FUNCTIONS /////////////////////////////////////////////////////////////////
763
764function add_course_module($mod) {
765 GLOBAL $db;
766
e5dfd0f3 767 $mod->added = time();
11b0c469 768
e5dfd0f3 769 return insert_record("course_modules", $mod);
11b0c469 770}
771
772function add_mod_to_section($mod) {
773// Returns the course_sections ID where the mod is inserted
774 GLOBAL $db;
775
e5dfd0f3 776 if ($section = get_record_sql("SELECT * FROM course_sections
777 WHERE course = '$mod->course' AND section = '$mod->section'") ) {
11b0c469 778
e5dfd0f3 779 if ($section->sequence) {
780 $newsequence = "$section->sequence,$mod->coursemodule";
11b0c469 781 } else {
782 $newsequence = "$mod->coursemodule";
783 }
e5dfd0f3 784 if (set_field("course_sections", "sequence", $newsequence, "id", $section->id)) {
785 return $section->id; // Return course_sections ID that was used.
11b0c469 786 } else {
e5dfd0f3 787 return 0;
11b0c469 788 }
789
790 } else { // Insert a new record
e5dfd0f3 791 $section->course = $mod->course;
792 $section->section = $mod->section;
793 $section->summary = "";
794 $section->sequence = $mod->coursemodule;
795 return insert_record("course_sections", $section);
11b0c469 796 }
797}
798
799function delete_course_module($mod) {
800 return set_field("course_modules", "deleted", 1, "id", $mod);
801}
802
803function delete_mod_from_section($mod, $section) {
804 GLOBAL $db;
805
e5dfd0f3 806 if ($section = get_record("course_sections", "id", "$section") ) {
11b0c469 807
e5dfd0f3 808 $modarray = explode(",", $section->sequence);
11b0c469 809
810 if ($key = array_keys ($modarray, $mod)) {
811 array_splice($modarray, $key[0], 1);
812 $newsequence = implode(",", $modarray);
e5dfd0f3 813 return set_field("course_sections", "sequence", $newsequence, "id", $section->id);
11b0c469 814 } else {
815 return false;
816 }
817
818 } else {
819 return false;
820 }
821}
822
823
7c0f2984 824function move_module($cm, $move) {
11b0c469 825 GLOBAL $db;
826
827 if (!$move) {
828 return true;
829 }
830
11b0c469 831 if (! $thissection = get_record("course_sections", "id", $cm->section)) {
832 error("This course section doesn't exist");
833 }
834
835 $mods = explode(",", $thissection->sequence);
836
837 $len = count($mods);
838 $pos = array_keys($mods, $cm->id);
839 $thepos = $pos[0];
840
841 if ($len == 0 || count($pos) == 0 ) {
842 error("Very strange. Could not find the required module in this section.");
843 }
844
845 if ($len == 1) {
846 $first = true;
847 $last = true;
848 } else {
849 $first = ($thepos == 0);
850 $last = ($thepos == $len - 1);
851 }
852
853 if ($move < 0) { // Moving the module up
854
855 if ($first) {
856 if ($thissection->section == 1) { // First section, do nothing
857 return true;
858 } else { // Push onto end of previous section
859 $prevsectionnumber = $thissection->section - 1;
860 if (! $prevsection = get_record_sql("SELECT * FROM course_sections
861 WHERE course='$thissection->course'
862 AND section='$prevsectionnumber' ")) {
863 error("Previous section ($prevsection->id) doesn't exist");
864 }
865
866 if ($prevsection->sequence) {
867 $newsequence = "$prevsection->sequence,$cm->id";
868 } else {
869 $newsequence = "$cm->id";
870 }
871
872 if (! set_field("course_sections", "sequence", $newsequence, "id", $prevsection->id)) {
873 error("Previous section could not be updated");
874 }
875
876 if (! set_field("course_modules", "section", $prevsection->id, "id", $cm->id)) {
877 error("Module could not be updated");
878 }
879
880 array_splice($mods, 0, 1);
881 $newsequence = implode(",", $mods);
882 if (! set_field("course_sections", "sequence", $newsequence, "id", $thissection->id)) {
883 error("Module could not be updated");
884 }
885
886 return true;
887
888 }
889 } else { // move up within this section
890 $swap = $mods[$thepos-1];
891 $mods[$thepos-1] = $mods[$thepos];
892 $mods[$thepos] = $swap;
893
894 $newsequence = implode(",", $mods);
895 if (! set_field("course_sections", "sequence", $newsequence, "id", $thissection->id)) {
896 error("This section could not be updated");
897 }
898 return true;
899 }
900
901 } else { // Moving the module down
902
903 if ($last) {
904 $nextsectionnumber = $thissection->section + 1;
905 if ($nextsection = get_record_sql("SELECT * FROM course_sections
906 WHERE course='$thissection->course'
907 AND section='$nextsectionnumber' ")) {
908
909 if ($nextsection->sequence) {
910 $newsequence = "$cm->id,$nextsection->sequence";
911 } else {
912 $newsequence = "$cm->id";
913 }
914
915 if (! set_field("course_sections", "sequence", $newsequence, "id", $nextsection->id)) {
916 error("Next section could not be updated");
917 }
918
919 if (! set_field("course_modules", "section", $nextsection->id, "id", $cm->id)) {
920 error("Module could not be updated");
921 }
922
923 array_splice($mods, $thepos, 1);
924 $newsequence = implode(",", $mods);
925 if (! set_field("course_sections", "sequence", $newsequence, "id", $thissection->id)) {
926 error("This section could not be updated");
927 }
928 return true;
929
930 } else { // There is no next section, so just return
931 return true;
932
933 }
934 } else { // move down within this section
935 $swap = $mods[$thepos+1];
936 $mods[$thepos+1] = $mods[$thepos];
937 $mods[$thepos] = $swap;
938
939 $newsequence = implode(",", $mods);
940 if (! set_field("course_sections", "sequence", $newsequence, "id", $thissection->id)) {
941 error("This section could not be updated");
942 }
943 return true;
944 }
945 }
946}
947
94361e02 948function make_editing_buttons($moduleid, $absolute=false) {
949 global $CFG;
950
90845098 951 $delete = get_string("delete");
952 $moveup = get_string("moveup");
953 $movedown = get_string("movedown");
954 $update = get_string("update");
94361e02 955
956 if ($absolute) {
957 $path = "$CFG->wwwroot/course/";
958 } else {
959 $path = "";
960 }
5e367a2d 961 return "<A TITLE=\"$delete\" HREF=\"".$path."mod.php?delete=$moduleid\"><IMG
97c270e9 962 SRC=".$path."../pix/t/delete.gif BORDER=0></A>
963 <A TITLE=\"$moveup\" HREF=\"".$path."mod.php?id=$moduleid&move=-1\"><IMG
964 SRC=".$path."../pix/t/up.gif BORDER=0></A>
965 <A TITLE=\"$movedown\" HREF=\"".$path."mod.php?id=$moduleid&move=1\"><IMG
966 SRC=".$path."../pix/t/down.gif BORDER=0></A>
967 <A TITLE=\"$update\" HREF=\"".$path."mod.php?update=$moduleid\"><IMG
968 SRC=".$path."../pix/t/edit.gif BORDER=0></A>";
90845098 969}
970
f9903ed0 971?>