ILIAS  release_8 Revision v8.24
class.ilUserCertificateTableProvider.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
25{
28 private string $defaultTitle;
29
30 public function __construct(
33 string $defaultTitle
34 ) {
35 $this->database = $database;
36 $this->logger = $logger;
37 $this->defaultTitle = $defaultTitle;
38 }
39
46 public function fetchDataSet(int $userId, array $params, array $filter): array
47 {
48 $this->logger->debug(sprintf('START - Fetching all active certificates for user: "%s"', $userId));
49
50 $sql = 'SELECT
51 il_cert_user_cert.id,
52 il_cert_user_cert.obj_type,
53 il_cert_user_cert.thumbnail_image_path,
54 il_cert_user_cert.acquired_timestamp,
55 usr_data.firstname,
56 usr_data.lastname,
57 il_cert_user_cert.obj_id,
58 (CASE
59 WHEN (trans.title IS NOT NULL AND LENGTH(trans.title) > 0) THEN trans.title
60 WHEN (object_data.title IS NOT NULL AND LENGTH(object_data.title) > 0) THEN object_data.title
61 WHEN (object_data_del.title IS NOT NULL AND LENGTH(object_data_del.title) > 0) THEN object_data_del.title
62 ELSE ' . $this->database->quote($this->defaultTitle, 'text') . '
63 END
64 ) as title,
65 (CASE
66 WHEN (trans.description IS NOT NULL AND LENGTH(trans.description) > 0) THEN trans.description
67 WHEN (object_data.description IS NOT NULL AND LENGTH(object_data.description) > 0) THEN object_data.description
68 WHEN (object_data_del.description IS NOT NULL AND LENGTH(object_data_del.description) > 0) THEN object_data_del.description
69 ELSE ""
70 END
71 ) as description
72FROM il_cert_user_cert
73LEFT JOIN object_data ON object_data.obj_id = il_cert_user_cert.obj_id
74LEFT JOIN object_translation trans ON trans.obj_id = object_data.obj_id
75AND trans.lang_code = ' . $this->database->quote($params['language'], 'text') . '
76LEFT JOIN object_data_del ON object_data_del.obj_id = il_cert_user_cert.obj_id
77LEFT JOIN usr_data ON usr_data.usr_id = il_cert_user_cert.usr_id
78WHERE il_cert_user_cert.usr_id = ' . $this->database->quote($userId, 'integer') . ' AND currently_active = 1';
79
80 if ([] !== $params) {
81 $sql .= $this->getOrderByPart($params, $filter);
82 }
83
84 if (isset($params['limit'])) {
85 if (!is_numeric($params['limit'])) {
86 throw new InvalidArgumentException('Please provide a valid numerical limit.');
87 }
88
89 if (!isset($params['offset'])) {
90 $params['offset'] = 0;
91 } elseif (!is_numeric($params['offset'])) {
92 throw new InvalidArgumentException('Please provide a valid numerical offset.');
93 }
94
95 $this->database->setLimit($params['limit'], $params['offset']);
96 }
97
98 $query = $this->database->query($sql);
99
100 $data = [
101 'items' => [],
102 ];
103
104 while ($row = $this->database->fetchAssoc($query)) {
105 $title = $row['title'];
106
107 $data['items'][] = [
108 'id' => (int) $row['id'],
109 'title' => $title,
110 'obj_id' => (int) $row['obj_id'],
111 'obj_type' => $row['obj_type'],
112 'date' => (int) $row['acquired_timestamp'],
113 'thumbnail_image_path' => $row['thumbnail_image_path'],
114 'description' => $row['description'],
115 'firstname' => $row['firstname'],
116 'lastname' => $row['lastname'],
117 ];
118 }
119
120 if (isset($params['limit'])) {
121 $cnt_sql = '
122 SELECT COUNT(*) cnt
123 FROM il_cert_user_cert
124 WHERE usr_id = ' . $this->database->quote($userId, 'integer') . ' AND currently_active = 1';
125
126 $row_cnt = $this->database->fetchAssoc($this->database->query($cnt_sql));
127
128 $data['cnt'] = (int) $row_cnt['cnt'];
129
130 $this->logger->debug(sprintf(
131 'All active certificates for user: "%s" total: "%s"',
132 $userId,
133 $data['cnt']
134 ));
135 } else {
136 $data['cnt'] = count($data['items']);
137 }
138
139 $this->logger->debug(sprintf('END - Actual results: "%s"', json_encode($data, JSON_THROW_ON_ERROR)));
140
141 return $data;
142 }
143
144 protected function getOrderByPart(array $params, array $filter): string
145 {
146 if (isset($params['order_field'])) {
147 if (!is_string($params['order_field'])) {
148 throw new InvalidArgumentException('Please provide a valid order field.');
149 }
150
151 if (!in_array($params['order_field'], ['date', 'id', 'title'])) {
152 throw new InvalidArgumentException('Please provide a valid order field.');
153 }
154
155 if ($params['order_field'] === 'date') {
156 $params['order_field'] = 'acquired_timestamp';
157 }
158
159 if (!isset($params['order_direction'])) {
160 $params['order_direction'] = 'ASC';
161 } elseif (!in_array(strtolower($params['order_direction']), ['asc', 'desc'])) {
162 throw new InvalidArgumentException('Please provide a valid order direction.');
163 }
164
165 return ' ORDER BY ' . $params['order_field'] . ' ' . $params['order_direction'];
166 }
167
168 return '';
169 }
170}
Component logger with individual log levels by component id.
fetchDataSet(int $userId, array $params, array $filter)
__construct(ilDBInterface $database, ilLogger $logger, string $defaultTitle)
Interface ilDBInterface.
if(! $DIC->user() ->getId()||!ilLTIConsumerAccess::hasCustomProviderCreationAccess()) $params
Definition: ltiregstart.php:33
$query