ILIAS  release_8 Revision v8.19
All Data Structures Namespaces Files Functions Variables Modules Pages
class.ilRating.php
Go to the documentation of this file.
1 <?php
2 
24 class ilRating
25 {
26  protected static array $list_data = [];
27 
39  public static function writeRatingForUserAndObject(
40  int $a_obj_id,
41  string $a_obj_type,
42  ?int $a_sub_obj_id,
43  ?string $a_sub_obj_type,
44  int $a_user_id,
45  int $a_rating,
46  int $a_category_id = 0
47  ): void {
48  global $DIC;
49 
50  $ilDB = $DIC->database();
51 
52  if ($a_rating < 0) {
53  $a_rating = 0;
54  }
55 
56  if ($a_rating > 5) {
57  $a_rating = 5;
58  }
59 
60  if ($a_user_id == ANONYMOUS_USER_ID) {
61  return;
62  }
63 
64  if ($a_category_id) {
65  $ilDB->manipulate("DELETE FROM il_rating WHERE " .
66  "user_id = " . $ilDB->quote($a_user_id, "integer") . " AND " .
67  "obj_id = " . $ilDB->quote($a_obj_id, "integer") . " AND " .
68  "obj_type = " . $ilDB->quote($a_obj_type, "text") . " AND " .
69  "sub_obj_id = " . $ilDB->quote((int) $a_sub_obj_id, "integer") . " AND " .
70  $ilDB->equals("sub_obj_type", $a_sub_obj_type, "text", true) . " AND " .
71  "category_id = " . $ilDB->quote(0, "integer"));
72  }
73 
74  $ilDB->manipulate("DELETE FROM il_rating WHERE " .
75  "user_id = " . $ilDB->quote($a_user_id, "integer") . " AND " .
76  "obj_id = " . $ilDB->quote($a_obj_id, "integer") . " AND " .
77  "obj_type = " . $ilDB->quote($a_obj_type, "text") . " AND " .
78  "sub_obj_id = " . $ilDB->quote((int) $a_sub_obj_id, "integer") . " AND " .
79  $ilDB->equals("sub_obj_type", $a_sub_obj_type, "text", true) . " AND " .
80  "category_id = " . $ilDB->quote($a_category_id, "integer"));
81 
82  if ($a_rating) {
83  $ilDB->manipulate("INSERT INTO il_rating (user_id, obj_id, obj_type," .
84  "sub_obj_id, sub_obj_type, category_id, rating, tstamp) VALUES (" .
85  $ilDB->quote($a_user_id, "integer") . "," .
86  $ilDB->quote($a_obj_id, "integer") . "," .
87  $ilDB->quote($a_obj_type, "text") . "," .
88  $ilDB->quote((int) $a_sub_obj_id, "integer") . "," .
89  $ilDB->quote($a_sub_obj_type, "text") . "," .
90  $ilDB->quote($a_category_id, "integer") . "," .
91  $ilDB->quote($a_rating, "integer") . "," .
92  $ilDB->quote(time(), "integer") . ")");
93  }
94  }
95 
105  public static function resetRatingForUserAndObject(
106  int $a_obj_id,
107  string $a_obj_type,
108  int $a_sub_obj_id,
109  string $a_sub_obj_type,
110  int $a_user_id
111  ): void {
112  global $DIC;
113 
114  $ilDB = $DIC->database();
115 
116  $ilDB->manipulate("DELETE FROM il_rating WHERE " .
117  "user_id = " . $ilDB->quote($a_user_id, "integer") . " AND " .
118  "obj_id = " . $ilDB->quote($a_obj_id, "integer") . " AND " .
119  "obj_type = " . $ilDB->quote($a_obj_type, "text") . " AND " .
120  "sub_obj_id = " . $ilDB->quote($a_sub_obj_id, "integer") . " AND " .
121  $ilDB->equals("sub_obj_type", $a_sub_obj_type, "text", true));
122  }
123 
124 
135  public static function getRatingForUserAndObject(
136  int $a_obj_id,
137  string $a_obj_type,
138  int $a_sub_obj_id,
139  string $a_sub_obj_type,
140  int $a_user_id,
141  int $a_category_id = null
142  ): float {
143  global $DIC;
144 
145  $ilDB = $DIC->database();
146 
147  if (isset(self::$list_data["user"][$a_obj_type . "/" . $a_obj_id])) {
148  return self::$list_data["user"][$a_obj_type . "/" . $a_obj_id] ?? 0;
149  }
150 
151  $q = "SELECT AVG(rating) av FROM il_rating WHERE " .
152  "user_id = " . $ilDB->quote($a_user_id, "integer") . " AND " .
153  "obj_id = " . $ilDB->quote($a_obj_id, "integer") . " AND " .
154  "obj_type = " . $ilDB->quote($a_obj_type, "text") . " AND " .
155  "sub_obj_id = " . $ilDB->quote($a_sub_obj_id, "integer") . " AND " .
156  $ilDB->equals("sub_obj_type", $a_sub_obj_type, "text", true);
157  if ($a_category_id !== null) {
158  $q .= " AND category_id = " . $ilDB->quote($a_category_id, "integer");
159  }
160  $set = $ilDB->query($q);
161  $rec = $ilDB->fetchAssoc($set);
162  return (float) $rec["av"];
163  }
164 
174  public static function getOverallRatingForObject(
175  int $a_obj_id,
176  string $a_obj_type,
177  int $a_sub_obj_id = null,
178  string $a_sub_obj_type = null,
179  int $a_category_id = null
180  ): array {
181  global $DIC;
182 
183  $ilDB = $DIC->database();
184 
185  if (isset(self::$list_data["all"][$a_obj_type . "/" . $a_obj_id])) {
186  return self::$list_data["all"][$a_obj_type . "/" . $a_obj_id];
187  }
188 
189  $q = "SELECT AVG(rating) av FROM il_rating" .
190  " WHERE obj_id = " . $ilDB->quote($a_obj_id, "integer") .
191  " AND obj_type = " . $ilDB->quote($a_obj_type, "text");
192  if ($a_sub_obj_id) {
193  $q .= " AND sub_obj_id = " . $ilDB->quote($a_sub_obj_id, "integer") .
194  " AND " . $ilDB->equals("sub_obj_type", $a_sub_obj_type, "text", true);
195  } else {
196  $q .= " AND sub_obj_type = " . $ilDB->quote("-", "text"); // #13913
197  }
198 
199  if ($a_category_id !== null) {
200  $q .= " AND category_id = " . $ilDB->quote($a_category_id, "integer");
201  }
202  $q .= " GROUP BY user_id";
203  $set = $ilDB->query($q);
204  $avg = $cnt = 0;
205  while ($rec = $ilDB->fetchAssoc($set)) {
206  $cnt++;
207  $avg += $rec["av"];
208  }
209  if ($cnt > 0) {
210  $avg = $avg / $cnt;
211  } else {
212  $avg = 0;
213  }
214  return array("cnt" => $cnt, "avg" => $avg);
215  }
216 
225  public static function getExportData(
226  int $a_obj_id,
227  string $a_obj_type,
228  array $a_category_ids = null
229  ): array {
230  global $DIC;
231 
232  $ilDB = $DIC->database();
233 
234  $res = array();
235  $q = "SELECT sub_obj_id, sub_obj_type, rating, category_id, user_id, tstamp " .
236  "FROM il_rating WHERE " .
237  "obj_id = " . $ilDB->quote($a_obj_id, "integer") . " AND " .
238  "obj_type = " . $ilDB->quote($a_obj_type, "text") .
239  " ORDER BY tstamp";
240  if ($a_category_ids) {
241  $q .= " AND " . $ilDB->in("category_id", $a_category_ids, "", "integer");
242  }
243  $set = $ilDB->query($q);
244  while ($row = $ilDB->fetchAssoc($set)) {
245  $res[] = $row;
246  }
247  return $res;
248  }
249 
255  public static function preloadListGUIData(
256  array $a_obj_ids
257  ): void {
258  global $DIC;
259 
260  $ilDB = $DIC->database();
261  $ilUser = $DIC->user();
262 
263  $tmp = $res = $res_user = array();
264 
265  // collapse by categories
266  $q = "SELECT obj_id, obj_type, user_id, AVG(rating) av" .
267  " FROM il_rating" .
268  " WHERE " . $ilDB->in("obj_id", $a_obj_ids, "", "integer") .
269  " AND sub_obj_id = " . $ilDB->quote(0, "integer") .
270  " GROUP BY obj_id, obj_type, user_id";
271  $set = $ilDB->query($q);
272  while ($rec = $ilDB->fetchAssoc($set)) {
273  $tmp[$rec["obj_type"] . "/" . $rec["obj_id"]][$rec["user_id"]] = (float) $rec["av"];
274  if ($rec["user_id"] == $ilUser->getId()) {
275  // add final average to user result (no sub-objects)
276  $res_user[$rec["obj_type"] . "/" . $rec["obj_id"]] = (float) $rec["av"];
277  }
278  }
279 
280  // average for main objects without sub-objects
281  foreach ($tmp as $obj_id => $votes) {
282  $res[$obj_id] = array("avg" => array_sum($votes) / sizeof($votes),
283  "cnt" => sizeof($votes));
284  }
285 
286  // file/wiki/lm rating toggles
287 
288  $set = $ilDB->query("SELECT file_id, rating" .
289  " FROM file_data" .
290  " WHERE " . $ilDB->in("file_id", $a_obj_ids, "", 'integer'));
291  while ($row = $ilDB->fetchAssoc($set)) {
292  $id = "file/" . $row["file_id"];
293  if ($row["rating"] && !isset($res[$id])) {
294  $res[$id] = array("avg" => 0, "cnt" => 0);
295  } elseif (!$row["rating"] && isset($res[$id])) {
296  unset($res[$id]);
297  }
298  }
299 
300  $set = $ilDB->query("SELECT id, rating_overall" .
301  " FROM il_wiki_data" .
302  " WHERE " . $ilDB->in("id", $a_obj_ids, "", 'integer'));
303  while ($row = $ilDB->fetchAssoc($set)) {
304  $id = "wiki/" . $row["id"];
305  if ($row["rating_overall"] && !isset($res[$id])) {
306  $res[$id] = array("avg" => 0, "cnt" => 0);
307  } elseif (!$row["rating_overall"] && isset($res[$id])) {
308  unset($res[$id]);
309  }
310  }
311 
312  $set = $ilDB->query("SELECT id, rating" .
313  " FROM content_object" .
314  " WHERE " . $ilDB->in("id", $a_obj_ids, "", 'integer'));
315  while ($row = $ilDB->fetchAssoc($set)) {
316  $id = "lm/" . $row["id"];
317  if ($row["rating"] && !isset($res[$id])) {
318  $res[$id] = array("avg" => 0, "cnt" => 0);
319  } elseif (!$row["rating"] && isset($res[$id])) {
320  unset($res[$id]);
321  }
322  }
323 
324  self::$list_data = array("all" => $res, "user" => $res_user);
325  }
326 
327  public static function hasRatingInListGUI(
328  int $a_obj_id,
329  string $a_obj_type
330  ): bool {
331  return isset(self::$list_data["all"][$a_obj_type . "/" . $a_obj_id]);
332  }
333 }
$res
Definition: ltiservices.php:69
const ANONYMOUS_USER_ID
Definition: constants.php:27
static getExportData(int $a_obj_id, string $a_obj_type, array $a_category_ids=null)
Get export data.
static resetRatingForUserAndObject(int $a_obj_id, string $a_obj_type, int $a_sub_obj_id, string $a_sub_obj_type, int $a_user_id)
Reset rating for a user and an object.
static writeRatingForUserAndObject(int $a_obj_id, string $a_obj_type, ?int $a_sub_obj_id, ?string $a_sub_obj_type, int $a_user_id, int $a_rating, int $a_category_id=0)
Write rating for a user and an object.
global $DIC
Definition: feed.php:28
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static array $list_data
static preloadListGUIData(array $a_obj_ids)
Preload rating data for list guis.
static getRatingForUserAndObject(int $a_obj_id, string $a_obj_type, int $a_sub_obj_id, string $a_sub_obj_type, int $a_user_id, int $a_category_id=null)
Get rating for a user and an object.
$ilUser
Definition: imgupload.php:34
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
static getOverallRatingForObject(int $a_obj_id, string $a_obj_type, int $a_sub_obj_id=null, string $a_sub_obj_type=null, int $a_category_id=null)
Get overall rating for an object.
static hasRatingInListGUI(int $a_obj_id, string $a_obj_type)