4 if (!isset($CFG->journal_showrecentactivity
)) {
5 set_config("journal_showrecentactivity", true);
10 // STANDARD MODULE FUNCTIONS /////////////////////////////////////////////////////////
12 function journal_user_outline($course, $user, $mod, $journal) {
13 if ($entry = get_record("journal_entries", "userid", $user->id
, "journal", $journal->id
)) {
15 $numwords = count(preg_split("/\w\b/", $entry->text
)) - 1;
17 $result->info
= get_string("numwords", "", $numwords);
18 $result->time
= $entry->modified
;
25 function journal_user_complete($course, $user, $mod, $journal) {
27 if ($entry = get_record("journal_entries", "userid", $user->id
, "journal", $journal->id
)) {
29 print_simple_box_start();
30 if ($entry->modified
) {
31 echo "<p><font size=\"1\">".get_string("lastedited").": ".userdate($entry->modified
)."</font></p>";
34 echo format_text($entry->text
, $entry->format
);
36 if ($entry->teacher
) {
37 $grades = make_grades_menu($journal->assessed
);
38 journal_print_feedback($course, $entry, $grades);
40 print_simple_box_end();
43 print_string("noentry", "journal");
48 function journal_user_complete_index($course, $user, $journal, $journalopen, $heading) {
49 /// Prints a journal, entry and feedback ... used on the journal index page.
51 if (isteacher($course->id
)) {
52 $entrycount = journal_count_entries($journal, get_current_group($course->id
));
53 $entryinfo = " (<a href=\"report.php?id=$journal->coursemodule\">".get_string("viewallentries","journal", $entrycount)."</a>)";
58 $journal->name
= "<a href=\"view.php?id=$journal->coursemodule\">".format_string($journal->name
,true)."</a>";
61 echo "<h3>$heading - $journal->name$entryinfo</h3>";
63 echo "<h3>$journal->name$entryinfo</h3>";
66 print_simple_box_start("left", "90%");
67 echo format_text($journal->intro
, $journal->introformat
);
68 print_simple_box_end();
69 echo "<br clear=\"all\" />";
72 if (isstudent($course->id
) or isteacher($course->id
)) {
74 print_simple_box_start("right", "90%");
77 echo "<p align=\"right\"><a href=\"edit.php?id=$journal->coursemodule\">";
78 echo get_string("edit")."</a></p>";
80 echo "<p align=\"right\"><a href=\"view.php?id=$journal->coursemodule\">";
81 echo get_string("view")."</a></p>";
84 if ($entry = get_record("journal_entries", "userid", $user->id
, "journal", $journal->id
)) {
85 if ($entry->modified
) {
86 echo "<p align=\"center\"><font size=\"1\">".get_string("lastedited").": ".userdate($entry->modified
)."</font></p>";
89 echo format_text($entry->text
, $entry->format
);
91 if ($entry->teacher
) {
92 $grades = make_grades_menu($journal->assessed
);
93 journal_print_feedback($course, $entry, $grades);
96 print_string("noentry", "journal");
99 print_simple_box_end();
100 echo "<br clear=\"all\" />";
107 function journal_cron () {
108 // Function to be run periodically according to the moodle cron
109 // Finds all journal notifications that have yet to be mailed out, and mails them
113 $cutofftime = time() - $CFG->maxeditingtime
;
115 if ($entries = journal_get_unmailed_graded($cutofftime)) {
118 foreach ($entries as $entry) {
120 echo "Processing journal entry $entry->id\n";
122 if (! $user = get_record("user", "id", "$entry->userid")) {
123 echo "Could not find user $entry->userid\n";
127 $USER->lang
= $user->lang
;
129 if (! $course = get_record("course", "id", "$entry->course")) {
130 echo "Could not find course $entry->course\n";
134 if (! isstudent($course->id
, $user->id
) and !isteacher($course->id
, $user->id
)) {
135 continue; // Not an active participant
138 if (! $teacher = get_record("user", "id", "$entry->teacher")) {
139 echo "Could not find teacher $entry->teacher\n";
144 if (! $mod = get_coursemodule_from_instance("journal", $entry->journal
, $course->id
)) {
145 echo "Could not find course module for journal id $entry->journal\n";
150 $journalinfo->teacher
= fullname($teacher);
151 $journalinfo->journal
= format_string($entry->name
,true);
152 $journalinfo->url
= "$CFG->wwwroot/mod/journal/view.php?id=$mod->id";
153 $modnamepl = get_string( 'modulenameplural','journal' );
154 $msubject = get_string( 'mailsubject','journal' );
156 $postsubject = "$course->shortname: $msubject: ".format_string($entry->name
,true);
157 $posttext = "$course->shortname -> $modnamepl -> ".format_string($entry->name
,true)."\n";
158 $posttext .= "---------------------------------------------------------------------\n";
159 $posttext .= get_string("journalmail", "journal", $journalinfo)."\n";
160 $posttext .= "---------------------------------------------------------------------\n";
161 if ($user->mailformat
== 1) { // HTML
162 $posthtml = "<p><font face=\"sans-serif\">".
163 "<a href=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->shortname</a> ->".
164 "<a href=\"$CFG->wwwroot/mod/journal/index.php?id=$course->id\">journals</a> ->".
165 "<a href=\"$CFG->wwwroot/mod/journal/view.php?id=$mod->id\">".format_string($entry->name
,true)."</a></font></p>";
166 $posthtml .= "<hr /><font face=\"sans-serif\">";
167 $posthtml .= "<p>".get_string("journalmailhtml", "journal", $journalinfo)."</p>";
168 $posthtml .= "</font><hr />";
173 if (! email_to_user($user, $teacher, $postsubject, $posttext, $posthtml)) {
174 echo "Error: Journal cron: Could not send out mail for id $entry->id to user $user->id ($user->email)\n";
176 if (! set_field("journal_entries", "mailed", "1", "id", "$entry->id")) {
177 echo "Could not update the mailed field for id $entry->id\n";
185 function journal_print_recent_activity($course, $isteacher, $timestart) {
188 if (!empty($CFG->journal_showrecentactivity
)) { // Don't even bother
195 if (!$logs = get_records_select('log', 'time > \''.$timestart.'\' AND '.
196 'course = \''.$course->id
.'\' AND '.
197 'module = \'journal\' AND '.
198 '(action = \'add entry\' OR action = \'update entry\')', 'time ASC')){
202 foreach ($logs as $log) {
203 ///Get journal info. I'll need it later
204 $j_log_info = journal_log_info($log);
206 //Create a temp valid module structure (course,id)
207 $tempmod->course
= $log->course
;
208 $tempmod->id
= $j_log_info->id
;
209 //Obtain the visible property from the instance
210 $modvisible = instance_is_visible($log->module
,$tempmod);
212 //Only if the mod is visible
214 if (!isset($journals[$log->info
])) {
215 $journals[$log->info
] = $j_log_info;
216 $journals[$log->info
]->time
= $log->time
;
217 $journals[$log->info
]->url
= str_replace('&', '&', $log->url
);
224 print_headline(get_string('newjournalentries', 'journal').':');
225 foreach ($journals as $journal) {
226 print_recent_activity_note($journal->time
, $journal, $journal->name
,
227 $CFG->wwwroot
.'/mod/journal/'.$journal->url
);
234 function journal_grades($journalid) {
235 /// Must return an array of grades, indexed by user, and a max grade.
237 if (!$journal = get_record("journal", "id", $journalid)) {
241 $grades = get_records_menu("journal_entries", "journal",
242 $journal->id
, "", "userid,rating");
244 if ($journal->assessed
> 0) {
245 $return->grades
= $grades;
246 $return->maxgrade
= $journal->assessed
;
248 } else if ($journal->assessed
== 0) {
252 if ($scale = get_record("scale", "id", - $journal->assessed
)) {
253 $scalegrades = make_menu_from_list($scale->scale
);
255 foreach ($grades as $key => $grade) {
256 $grades[$key] = $scalegrades[$grade];
260 $return->grades
= $grades;
261 $return->maxgrade
= "";
267 function journal_get_participants($journalid) {
268 //Returns the users with data in one journal
269 //(users with records in journal_entries, students and teachers)
274 $students = get_records_sql("SELECT DISTINCT u.id, u.id
275 FROM {$CFG->prefix}user u,
276 {$CFG->prefix}journal_entries j
277 WHERE j.journal = '$journalid' and
280 $teachers = get_records_sql("SELECT DISTINCT u.id, u.id
281 FROM {$CFG->prefix}user u,
282 {$CFG->prefix}journal_entries j
283 WHERE j.journal = '$journalid' and
286 //Add teachers to students
288 foreach ($teachers as $teacher) {
289 $students[$teacher->id
] = $teacher;
292 //Return students array (it contains an array of unique users)
296 function journal_scale_used ($journalid,$scaleid) {
297 //This function returns if a scale is being used by one journal
301 $rec = get_record("journal","id","$journalid","assessed","-$scaleid");
303 if (!empty($rec) && !empty($scaleid)) {
311 * Checks if scale is being used by any instance of journal
313 * This is used to find out if scale used anywhere
314 * @param $scaleid int
315 * @return boolean True if the scale is used by any journal
317 function journal_scale_used_anywhere($scaleid) {
318 if ($scaleid and record_exists('journal', 'assessed', -$scaleid)) {
325 // SQL FUNCTIONS ///////////////////////////////////////////////////////////////////
327 function journal_get_users_done($journal) {
330 $journals = get_records_sql ("SELECT u.*
331 FROM {$CFG->prefix}journal_entries j,
333 WHERE j.userid = u.id
334 AND j.journal = $journal->id
335 ORDER BY j.modified DESC");
337 if (empty($journals)) {
341 // remove unenrolled participants
342 foreach ($journals as $key=>$user) {
343 if (!isteacher($journal->course
, $user->id
) and !isstudent($journal->course
, $user->id
)) {
344 unset($journals[$key]);
350 function journal_count_entries($journal, $groupid=0) {
351 /// Counts all the journal entries (optionally in a given group)
355 if ($groupid) { /// How many in a particular group?
356 return count_records_sql("SELECT COUNT(*)
357 FROM {$CFG->prefix}journal_entries j,
358 {$CFG->prefix}groups_members g
359 WHERE j.journal = $journal->id
360 AND g.groupid = '$groupid'
361 AND j.userid = g.userid");
363 } else { /// Count all the entries from the whole course
365 $journals = get_records_sql ("SELECT u.*
366 FROM {$CFG->prefix}journal_entries j,
368 WHERE j.userid = u.id
369 AND j.journal = $journal->id
370 ORDER BY j.modified DESC");
372 if (empty($journals)) {
376 // remove unenrolled participants
377 foreach ($journals as $key=>$user) {
378 if (!isteacher($journal->course
, $user->id
) and !isstudent($journal->course
, $user->id
)) {
379 unset($journals[$key]);
382 return count($journals);
387 function journal_get_unmailed_graded($cutofftime) {
389 return get_records_sql("SELECT e.*, j.course, j.name
390 FROM {$CFG->prefix}journal_entries e,
391 {$CFG->prefix}journal j
393 AND e.timemarked < '$cutofftime'
395 AND e.journal = j.id");
398 function journal_log_info($log) {
400 return get_record_sql("SELECT j.*, u.firstname, u.lastname
401 FROM {$CFG->prefix}journal j,
402 {$CFG->prefix}journal_entries e,
404 WHERE e.id = '$log->info'
406 AND e.userid = u.id");
409 // OTHER JOURNAL FUNCTIONS ///////////////////////////////////////////////////////////////////
413 function journal_print_user_entry($course, $user, $entry, $teachers, $grades) {
416 echo "\n<table border=\"1\" cellspacing=\"0\" valign=\"top\" cellpadding=\"10\">";
419 echo "\n<td rowspan=\"2\" width=\"35\" valign=\"top\">";
420 print_user_picture($user->id
, $course->id
, $user->picture
);
422 echo "<td nowrap=\"nowrap\" width=\"100%\">".fullname($user);
424 echo " <font size=\"1\">".get_string("lastedited").": ".userdate($entry->modified
)."</font>";
429 echo "\n<tr><td width=\"100%\">";
431 echo format_text($entry->text
, $entry->format
);
433 print_string("noentry", "journal");
439 echo "<td width=\"35\" valign=\"top\">";
440 if (!$entry->teacher
) {
441 $entry->teacher
= $USER->id
;
443 print_user_picture($entry->teacher
, $course->id
, $teachers[$entry->teacher
]->picture
);
445 echo "<td>".get_string("feedback").":";
446 choose_from_menu($grades, "r$entry->id", $entry->rating
, get_string("nograde")."...");
447 if ($entry->timemarked
) {
448 echo " <font size=\"1\">".userdate($entry->timemarked
)."</font>";
450 echo "<br /><textarea name=\"c$entry->id\" rows=\"12\" cols=\"60\" wrap=\"virtual\">";
451 p($entry->entrycomment
);
452 echo "</textarea><br />";
455 echo "</table><br clear=\"all\" />\n";
459 function journal_add_instance($journal) {
460 // Given an object containing all the necessary data,
461 // (defined by the form in mod.html) this function
462 // will create a new instance and return the id number
463 // of the new instance.
465 $journal->timemodified
= time();
467 return insert_record("journal", $journal);
471 function journal_update_instance($journal) {
472 // Given an object containing all the necessary data,
473 // (defined by the form in mod.html) this function
474 // will update an existing instance with new data.
476 $journal->timemodified
= time();
477 $journal->id
= $journal->instance
;
479 return update_record("journal", $journal);
483 function journal_delete_instance($id) {
484 // Given an ID of an instance of this module,
485 // this function will permanently delete the instance
486 // and any data that depends on it.
488 if (! $journal = get_record("journal", "id", $id)) {
494 if (! delete_records("journal_entries", "journal", $journal->id
)) {
498 if (! delete_records("journal", "id", $journal->id
)) {
507 function journal_print_feedback($course, $entry, $grades) {
510 if (! $teacher = get_record('user', 'id', $entry->teacher
)) {
511 error('Weird journal error');
514 echo '<table cellspacing="0" align="center" class="feedbackbox">';
517 echo '<td class="left picture">';
518 print_user_picture($teacher->id
, $course->id
, $teacher->picture
);
520 echo '<td class="entryheader">';
521 echo '<span class="author">'.fullname($teacher).'</span>';
522 echo ' <span class="time">'.userdate($entry->timemarked
).'</span>';
527 echo '<td class="left side"> </td>';
528 echo '<td class="entrycontent">';
530 echo '<div class="grade">';
532 if (!empty($entry->rating
) and !empty($grades[$entry->rating
])) {
533 echo get_string('grade').': ';
534 echo $grades[$entry->rating
];
536 print_string('nograde');
540 echo format_text($entry->entrycomment
);
541 echo '</td></tr></table>';
544 function journal_get_view_actions() {
545 return array('view','view all','view responses');
548 function journal_get_post_actions() {
549 return array('add entry','update entry','update feedback');