9544e910009b30f11083c0b337c7b8245127834a
[moodle.git] / report / log / locallib.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * This file contains functions used by the log reports
19  *
20  * This files lists the functions that are used during the log report generation.
21  *
22  * @package    report_log
23  * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
24  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25  */
27 defined('MOODLE_INTERNAL') || die;
29 if (!defined('REPORT_LOG_MAX_DISPLAY')) {
30     define('REPORT_LOG_MAX_DISPLAY', 150); // days
31 }
33 require_once(dirname(__FILE__).'/lib.php');
35 /**
36  * This function is used to generate and display the log activity graph
37  *
38  * @global stdClass $CFG
39  * @param  stdClass $course course instance
40  * @param  int    $userid id of the user whose logs are needed
41  * @param  string $type type of logs graph needed (usercourse.png/userday.png)
42  * @param  int    $date timestamp in GMT (seconds since epoch)
43  * @return void
44  */
45 function report_log_print_graph($course, $userid, $type, $date=0) {
46     global $CFG;
48     if (empty($CFG->gdversion)) {
49         echo "(".get_string("gdneed").")";
50     } else {
51         echo '<img src="'.$CFG->wwwroot.'/report/log/graph.php?id='.$course->id.
52              '&amp;user='.$userid.'&amp;type='.$type.'&amp;date='.$date.'" alt="" />';
53     }
54 }
55 /**
56  * This function is used to generate and display Mnet selector form
57  *
58  * @global stdClass $USER
59  * @global stdClass $CFG
60  * @global stdClass $SITE
61  * @global moodle_database $DB
62  * @global core_renderer $OUTPUT
63  * @global stdClass $SESSION
64  * @uses CONTEXT_SYSTEM
65  * @uses COURSE_MAX_COURSES_PER_DROPDOWN
66  * @uses CONTEXT_COURSE
67  * @uses SEPARATEGROUPS
68  * @param  int      $hostid host id
69  * @param  stdClass $course course instance
70  * @param  int      $selecteduser id of the selected user
71  * @param  string   $selecteddate Date selected
72  * @param  string   $modname course_module->id
73  * @param  string   $modid number or 'site_errors'
74  * @param  string   $modaction an action as recorded in the logs
75  * @param  int      $selectedgroup Group to display
76  * @param  int      $showcourses whether to show courses if we're over our limit.
77  * @param  int      $showusers whether to show users if we're over our limit.
78  * @param  string   $logformat Format of the logs (downloadascsv, showashtml, downloadasods, downloadasexcel)
79  * @return void
80  */
81 function report_log_print_mnet_selector_form($hostid, $course, $selecteduser=0, $selecteddate='today',
82                                  $modname="", $modid=0, $modaction='', $selectedgroup=-1, $showcourses=0, $showusers=0, $logformat='showashtml') {
84     global $USER, $CFG, $SITE, $DB, $OUTPUT, $SESSION;
85     require_once $CFG->dirroot.'/mnet/peer.php';
87     $mnet_peer = new mnet_peer();
88     $mnet_peer->set_id($hostid);
90     $sql = "SELECT DISTINCT course, hostid, coursename FROM {mnet_log}";
91     $courses = $DB->get_records_sql($sql);
92     $remotecoursecount = count($courses);
94     // first check to see if we can override showcourses and showusers
95     $numcourses = $remotecoursecount + $DB->count_records('course');
96     if ($numcourses < COURSE_MAX_COURSES_PER_DROPDOWN && !$showcourses) {
97         $showcourses = 1;
98     }
100     $sitecontext = get_context_instance(CONTEXT_SYSTEM);
102     // Context for remote data is always SITE
103     // Groups for remote data are always OFF
104     if ($hostid == $CFG->mnet_localhost_id) {
105         $context = get_context_instance(CONTEXT_COURSE, $course->id);
107         /// Setup for group handling.
108         if ($course->groupmode == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) {
109             $selectedgroup = -1;
110             $showgroups = false;
111         } else if ($course->groupmode) {
112             $showgroups = true;
113         } else {
114             $selectedgroup = 0;
115             $showgroups = false;
116         }
118         if ($selectedgroup === -1) {
119             if (isset($SESSION->currentgroup[$course->id])) {
120                 $selectedgroup =  $SESSION->currentgroup[$course->id];
121             } else {
122                 $selectedgroup = groups_get_all_groups($course->id, $USER->id);
123                 if (is_array($selectedgroup)) {
124                     $selectedgroup = array_shift(array_keys($selectedgroup));
125                     $SESSION->currentgroup[$course->id] = $selectedgroup;
126                 } else {
127                     $selectedgroup = 0;
128                 }
129             }
130         }
132     } else {
133         $context = $sitecontext;
134     }
136     // Get all the possible users
137     $users = array();
139     // Define limitfrom and limitnum for queries below
140     // If $showusers is enabled... don't apply limitfrom and limitnum
141     $limitfrom = empty($showusers) ? 0 : '';
142     $limitnum  = empty($showusers) ? COURSE_MAX_USERS_PER_DROPDOWN + 1 : '';
144     // If looking at a different host, we're interested in all our site users
145     if ($hostid == $CFG->mnet_localhost_id && $course->id != SITEID) {
146         $courseusers = get_enrolled_users($context, '', $selectedgroup, 'u.id, u.firstname, u.lastname, u.idnumber', 'lastname ASC, firstname ASC', $limitfrom, $limitnum);
147     } else {
148         // this may be a lot of users :-(
149         $courseusers = $DB->get_records('user', array('deleted'=>0), 'lastaccess DESC', 'id, firstname, lastname, idnumber', $limitfrom, $limitnum);
150     }
152     if (count($courseusers) < COURSE_MAX_USERS_PER_DROPDOWN && !$showusers) {
153         $showusers = 1;
154     }
156     if ($showusers) {
157         if ($courseusers) {
158             foreach ($courseusers as $courseuser) {
159                 $users[$courseuser->id] = fullname($courseuser, has_capability('moodle/site:viewfullnames', $context));
160             }
161         }
162         $users[$CFG->siteguest] = get_string('guestuser');
163     }
165     // Get all the hosts that have log records
166     $sql = "select distinct
167                 h.id,
168                 h.name
169             from
170                 {mnet_host} h,
171                 {mnet_log} l
172             where
173                 h.id = l.hostid
174             order by
175                 h.name";
177     if ($hosts = $DB->get_records_sql($sql)) {
178         foreach($hosts as $host) {
179             $hostarray[$host->id] = $host->name;
180         }
181     }
183     $hostarray[$CFG->mnet_localhost_id] = $SITE->fullname;
184     asort($hostarray);
186     $dropdown = array();
188     foreach($hostarray as $hostid => $name) {
189         $courses = array();
190         $sites = array();
191         if ($CFG->mnet_localhost_id == $hostid) {
192             if (has_capability('report/log:view', $sitecontext) && $showcourses) {
193                 if ($ccc = $DB->get_records("course", null, "fullname","id,fullname,category")) {
194                     foreach ($ccc as $cc) {
195                         if ($cc->id == SITEID) {
196                             $sites["$hostid/$cc->id"]   = format_string($cc->fullname).' ('.get_string('site').')';
197                         } else {
198                             $courses["$hostid/$cc->id"] = format_string($cc->fullname);
199                         }
200                     }
201                 }
202             }
203         } else {
204             if (has_capability('report/log:view', $sitecontext) && $showcourses) {
205                 $sql = "SELECT DISTINCT course, coursename FROM {mnet_log} where hostid = ?";
206                 if ($ccc = $DB->get_records_sql($sql, array($hostid))) {
207                     foreach ($ccc as $cc) {
208                         if (1 == $cc->course) { // TODO: this might be wrong - site course may have another id
209                             $sites["$hostid/$cc->course"]   = $cc->coursename.' ('.get_string('site').')';
210                         } else {
211                             $courses["$hostid/$cc->course"] = $cc->coursename;
212                         }
213                     }
214                 }
215             }
216         }
218         asort($courses);
219         $dropdown[] = array($name=>($sites + $courses));
220     }
223     $activities = array();
224     $selectedactivity = "";
226 /// Casting $course->modinfo to string prevents one notice when the field is null
227     if ($modinfo = unserialize((string)$course->modinfo)) {
228         $section = 0;
229         $sections = get_all_sections($course->id);
230         foreach ($modinfo as $mod) {
231             if ($mod->mod == "label") {
232                 continue;
233             }
234             if ($mod->section > 0 and $section <> $mod->section) {
235                 $activities["section/$mod->section"] = '--- '.get_section_name($course, $sections[$mod->section]).' ---';
236             }
237             $section = $mod->section;
238             $mod->name = strip_tags(format_string($mod->name, true));
239             if (textlib::strlen($mod->name) > 55) {
240                 $mod->name = textlib::substr($mod->name, 0, 50)."...";
241             }
242             if (!$mod->visible) {
243                 $mod->name = "(".$mod->name.")";
244             }
245             $activities["$mod->cm"] = $mod->name;
247             if ($mod->cm == $modid) {
248                 $selectedactivity = "$mod->cm";
249             }
250         }
251     }
253     if (has_capability('report/log:view', $sitecontext) && !$course->category) {
254         $activities["site_errors"] = get_string("siteerrors");
255         if ($modid === "site_errors") {
256             $selectedactivity = "site_errors";
257         }
258     }
260     $strftimedate = get_string("strftimedate");
261     $strftimedaydate = get_string("strftimedaydate");
263     asort($users);
265     // Prepare the list of action options.
266     $actions = array(
267         'view' => get_string('view'),
268         'add' => get_string('add'),
269         'update' => get_string('update'),
270         'delete' => get_string('delete'),
271         '-view' => get_string('allchanges')
272     );
274     // Get all the possible dates
275     // Note that we are keeping track of real (GMT) time and user time
276     // User time is only used in displays - all calcs and passing is GMT
278     $timenow = time(); // GMT
280     // What day is it now for the user, and when is midnight that day (in GMT).
281     $timemidnight = $today = usergetmidnight($timenow);
283     // Put today up the top of the list
284     $dates = array("$timemidnight" => get_string("today").", ".userdate($timenow, $strftimedate) );
286     if (!$course->startdate or ($course->startdate > $timenow)) {
287         $course->startdate = $course->timecreated;
288     }
290     $numdates = 1;
291     while ($timemidnight > $course->startdate and $numdates < 365) {
292         $timemidnight = $timemidnight - 86400;
293         $timenow = $timenow - 86400;
294         $dates["$timemidnight"] = userdate($timenow, $strftimedaydate);
295         $numdates++;
296     }
298     if ($selecteddate == "today") {
299         $selecteddate = $today;
300     }
302     echo "<form class=\"logselectform\" action=\"$CFG->wwwroot/report/log/index.php\" method=\"get\">\n";
303     echo "<div>\n";//invisible fieldset here breaks wrapping
304     echo "<input type=\"hidden\" name=\"chooselog\" value=\"1\" />\n";
305     echo "<input type=\"hidden\" name=\"showusers\" value=\"$showusers\" />\n";
306     echo "<input type=\"hidden\" name=\"showcourses\" value=\"$showcourses\" />\n";
307     if (has_capability('report/log:view', $sitecontext) && $showcourses) {
308         $cid = empty($course->id)? '1' : $course->id;
309         echo html_writer::label(get_string('selectacoursesite'), 'menuhost_course', false, array('class' => 'accesshide'));
310         echo html_writer::select($dropdown, "host_course", $hostid.'/'.$cid);
311     } else {
312         $courses = array();
313         $courses[$course->id] = $course->fullname . ((empty($course->category)) ? ' ('.get_string('site').') ' : '');
314         echo html_writer::label(get_string('selectacourse'), 'menuid', false, array('class' => 'accesshide'));
315         echo html_writer::select($courses,"id",$course->id, false);
316         if (has_capability('report/log:view', $sitecontext)) {
317             $a = new stdClass();
318             $a->url = "$CFG->wwwroot/report/log/index.php?chooselog=0&group=$selectedgroup&user=$selecteduser"
319                 ."&id=$course->id&date=$selecteddate&modid=$selectedactivity&showcourses=1&showusers=$showusers";
320             print_string('logtoomanycourses','moodle',$a);
321         }
322     }
324     if ($showgroups) {
325         if ($cgroups = groups_get_all_groups($course->id)) {
326             foreach ($cgroups as $cgroup) {
327                 $groups[$cgroup->id] = $cgroup->name;
328             }
329         }
330         else {
331             $groups = array();
332         }
333         echo html_writer::label(get_string('selectagroup'), 'menugroup', false, array('class' => 'accesshide'));
334         echo html_writer::select($groups, "group", $selectedgroup, get_string("allgroups"));
335     }
337     if ($showusers) {
338         echo html_writer::label(get_string('participantslist'), 'menuuser', false, array('class' => 'accesshide'));
339         echo html_writer::select($users, "user", $selecteduser, get_string("allparticipants"));
340     }
341     else {
342         $users = array();
343         if (!empty($selecteduser)) {
344             $user = $DB->get_record('user', array('id'=>$selecteduser));
345             $users[$selecteduser] = fullname($user);
346         }
347         else {
348             $users[0] = get_string('allparticipants');
349         }
350         echo html_writer::label(get_string('participantslist'), 'menuuser', false, array('class' => 'accesshide'));
351         echo html_writer::select($users, "user", $selecteduser, false);
352         $a->url = "$CFG->wwwroot/report/log/index.php?chooselog=0&group=$selectedgroup&user=$selecteduser"
353             ."&id=$course->id&date=$selecteddate&modid=$selectedactivity&showusers=1&showcourses=$showcourses";
354         print_string('logtoomanyusers','moodle',$a);
355     }
357     echo html_writer::label(get_string('date'), 'menudate', false, array('class' => 'accesshide'));
358     echo html_writer::select($dates, "date", $selecteddate, get_string("alldays"));
359     echo html_writer::label(get_string('showreports'), 'menumodid', false, array('class' => 'accesshide'));
360     echo html_writer::select($activities, "modid", $selectedactivity, get_string("allactivities"));
361     echo html_writer::label(get_string('actions'), 'menumodaction', false, array('class' => 'accesshide'));
362     echo html_writer::select($actions, 'modaction', $modaction, get_string("allactions"));
364     $logformats = array('showashtml' => get_string('displayonpage'),
365                         'downloadascsv' => get_string('downloadtext'),
366                         'downloadasods' => get_string('downloadods'),
367                         'downloadasexcel' => get_string('downloadexcel'));
368     echo html_writer::label(get_string('logsformat', 'report_log'), 'menulogformat', false, array('class' => 'accesshide'));
369     echo html_writer::select($logformats, 'logformat', $logformat, false);
370     echo '<input type="submit" value="'.get_string('gettheselogs').'" />';
371     echo '</div>';
372     echo '</form>';
374 /**
375  * This function is used to generate and display selector form
376  *
377  * @global stdClass $USER
378  * @global stdClass $CFG
379  * @global moodle_database $DB
380  * @global core_renderer $OUTPUT
381  * @global stdClass $SESSION
382  * @uses CONTEXT_SYSTEM
383  * @uses COURSE_MAX_COURSES_PER_DROPDOWN
384  * @uses CONTEXT_COURSE
385  * @uses SEPARATEGROUPS
386  * @param  stdClass $course course instance
387  * @param  int      $selecteduser id of the selected user
388  * @param  string   $selecteddate Date selected
389  * @param  string   $modname course_module->id
390  * @param  string   $modid number or 'site_errors'
391  * @param  string   $modaction an action as recorded in the logs
392  * @param  int      $selectedgroup Group to display
393  * @param  int      $showcourses whether to show courses if we're over our limit.
394  * @param  int      $showusers whether to show users if we're over our limit.
395  * @param  string   $logformat Format of the logs (downloadascsv, showashtml, downloadasods, downloadasexcel)
396  * @return void
397  */
398 function report_log_print_selector_form($course, $selecteduser=0, $selecteddate='today',
399                                  $modname="", $modid=0, $modaction='', $selectedgroup=-1, $showcourses=0, $showusers=0, $logformat='showashtml') {
401     global $USER, $CFG, $DB, $OUTPUT, $SESSION;
403     // first check to see if we can override showcourses and showusers
404     $numcourses =  $DB->count_records("course");
405     if ($numcourses < COURSE_MAX_COURSES_PER_DROPDOWN && !$showcourses) {
406         $showcourses = 1;
407     }
409     $sitecontext = get_context_instance(CONTEXT_SYSTEM);
410     $context = get_context_instance(CONTEXT_COURSE, $course->id);
412     /// Setup for group handling.
413     if ($course->groupmode == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) {
414         $selectedgroup = -1;
415         $showgroups = false;
416     } else if ($course->groupmode) {
417         $showgroups = true;
418     } else {
419         $selectedgroup = 0;
420         $showgroups = false;
421     }
423     if ($selectedgroup === -1) {
424         if (isset($SESSION->currentgroup[$course->id])) {
425             $selectedgroup =  $SESSION->currentgroup[$course->id];
426         } else {
427             $selectedgroup = groups_get_all_groups($course->id, $USER->id);
428             if (is_array($selectedgroup)) {
429                 $selectedgroup = array_shift(array_keys($selectedgroup));
430                 $SESSION->currentgroup[$course->id] = $selectedgroup;
431             } else {
432                 $selectedgroup = 0;
433             }
434         }
435     }
437     // Get all the possible users
438     $users = array();
440     // Define limitfrom and limitnum for queries below
441     // If $showusers is enabled... don't apply limitfrom and limitnum
442     $limitfrom = empty($showusers) ? 0 : '';
443     $limitnum  = empty($showusers) ? COURSE_MAX_USERS_PER_DROPDOWN + 1 : '';
445     $courseusers = get_enrolled_users($context, '', $selectedgroup, 'u.id, u.firstname, u.lastname', 'lastname ASC, firstname ASC', $limitfrom, $limitnum);
447     if (count($courseusers) < COURSE_MAX_USERS_PER_DROPDOWN && !$showusers) {
448         $showusers = 1;
449     }
451     if ($showusers) {
452         if ($courseusers) {
453             foreach ($courseusers as $courseuser) {
454                 $users[$courseuser->id] = fullname($courseuser, has_capability('moodle/site:viewfullnames', $context));
455             }
456         }
457         $users[$CFG->siteguest] = get_string('guestuser');
458     }
460     if (has_capability('report/log:view', $sitecontext) && $showcourses) {
461         if ($ccc = $DB->get_records("course", null, "fullname", "id,fullname,category")) {
462             foreach ($ccc as $cc) {
463                 if ($cc->category) {
464                     $courses["$cc->id"] = format_string($cc->fullname);
465                 } else {
466                     $courses["$cc->id"] = format_string($cc->fullname) . ' (Site)';
467                 }
468             }
469         }
470         asort($courses);
471     }
473     $activities = array();
474     $selectedactivity = "";
476 /// Casting $course->modinfo to string prevents one notice when the field is null
477     if ($modinfo = unserialize((string)$course->modinfo)) {
478         $section = 0;
479         $sections = get_all_sections($course->id);
480         foreach ($modinfo as $mod) {
481             if ($mod->mod == "label") {
482                 continue;
483             }
484             if ($mod->section > 0 and $section <> $mod->section) {
485                 $activities["section/$mod->section"] = '--- '.get_section_name($course, $sections[$mod->section]).' ---';
486             }
487             $section = $mod->section;
488             $mod->name = strip_tags(format_string($mod->name, true));
489             if (textlib::strlen($mod->name) > 55) {
490                 $mod->name = textlib::substr($mod->name, 0, 50)."...";
491             }
492             if (!$mod->visible) {
493                 $mod->name = "(".$mod->name.")";
494             }
495             $activities["$mod->cm"] = $mod->name;
497             if ($mod->cm == $modid) {
498                 $selectedactivity = "$mod->cm";
499             }
500         }
501     }
503     if (has_capability('report/log:view', $sitecontext) && ($course->id == SITEID)) {
504         $activities["site_errors"] = get_string("siteerrors");
505         if ($modid === "site_errors") {
506             $selectedactivity = "site_errors";
507         }
508     }
510     $strftimedate = get_string("strftimedate");
511     $strftimedaydate = get_string("strftimedaydate");
513     asort($users);
515     // Prepare the list of action options.
516     $actions = array(
517         'view' => get_string('view'),
518         'add' => get_string('add'),
519         'update' => get_string('update'),
520         'delete' => get_string('delete'),
521         '-view' => get_string('allchanges')
522     );
524     // Get all the possible dates
525     // Note that we are keeping track of real (GMT) time and user time
526     // User time is only used in displays - all calcs and passing is GMT
528     $timenow = time(); // GMT
530     // What day is it now for the user, and when is midnight that day (in GMT).
531     $timemidnight = $today = usergetmidnight($timenow);
533     // Put today up the top of the list
534     $dates = array("$timemidnight" => get_string("today").", ".userdate($timenow, $strftimedate) );
536     if (!$course->startdate or ($course->startdate > $timenow)) {
537         $course->startdate = $course->timecreated;
538     }
540     $numdates = 1;
541     while ($timemidnight > $course->startdate and $numdates < 365) {
542         $timemidnight = $timemidnight - 86400;
543         $timenow = $timenow - 86400;
544         $dates["$timemidnight"] = userdate($timenow, $strftimedaydate);
545         $numdates++;
546     }
548     if ($selecteddate == "today") {
549         $selecteddate = $today;
550     }
552     echo "<form class=\"logselectform\" action=\"$CFG->wwwroot/report/log/index.php\" method=\"get\">\n";
553     echo "<div>\n";
554     echo "<input type=\"hidden\" name=\"chooselog\" value=\"1\" />\n";
555     echo "<input type=\"hidden\" name=\"showusers\" value=\"$showusers\" />\n";
556     echo "<input type=\"hidden\" name=\"showcourses\" value=\"$showcourses\" />\n";
557     if (has_capability('report/log:view', $sitecontext) && $showcourses) {
558         echo html_writer::label(get_string('selectacourse'), 'menuid', false, array('class' => 'accesshide'));
559         echo html_writer::select($courses, "id", $course->id, false);
560     } else {
561         //        echo '<input type="hidden" name="id" value="'.$course->id.'" />';
562         $courses = array();
563         $courses[$course->id] = $course->fullname . (($course->id == SITEID) ? ' ('.get_string('site').') ' : '');
564         echo html_writer::label(get_string('selectacourse'), 'menuid', false, array('class' => 'accesshide'));
565         echo html_writer::select($courses,"id",$course->id, false);
566         if (has_capability('report/log:view', $sitecontext)) {
567             $a = new stdClass();
568             $a->url = "$CFG->wwwroot/report/log/index.php?chooselog=0&group=$selectedgroup&user=$selecteduser"
569                 ."&id=$course->id&date=$selecteddate&modid=$selectedactivity&showcourses=1&showusers=$showusers";
570             print_string('logtoomanycourses','moodle',$a);
571         }
572     }
574     if ($showgroups) {
575         if ($cgroups = groups_get_all_groups($course->id)) {
576             foreach ($cgroups as $cgroup) {
577                 $groups[$cgroup->id] = $cgroup->name;
578             }
579         }
580         else {
581             $groups = array();
582         }
583         echo html_writer::label(get_string('selectagroup'), 'menugroup', false, array('class' => 'accesshide'));
584         echo html_writer::select($groups, "group", $selectedgroup, get_string("allgroups"));
585     }
587     if ($showusers) {
588         echo html_writer::label(get_string('selctauser'), 'menuuser', false, array('class' => 'accesshide'));
589         echo html_writer::select($users, "user", $selecteduser, get_string("allparticipants"));
590     }
591     else {
592         $users = array();
593         if (!empty($selecteduser)) {
594             $user = $DB->get_record('user', array('id'=>$selecteduser));
595             $users[$selecteduser] = fullname($user);
596         }
597         else {
598             $users[0] = get_string('allparticipants');
599         }
600         echo html_writer::label(get_string('selctauser'), 'menuuser', false, array('class' => 'accesshide'));
601         echo html_writer::select($users, "user", $selecteduser, false);
602         $a = new stdClass();
603         $a->url = "$CFG->wwwroot/report/log/index.php?chooselog=0&group=$selectedgroup&user=$selecteduser"
604             ."&id=$course->id&date=$selecteddate&modid=$selectedactivity&showusers=1&showcourses=$showcourses";
605         print_string('logtoomanyusers','moodle',$a);
606     }
607     echo html_writer::label(get_string('date'), 'menudate', false, array('class' => 'accesshide'));
608     echo html_writer::select($dates, "date", $selecteddate, get_string("alldays"));
610     echo html_writer::label(get_string('activities'), 'menumodid', false, array('class' => 'accesshide'));
611     echo html_writer::select($activities, "modid", $selectedactivity, get_string("allactivities"));
612     echo html_writer::label(get_string('actions'), 'menumodaction', false, array('class' => 'accesshide'));
613     echo html_writer::select($actions, 'modaction', $modaction, get_string("allactions"));
615     $logformats = array('showashtml' => get_string('displayonpage'),
616                         'downloadascsv' => get_string('downloadtext'),
617                         'downloadasods' => get_string('downloadods'),
618                         'downloadasexcel' => get_string('downloadexcel'));
620     echo html_writer::label(get_string('logsformat', 'report_log'), 'menulogformat', false, array('class' => 'accesshide'));
621     echo html_writer::select($logformats, 'logformat', $logformat, false);
622     echo '<input type="submit" value="'.get_string('gettheselogs').'" />';
623     echo '</div>';
624     echo '</form>';