Merge branch 'MDL-76224-master' of https://github.com/justusdieckmann/moodle
[moodle.git] / report / outline / locallib.php
blob87067cddde6ece89670458c67888012741429a4c
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.
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 outline reports
20 * @package report
21 * @subpackage outline
22 * @copyright 1999 onwards Martin Dougiamas (http://dougiamas.com)
23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
26 defined('MOODLE_INTERNAL') || die;
28 require_once(__DIR__.'/lib.php');
29 require_once($CFG->dirroot.'/course/lib.php');
31 function report_outline_print_row($mod, $instance, $result) {
32 global $OUTPUT, $CFG;
34 $image = $OUTPUT->image_icon('monologo', $mod->modfullname, $mod->modname);
36 echo "<tr>";
37 echo "<td valign=\"top\">$image</td>";
38 echo "<td valign=\"top\" style=\"width:300\">";
39 echo " <a title=\"$mod->modfullname\"";
40 echo " href=\"$CFG->wwwroot/mod/$mod->modname/view.php?id=$mod->id\">".format_string($instance->name,true)."</a></td>";
41 echo "<td>&nbsp;&nbsp;&nbsp;</td>";
42 echo "<td valign=\"top\">";
43 if (isset($result->info)) {
44 echo "$result->info";
45 } else {
46 echo "<p style=\"text-align:center\">-</p>";
48 echo "</td>";
49 echo "<td>&nbsp;&nbsp;&nbsp;</td>";
50 if (!empty($result->time)) {
51 $timeago = format_time(time() - $result->time);
52 echo "<td valign=\"top\" style=\"white-space: nowrap\">".userdate($result->time)." ($timeago)</td>";
54 echo "</tr>";
57 /**
58 * Returns an array of the commonly used log variables by the outline report.
60 * @return array the array of variables used
62 function report_outline_get_common_log_variables() {
63 global $DB;
65 static $uselegacyreader;
66 static $useinternalreader;
67 static $minloginternalreader;
68 static $logtable = null;
70 if (isset($uselegacyreader) && isset($useinternalreader) && isset($minloginternalreader)) {
71 return array($uselegacyreader, $useinternalreader, $minloginternalreader, $logtable);
74 $uselegacyreader = false; // Flag to determine if we should use the legacy reader.
75 $useinternalreader = false; // Flag to determine if we should use the internal reader.
76 $minloginternalreader = 0; // Set this to 0 for now.
78 // Get list of readers.
79 $logmanager = get_log_manager();
80 $readers = $logmanager->get_readers();
82 // Get preferred reader.
83 if (!empty($readers)) {
84 foreach ($readers as $readerpluginname => $reader) {
85 // If legacy reader is preferred reader.
86 if ($readerpluginname == 'logstore_legacy') {
87 $uselegacyreader = true;
90 // If sql_internal_table_reader is preferred reader.
91 if ($reader instanceof \core\log\sql_internal_table_reader) {
92 $useinternalreader = true;
93 $logtable = $reader->get_internal_log_table_name();
94 $minloginternalreader = $DB->get_field_sql('SELECT min(timecreated) FROM {' . $logtable . '}');
99 return array($uselegacyreader, $useinternalreader, $minloginternalreader, $logtable);
103 * Return the most commonly used user outline information.
105 * @param int $userid the id of the user
106 * @param int $cmid the course module id
107 * @param string $module the name of the module (eg. 'book')
108 * @param int $instanceid (eg. the 'id' in the 'book' table)
109 * @return stdClass|null if any information is found then a stdClass containing
110 * this info is returned, else null is.
112 function report_outline_user_outline($userid, $cmid, $module, $instanceid) {
113 global $DB;
115 list($uselegacyreader, $useinternalreader, $minloginternalreader, $logtable) = report_outline_get_common_log_variables();
117 // If using legacy log then get users from old table.
118 if ($uselegacyreader) {
119 // Create the params for the query.
120 $params = array('userid' => $userid, 'module' => $module, 'action' => 'view', 'info' => $instanceid);
121 // If we are going to use the internal (not legacy) log table, we should only get records
122 // from the legacy table that exist before we started adding logs to the new table.
123 $limittime = '';
124 if (!empty($minloginternalreader)) {
125 $limittime = ' AND time < :timeto ';
126 $params['timeto'] = $minloginternalreader;
128 $select = "SELECT COUNT(id) ";
129 $from = "FROM {log} ";
130 $where = "WHERE userid = :userid
131 AND module = :module
132 AND action = :action
133 AND info = :info ";
134 if ($legacylogcount = $DB->count_records_sql($select . $from . $where . $limittime, $params)) {
135 $numviews = $legacylogcount;
137 // Get the time for the last log.
138 $select = "SELECT MAX(time) ";
139 $lastlogtime = $DB->get_field_sql($select . $from . $where, $params);
141 $result = new stdClass();
142 $result->info = get_string('numviews', '', $numviews);
143 $result->time = $lastlogtime;
147 // Get record from sql_internal_table_reader and combine with the number of views from the legacy log table (if needed).
148 if ($useinternalreader) {
149 $params = array('userid' => $userid, 'contextlevel' => CONTEXT_MODULE, 'contextinstanceid' => $cmid, 'crud' => 'r',
150 'edulevel1' => core\event\base::LEVEL_PARTICIPATING, 'edulevel2' => core\event\base::LEVEL_TEACHING,
151 'edulevel3' => core\event\base::LEVEL_OTHER, 'anonymous' => 0);
152 $select = "SELECT COUNT(*) as count ";
153 $from = "FROM {" . $logtable . "} ";
154 $where = "WHERE userid = :userid
155 AND contextlevel = :contextlevel
156 AND contextinstanceid = :contextinstanceid
157 AND crud = :crud
158 AND edulevel IN (:edulevel1, :edulevel2, :edulevel3)
159 AND anonymous = :anonymous";
160 if ($internalreadercount = $DB->count_records_sql($select . $from . $where, $params)) {
161 if (!empty($numviews)) {
162 $numviews = $numviews + $internalreadercount;
163 } else {
164 $numviews = $internalreadercount;
167 // Get the time for the last log.
168 $select = "SELECT MAX(timecreated) ";
169 $lastlogtime = $DB->get_field_sql($select . $from . $where, $params);
171 $result = new stdClass();
172 $result->info = get_string('numviews', '', $numviews);
173 $result->time = $lastlogtime;
177 if (!empty($result)) {
178 return $result;
181 return null;
185 * Display the most commonly used user complete information.
187 * @param int $userid the id of the user
188 * @param int $cmid the course module id
189 * @param string $module the name of the module (eg. 'book')
190 * @param int $instanceid (eg. the 'id' in the 'book' table)
191 * @return string
193 function report_outline_user_complete($userid, $cmid, $module, $instanceid) {
194 global $DB;
196 list($uselegacyreader, $useinternalreader, $minloginternalreader, $logtable) = report_outline_get_common_log_variables();
198 // If using legacy log then get users from old table.
199 if ($uselegacyreader) {
200 // Create the params for the query.
201 $params = array('userid' => $userid, 'module' => $module, 'action' => 'view', 'info' => $instanceid);
202 // If we are going to use the internal (not legacy) log table, we should only get records
203 // from the legacy table that exist before we started adding logs to the new table.
204 $limittime = '';
205 if (!empty($minloginternalreader)) {
206 $limittime = ' AND time < :timeto ';
207 $params['timeto'] = $minloginternalreader;
209 $select = "SELECT COUNT(id) ";
210 $from = "FROM {log} ";
211 $where = "WHERE userid = :userid
212 AND module = :module
213 AND action = :action
214 AND info = :info ";
215 if ($legacylogcount = $DB->count_records_sql($select . $from . $where . $limittime, $params)) {
216 $numviews = $legacylogcount;
218 // Get the time for the last log.
219 $select = "SELECT MAX(time) ";
220 $lastlogtime = $DB->get_field_sql($select . $from . $where, $params);
222 $strnumviews = get_string('numviews', '', $numviews);
226 // Get record from sql_internal_table_reader and combine with the number of views from the legacy log table (if needed).
227 if ($useinternalreader) {
228 $params = array('userid' => $userid, 'contextlevel' => CONTEXT_MODULE, 'contextinstanceid' => $cmid, 'crud' => 'r',
229 'edulevel1' => core\event\base::LEVEL_PARTICIPATING, 'edulevel2' => core\event\base::LEVEL_TEACHING,
230 'edulevel3' => core\event\base::LEVEL_OTHER, 'anonymous' => 0);
231 $select = "SELECT COUNT(*) as count ";
232 $from = "FROM {" . $logtable . "} ";
233 $where = "WHERE userid = :userid
234 AND contextlevel = :contextlevel
235 AND contextinstanceid = :contextinstanceid
236 AND crud = :crud
237 AND edulevel IN (:edulevel1, :edulevel2, :edulevel3)
238 AND anonymous = :anonymous";
239 if ($internalreadercount = $DB->count_records_sql($select . $from . $where, $params)) {
240 if (!empty($numviews)) {
241 $numviews = $numviews + $internalreadercount;
242 } else {
243 $numviews = $internalreadercount;
246 // Get the time for the last log.
247 $select = "SELECT MAX(timecreated) ";
248 $lastlogtime = $DB->get_field_sql($select . $from . $where, $params);
250 $strnumviews = get_string('numviews', '', $numviews);
254 if (!empty($strnumviews) && (!empty($lastlogtime))) {
255 return $strnumviews . ' - ' . get_string('mostrecently') . ' ' . userdate($lastlogtime);
256 } else {
257 return get_string('neverseen', 'report_outline');