Merge branch 'MDL-40323-master' of https://github.com/mackensen/moodle
[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     echo '<img src="'.$CFG->wwwroot.'/report/log/graph.php?id='.$course->id.
49          '&amp;user='.$userid.'&amp;type='.$type.'&amp;date='.$date.'" alt="" />';
50 }
51 /**
52  * This function is used to generate and display Mnet selector form
53  *
54  * @global stdClass $USER
55  * @global stdClass $CFG
56  * @global stdClass $SITE
57  * @global moodle_database $DB
58  * @global core_renderer $OUTPUT
59  * @global stdClass $SESSION
60  * @uses CONTEXT_SYSTEM
61  * @uses COURSE_MAX_COURSES_PER_DROPDOWN
62  * @uses CONTEXT_COURSE
63  * @uses SEPARATEGROUPS
64  * @param  int      $hostid host id
65  * @param  stdClass $course course instance
66  * @param  int      $selecteduser id of the selected user
67  * @param  string   $selecteddate Date selected
68  * @param  string   $modname course_module->id
69  * @param  string   $modid number or 'site_errors'
70  * @param  string   $modaction an action as recorded in the logs
71  * @param  int      $selectedgroup Group to display
72  * @param  int      $showcourses whether to show courses if we're over our limit.
73  * @param  int      $showusers whether to show users if we're over our limit.
74  * @param  string   $logformat Format of the logs (downloadascsv, showashtml, downloadasods, downloadasexcel)
75  * @return void
76  */
77 function report_log_print_mnet_selector_form($hostid, $course, $selecteduser=0, $selecteddate='today',
78                                  $modname="", $modid=0, $modaction='', $selectedgroup=-1, $showcourses=0, $showusers=0, $logformat='showashtml') {
80     global $USER, $CFG, $SITE, $DB, $OUTPUT, $SESSION;
81     require_once $CFG->dirroot.'/mnet/peer.php';
83     $mnet_peer = new mnet_peer();
84     $mnet_peer->set_id($hostid);
86     $sql = "SELECT DISTINCT course, hostid, coursename FROM {mnet_log}";
87     $courses = $DB->get_records_sql($sql);
88     $remotecoursecount = count($courses);
90     // first check to see if we can override showcourses and showusers
91     $numcourses = $remotecoursecount + $DB->count_records('course');
92     if ($numcourses < COURSE_MAX_COURSES_PER_DROPDOWN && !$showcourses) {
93         $showcourses = 1;
94     }
96     $sitecontext = context_system::instance();
98     // Context for remote data is always SITE
99     // Groups for remote data are always OFF
100     if ($hostid == $CFG->mnet_localhost_id) {
101         $context = context_course::instance($course->id);
103         /// Setup for group handling.
104         if ($course->groupmode == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) {
105             $selectedgroup = -1;
106             $showgroups = false;
107         } else if ($course->groupmode) {
108             $showgroups = true;
109         } else {
110             $selectedgroup = 0;
111             $showgroups = false;
112         }
114         if ($selectedgroup === -1) {
115             if (isset($SESSION->currentgroup[$course->id])) {
116                 $selectedgroup =  $SESSION->currentgroup[$course->id];
117             } else {
118                 $selectedgroup = groups_get_all_groups($course->id, $USER->id);
119                 if (is_array($selectedgroup)) {
120                     $selectedgroup = array_shift(array_keys($selectedgroup));
121                     $SESSION->currentgroup[$course->id] = $selectedgroup;
122                 } else {
123                     $selectedgroup = 0;
124                 }
125             }
126         }
128     } else {
129         $context = $sitecontext;
130     }
132     // Get all the possible users
133     $users = array();
135     // Define limitfrom and limitnum for queries below
136     // If $showusers is enabled... don't apply limitfrom and limitnum
137     $limitfrom = empty($showusers) ? 0 : '';
138     $limitnum  = empty($showusers) ? COURSE_MAX_USERS_PER_DROPDOWN + 1 : '';
140     // If looking at a different host, we're interested in all our site users
141     if ($hostid == $CFG->mnet_localhost_id && $course->id != SITEID) {
142         $courseusers = get_enrolled_users($context, '', $selectedgroup, 'u.id, ' . get_all_user_name_fields(true, 'u'),
143                 null, $limitfrom, $limitnum);
144     } else {
145         // this may be a lot of users :-(
146         $courseusers = $DB->get_records('user', array('deleted'=>0), 'lastaccess DESC', 'id, ' . get_all_user_name_fields(true),
147                 $limitfrom, $limitnum);
148     }
150     if (count($courseusers) < COURSE_MAX_USERS_PER_DROPDOWN && !$showusers) {
151         $showusers = 1;
152     }
154     if ($showusers) {
155         if ($courseusers) {
156             foreach ($courseusers as $courseuser) {
157                 $users[$courseuser->id] = fullname($courseuser, has_capability('moodle/site:viewfullnames', $context));
158             }
159         }
160         $users[$CFG->siteguest] = get_string('guestuser');
161     }
163     // Get all the hosts that have log records
164     $sql = "select distinct
165                 h.id,
166                 h.name
167             from
168                 {mnet_host} h,
169                 {mnet_log} l
170             where
171                 h.id = l.hostid
172             order by
173                 h.name";
175     if ($hosts = $DB->get_records_sql($sql)) {
176         foreach($hosts as $host) {
177             $hostarray[$host->id] = $host->name;
178         }
179     }
181     $hostarray[$CFG->mnet_localhost_id] = $SITE->fullname;
182     asort($hostarray);
184     $dropdown = array();
186     foreach($hostarray as $hostid => $name) {
187         $courses = array();
188         $sites = array();
189         if ($CFG->mnet_localhost_id == $hostid) {
190             if (has_capability('report/log:view', $sitecontext) && $showcourses) {
191                 if ($ccc = $DB->get_records("course", null, "fullname","id,shortname,fullname,category")) {
192                     foreach ($ccc as $cc) {
193                         if ($cc->id == SITEID) {
194                             $sites["$hostid/$cc->id"]   = format_string($cc->fullname).' ('.get_string('site').')';
195                         } else {
196                             $courses["$hostid/$cc->id"] = format_string(get_course_display_name_for_list($cc));
197                         }
198                     }
199                 }
200             }
201         } else {
202             if (has_capability('report/log:view', $sitecontext) && $showcourses) {
203                 $sql = "SELECT DISTINCT course, coursename FROM {mnet_log} where hostid = ?";
204                 if ($ccc = $DB->get_records_sql($sql, array($hostid))) {
205                     foreach ($ccc as $cc) {
206                         if (1 == $cc->course) { // TODO: this might be wrong - site course may have another id
207                             $sites["$hostid/$cc->course"]   = $cc->coursename.' ('.get_string('site').')';
208                         } else {
209                             $courses["$hostid/$cc->course"] = $cc->coursename;
210                         }
211                     }
212                 }
213             }
214         }
216         asort($courses);
217         $dropdown[] = array($name=>($sites + $courses));
218     }
221     $activities = array();
222     $selectedactivity = "";
224     $modinfo = get_fast_modinfo($course);
225     if (!empty($modinfo->cms)) {
226         $section = 0;
227         foreach ($modinfo->cms as $cm) {
228             if (!$cm->uservisible || !$cm->has_view()) {
229                 continue;
230             }
231             if ($cm->sectionnum > 0 and $section <> $cm->sectionnum) {
232                 $activities["section/$cm->sectionnum"] = '--- '.get_section_name($course, $cm->sectionnum).' ---';
233             }
234             $section = $cm->sectionnum;
235             $modname = strip_tags($cm->get_formatted_name());
236             if (textlib::strlen($modname) > 55) {
237                 $modname = textlib::substr($modname, 0, 50)."...";
238             }
239             if (!$cm->visible) {
240                 $modname = "(".$modname.")";
241             }
242             $activities["$cm->id"] = $modname;
244             if ($cm->id == $modid) {
245                 $selectedactivity = "$cm->id";
246             }
247         }
248     }
250     if (has_capability('report/log:view', $sitecontext) && !$course->category) {
251         $activities["site_errors"] = get_string("siteerrors");
252         if ($modid === "site_errors") {
253             $selectedactivity = "site_errors";
254         }
255     }
257     $strftimedate = get_string("strftimedate");
258     $strftimedaydate = get_string("strftimedaydate");
260     asort($users);
262     // Prepare the list of action options.
263     $actions = array(
264         'view' => get_string('view'),
265         'add' => get_string('add'),
266         'update' => get_string('update'),
267         'delete' => get_string('delete'),
268         '-view' => get_string('allchanges')
269     );
271     // Get all the possible dates
272     // Note that we are keeping track of real (GMT) time and user time
273     // User time is only used in displays - all calcs and passing is GMT
275     $timenow = time(); // GMT
277     // What day is it now for the user, and when is midnight that day (in GMT).
278     $timemidnight = $today = usergetmidnight($timenow);
280     // Put today up the top of the list
281     $dates = array(
282         "0" => get_string('alldays'),
283         "$timemidnight" => get_string("today").", ".userdate($timenow, $strftimedate)
284     );
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] = get_course_display_name_for_list($course) . ((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 = new stdClass();
353         $a->url = "$CFG->wwwroot/report/log/index.php?chooselog=0&group=$selectedgroup&user=$selecteduser"
354             ."&id=$course->id&date=$selecteddate&modid=$selectedactivity&showusers=1&showcourses=$showcourses";
355         print_string('logtoomanyusers','moodle',$a);
356     }
358     echo html_writer::label(get_string('date'), 'menudate', false, array('class' => 'accesshide'));
359     echo html_writer::select($dates, "date", $selecteddate, false);
360     echo html_writer::label(get_string('showreports'), 'menumodid', false, array('class' => 'accesshide'));
361     echo html_writer::select($activities, "modid", $selectedactivity, get_string("allactivities"));
362     echo html_writer::label(get_string('actions'), 'menumodaction', false, array('class' => 'accesshide'));
363     echo html_writer::select($actions, 'modaction', $modaction, get_string("allactions"));
365     $logformats = array('showashtml' => get_string('displayonpage'),
366                         'downloadascsv' => get_string('downloadtext'),
367                         'downloadasods' => get_string('downloadods'),
368                         'downloadasexcel' => get_string('downloadexcel'));
369     echo html_writer::label(get_string('logsformat', 'report_log'), 'menulogformat', false, array('class' => 'accesshide'));
370     echo html_writer::select($logformats, 'logformat', $logformat, false);
371     echo '<input type="submit" value="'.get_string('gettheselogs').'" />';
372     echo '</div>';
373     echo '</form>';
375 /**
376  * This function is used to generate and display selector form
377  *
378  * @global stdClass $USER
379  * @global stdClass $CFG
380  * @global moodle_database $DB
381  * @global core_renderer $OUTPUT
382  * @global stdClass $SESSION
383  * @uses CONTEXT_SYSTEM
384  * @uses COURSE_MAX_COURSES_PER_DROPDOWN
385  * @uses CONTEXT_COURSE
386  * @uses SEPARATEGROUPS
387  * @param  stdClass $course course instance
388  * @param  int      $selecteduser id of the selected user
389  * @param  string   $selecteddate Date selected
390  * @param  string   $modname course_module->id
391  * @param  string   $modid number or 'site_errors'
392  * @param  string   $modaction an action as recorded in the logs
393  * @param  int      $selectedgroup Group to display
394  * @param  int      $showcourses whether to show courses if we're over our limit.
395  * @param  int      $showusers whether to show users if we're over our limit.
396  * @param  string   $logformat Format of the logs (downloadascsv, showashtml, downloadasods, downloadasexcel)
397  * @return void
398  */
399 function report_log_print_selector_form($course, $selecteduser=0, $selecteddate='today',
400                                  $modname="", $modid=0, $modaction='', $selectedgroup=-1, $showcourses=0, $showusers=0, $logformat='showashtml') {
402     global $USER, $CFG, $DB, $OUTPUT, $SESSION;
404     // first check to see if we can override showcourses and showusers
405     $numcourses =  $DB->count_records("course");
406     if ($numcourses < COURSE_MAX_COURSES_PER_DROPDOWN && !$showcourses) {
407         $showcourses = 1;
408     }
410     $sitecontext = context_system::instance();
411     $context = context_course::instance($course->id);
413     /// Setup for group handling.
414     if ($course->groupmode == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) {
415         $selectedgroup = -1;
416         $showgroups = false;
417     } else if ($course->groupmode) {
418         $showgroups = true;
419     } else {
420         $selectedgroup = 0;
421         $showgroups = false;
422     }
424     if ($selectedgroup === -1) {
425         if (isset($SESSION->currentgroup[$course->id])) {
426             $selectedgroup =  $SESSION->currentgroup[$course->id];
427         } else {
428             $selectedgroup = groups_get_all_groups($course->id, $USER->id);
429             if (is_array($selectedgroup)) {
430                 $selectedgroup = array_shift(array_keys($selectedgroup));
431                 $SESSION->currentgroup[$course->id] = $selectedgroup;
432             } else {
433                 $selectedgroup = 0;
434             }
435         }
436     }
438     // Get all the possible users
439     $users = array();
441     // Define limitfrom and limitnum for queries below
442     // If $showusers is enabled... don't apply limitfrom and limitnum
443     $limitfrom = empty($showusers) ? 0 : '';
444     $limitnum  = empty($showusers) ? COURSE_MAX_USERS_PER_DROPDOWN + 1 : '';
446     $courseusers = get_enrolled_users($context, '', $selectedgroup, 'u.id, ' . get_all_user_name_fields(true, 'u'),
447             null, $limitfrom, $limitnum);
449     if (count($courseusers) < COURSE_MAX_USERS_PER_DROPDOWN && !$showusers) {
450         $showusers = 1;
451     }
453     if ($showusers) {
454         if ($courseusers) {
455             foreach ($courseusers as $courseuser) {
456                 $users[$courseuser->id] = fullname($courseuser, has_capability('moodle/site:viewfullnames', $context));
457             }
458         }
459         $users[$CFG->siteguest] = get_string('guestuser');
460     }
462     if (has_capability('report/log:view', $sitecontext) && $showcourses) {
463         if ($ccc = $DB->get_records("course", null, "fullname", "id,shortname,fullname,category")) {
464             foreach ($ccc as $cc) {
465                 if ($cc->category) {
466                     $courses["$cc->id"] = format_string(get_course_display_name_for_list($cc));
467                 } else {
468                     $courses["$cc->id"] = format_string($cc->fullname) . ' (Site)';
469                 }
470             }
471         }
472         asort($courses);
473     }
475     $activities = array();
476     $selectedactivity = "";
478     $modinfo = get_fast_modinfo($course);
479     if (!empty($modinfo->cms)) {
480         $section = 0;
481         foreach ($modinfo->cms as $cm) {
482             if (!$cm->uservisible || !$cm->has_view()) {
483                 continue;
484             }
485             if ($cm->sectionnum > 0 and $section <> $cm->sectionnum) {
486                 $activities["section/$cm->sectionnum"] = '--- '.get_section_name($course, $cm->sectionnum).' ---';
487             }
488             $section = $cm->sectionnum;
489             $modname = strip_tags($cm->get_formatted_name());
490             if (textlib::strlen($modname) > 55) {
491                 $modname = textlib::substr($modname, 0, 50)."...";
492             }
493             if (!$cm->visible) {
494                 $modname = "(".$modname.")";
495             }
496             $activities["$cm->id"] = $modname;
498             if ($cm->id == $modid) {
499                 $selectedactivity = "$cm->id";
500             }
501         }
502     }
504     if (has_capability('report/log:view', $sitecontext) && ($course->id == SITEID)) {
505         $activities["site_errors"] = get_string("siteerrors");
506         if ($modid === "site_errors") {
507             $selectedactivity = "site_errors";
508         }
509     }
511     $strftimedate = get_string("strftimedate");
512     $strftimedaydate = get_string("strftimedaydate");
514     asort($users);
516     // Prepare the list of action options.
517     $actions = array(
518         'view' => get_string('view'),
519         'add' => get_string('add'),
520         'update' => get_string('update'),
521         'delete' => get_string('delete'),
522         '-view' => get_string('allchanges')
523     );
525     // Get all the possible dates
526     // Note that we are keeping track of real (GMT) time and user time
527     // User time is only used in displays - all calcs and passing is GMT
529     $timenow = time(); // GMT
531     // What day is it now for the user, and when is midnight that day (in GMT).
532     $timemidnight = $today = usergetmidnight($timenow);
534     // Put today up the top of the list
535     $dates = array("$timemidnight" => get_string("today").", ".userdate($timenow, $strftimedate) );
537     if (!$course->startdate or ($course->startdate > $timenow)) {
538         $course->startdate = $course->timecreated;
539     }
541     $numdates = 1;
542     while ($timemidnight > $course->startdate and $numdates < 365) {
543         $timemidnight = $timemidnight - 86400;
544         $timenow = $timenow - 86400;
545         $dates["$timemidnight"] = userdate($timenow, $strftimedaydate);
546         $numdates++;
547     }
549     if ($selecteddate == "today") {
550         $selecteddate = $today;
551     }
553     echo "<form class=\"logselectform\" action=\"$CFG->wwwroot/report/log/index.php\" method=\"get\">\n";
554     echo "<div>\n";
555     echo "<input type=\"hidden\" name=\"chooselog\" value=\"1\" />\n";
556     echo "<input type=\"hidden\" name=\"showusers\" value=\"$showusers\" />\n";
557     echo "<input type=\"hidden\" name=\"showcourses\" value=\"$showcourses\" />\n";
558     if (has_capability('report/log:view', $sitecontext) && $showcourses) {
559         echo html_writer::label(get_string('selectacourse'), 'menuid', false, array('class' => 'accesshide'));
560         echo html_writer::select($courses, "id", $course->id, false);
561     } else {
562         //        echo '<input type="hidden" name="id" value="'.$course->id.'" />';
563         $courses = array();
564         $courses[$course->id] = get_course_display_name_for_list($course) . (($course->id == SITEID) ? ' ('.get_string('site').') ' : '');
565         echo html_writer::label(get_string('selectacourse'), 'menuid', false, array('class' => 'accesshide'));
566         echo html_writer::select($courses,"id",$course->id, false);
567         if (has_capability('report/log:view', $sitecontext)) {
568             $a = new stdClass();
569             $a->url = "$CFG->wwwroot/report/log/index.php?chooselog=0&group=$selectedgroup&user=$selecteduser"
570                 ."&id=$course->id&date=$selecteddate&modid=$selectedactivity&showcourses=1&showusers=$showusers";
571             print_string('logtoomanycourses','moodle',$a);
572         }
573     }
575     if ($showgroups) {
576         if ($cgroups = groups_get_all_groups($course->id)) {
577             foreach ($cgroups as $cgroup) {
578                 $groups[$cgroup->id] = $cgroup->name;
579             }
580         }
581         else {
582             $groups = array();
583         }
584         echo html_writer::label(get_string('selectagroup'), 'menugroup', false, array('class' => 'accesshide'));
585         echo html_writer::select($groups, "group", $selectedgroup, get_string("allgroups"));
586     }
588     if ($showusers) {
589         echo html_writer::label(get_string('selctauser'), 'menuuser', false, array('class' => 'accesshide'));
590         echo html_writer::select($users, "user", $selecteduser, get_string("allparticipants"));
591     }
592     else {
593         $users = array();
594         if (!empty($selecteduser)) {
595             $user = $DB->get_record('user', array('id'=>$selecteduser));
596             $users[$selecteduser] = fullname($user);
597         }
598         else {
599             $users[0] = get_string('allparticipants');
600         }
601         echo html_writer::label(get_string('selctauser'), 'menuuser', false, array('class' => 'accesshide'));
602         echo html_writer::select($users, "user", $selecteduser, false);
603         $a = new stdClass();
604         $a->url = "$CFG->wwwroot/report/log/index.php?chooselog=0&group=$selectedgroup&user=$selecteduser"
605             ."&id=$course->id&date=$selecteddate&modid=$selectedactivity&showusers=1&showcourses=$showcourses";
606         print_string('logtoomanyusers','moodle',$a);
607     }
608     echo html_writer::label(get_string('date'), 'menudate', false, array('class' => 'accesshide'));
609     echo html_writer::select($dates, "date", $selecteddate, get_string("alldays"));
611     echo html_writer::label(get_string('activities'), 'menumodid', false, array('class' => 'accesshide'));
612     echo html_writer::select($activities, "modid", $selectedactivity, get_string("allactivities"));
613     echo html_writer::label(get_string('actions'), 'menumodaction', false, array('class' => 'accesshide'));
614     echo html_writer::select($actions, 'modaction', $modaction, get_string("allactions"));
616     $logformats = array('showashtml' => get_string('displayonpage'),
617                         'downloadascsv' => get_string('downloadtext'),
618                         'downloadasods' => get_string('downloadods'),
619                         'downloadasexcel' => get_string('downloadexcel'));
621     echo html_writer::label(get_string('logsformat', 'report_log'), 'menulogformat', false, array('class' => 'accesshide'));
622     echo html_writer::select($logformats, 'logformat', $logformat, false);
623     echo '<input type="submit" value="'.get_string('gettheselogs').'" />';
624     echo '</div>';
625     echo '</form>';