ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
class.ilUserCertificateGUI.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
24use Psr\Http\Message\ServerRequestInterface;
27
32{
33 final public const SORTATION_SESSION_KEY = 'my_certificates_sorting';
34
36 private readonly ilCtrlInterface $ctrl;
37 private readonly ilLanguage $language;
39 private readonly ilObjUser $user;
40 private readonly ServerRequestInterface $request;
41 private readonly ilLogger $certificateLogger;
42 private readonly Factory $uiFactory;
43 private readonly Renderer $uiRenderer;
44 private readonly ilAccessHandler $access;
45 private readonly ilHelpGUI $help;
46 private readonly ilDBInterface $db;
47
51 protected array $sortationOptions = [
52 'title_ASC' => 'cert_sortable_by_title_asc',
53 'title_DESC' => 'cert_sortable_by_title_desc',
54 'date_ASC' => 'cert_sortable_by_issue_date_asc',
55 'date_DESC' => 'cert_sortable_by_issue_date_desc',
56 ];
57 protected string $defaultSorting = 'date_DESC';
58 private readonly Filesystem $filesystem;
59
60 public function __construct(
62 ?ilCtrlInterface $ctrl = null,
63 ?ilLanguage $language = null,
64 ?ilObjUser $user = null,
66 ?ServerRequestInterface $request = null,
68 private readonly ilSetting $certificateSettings = new ilSetting('certificate'),
69 ?Factory $uiFactory = null,
70 ?Renderer $uiRenderer = null,
72 ?Filesystem $filesystem = null,
73 ?ilHelpGUI $help = null,
74 ?ilDBInterface $db = null,
75 private ?IRSS $irss = null
76 ) {
77 global $DIC;
78
79 $this->template = $template ?? $DIC->ui()->mainTemplate();
80 $this->ctrl = $ctrl ?? $DIC->ctrl();
81 $this->user = $user ?? $DIC->user();
82 $this->language = $language ?? $DIC->language();
83 $this->request = $request ?? $DIC->http()->request();
84 $this->certificateLogger = $certificateLogger ?? $DIC->logger()->cert();
85 $this->uiFactory = $uiFactory ?? $DIC->ui()->factory();
86 $this->uiRenderer = $uiRenderer ?? $DIC->ui()->renderer();
87 $this->access = $access ?? $DIC->access();
88 $this->filesystem = $filesystem ?? $DIC->filesystem()->web();
89 $this->userCertificateRepository = $userCertificateRepository ?? new ilUserCertificateRepository(null, $this->certificateLogger);
90 $this->help = $help ?? $DIC->help();
91 $this->db = $db ?? $DIC->database();
92 $this->irss = $irss ?? $DIC->resourceStorage();
93
94 $this->language->loadLanguageModule('cert');
95 }
96
97 private function getDefaultCommand(): string
98 {
99 return 'listCertificates';
100 }
101
102 public function executeCommand(): bool
103 {
104 $cmd = $this->ctrl->getCmd();
105
106 if (!$this->certificateSettings->get('active', '0')) {
107 $this->ctrl->returnToParent($this);
108 }
109
110 $this->template->setTitle($this->language->txt('obj_cert'));
111 if (!method_exists($this, $cmd)) {
112 $cmd = $this->getDefaultCommand();
113 }
114 $this->{$cmd}();
115
116 return true;
117 }
118
123 public function listCertificates(): void
124 {
125 $this->help->setScreenIdComponent('cert');
126
127 if (!$this->certificateSettings->get('active', '0')) {
128 $this->ctrl->redirect($this);
129 }
130
131 $this->template->setPermanentLink('cert', null, 'list');
132
134 $this->db,
135 $this->certificateLogger,
136 $this->language->txt('certificate_no_object_title')
137 );
138
139 $sorting = $this->getCurrentSortation();
140 $data = $provider->fetchDataSet(
141 $this->user->getId(),
142 [
143 'order_field' => explode('_', $sorting)[0],
144 'order_direction' => explode('_', $sorting)[1],
145 'language' => $this->user->getLanguage()
146 ],
147 []
148 );
149
150 $uiComponents = [];
151
152 if ($data['items'] !== []) {
154 $cards = [];
155
156 foreach ($this->sortationOptions as $fieldAndDirection => $lngVariable) {
157 $sortationOptions[$fieldAndDirection] = $this->language->txt($lngVariable);
158 }
159
160 $sortViewControl = $this->uiFactory
161 ->viewControl()
162 ->sortation($sortationOptions, $sorting)
163 ->withTargetURL($this->ctrl->getLinkTarget($this, 'applySortation'), 'sort_by');
164
165 $uiComponents[] = $sortViewControl;
166
167 foreach ($data['items'] as $certificateData) {
168 $tile_image_identification = $certificateData['tile_image_ident'] ?? '';
169 $imagePath = '';
170 if ($tile_image_identification === '' || $tile_image_identification === '-') {
171 $tile_image_identification = $certificateData['tile_image_path'] ?? '';
172 if ($tile_image_identification !== '' && $this->filesystem->has($tile_image_identification)) {
173 $imagePath = ilWACSignedPath::signFile(
174 ilFileUtils::getWebspaceDir() . $tile_image_identification
175 );
176 }
177 } else {
178 $tile_image_rid = $this->irss->manage()->find($tile_image_identification);
179 if ($tile_image_rid instanceof ResourceIdentification) {
180 $imagePath = $this->irss->consume()->src($tile_image_rid)->getSrc(true);
181 }
182 }
183
184 if ($imagePath === '') {
185 $imagePath = ilUtil::getImagePath('standard/icon_cert.svg');
186 }
187
188 $cardImage = $this->uiFactory->image()->standard(
189 $imagePath,
190 $certificateData['title']
191 );
192
193 $sections = [];
194
195 if ($certificateData['description'] !== '') {
196 $sections[] = $this->uiFactory->listing()->descriptive([
197 $this->language->txt('cert_description_label') => $certificateData['description']
198 ]);
199 }
200
201 $oldDatePresentationStatus = ilDatePresentation::useRelativeDates();
203 $sections[] = $this->uiFactory->listing()->descriptive([
204 $this->language->txt('cert_issued_on_label') => ilDatePresentation::formatDate(
205 new ilDateTime($certificateData['date'], IL_CAL_UNIX)
206 )
207 ]);
208 ilDatePresentation::setUseRelativeDates($oldDatePresentationStatus);
209
210 $objectTypeIcon = $this->uiFactory
211 ->symbol()
212 ->icon()
213 ->standard($certificateData['obj_type'], $certificateData['obj_type'])
214 ;
215
216 $objectTitle = $certificateData['title'];
217 $refIds = ilObject::_getAllReferences((int) $certificateData['obj_id']);
218 foreach ($refIds as $refId) {
219 if ($this->access->checkAccess('read', '', $refId)) {
220 $objectTitle = $this->uiRenderer->render(
221 $this->uiFactory->link()->standard($objectTitle, ilLink::_getLink($refId))
222 );
223
224 break;
225 }
226 }
227
228 $sections[] = $this->uiFactory->listing()->descriptive([$this->language->txt('cert_object_label') => implode(
229 '',
230 [
231 $this->uiRenderer->render($objectTypeIcon),
232 $objectTitle
233 ]
234 )
235 ]);
236
237 $this->ctrl->setParameter($this, 'certificate_id', $certificateData['id']);
238 $downloadHref = $this->ctrl->getLinkTarget($this, 'download');
239 $this->ctrl->clearParameters($this);
240 $sections[] = $this->uiFactory->button()->standard('Download', $downloadHref);
241
242 $card = $this->uiFactory
243 ->card()
244 ->standard($certificateData['title'], $cardImage)
245 ->withSections($sections)
246 ;
247
248 $cards[] = $card;
249 }
250
251 $deck = $this->uiFactory->deck($cards)->withSmallCardsSize();
252
253 $uiComponents[] = $this->uiFactory->divider()->horizontal();
254
255 $uiComponents[] = $deck;
256 } else {
257 $this->template->setOnScreenMessage('info', $this->language->txt('cert_currently_no_certs'));
258 }
259
260 $this->template->setContent($this->uiRenderer->render($uiComponents));
261 }
262
263 protected function getCurrentSortation(): string
264 {
265 $sorting = ilSession::get(self::SORTATION_SESSION_KEY);
266 if (!array_key_exists($sorting, $this->sortationOptions)) {
267 $sorting = $this->defaultSorting;
268 }
269
270 return $sorting;
271 }
272
277 protected function applySortation(): void
278 {
279 $sorting = $this->request->getQueryParams()['sort_by'] ?? $this->defaultSorting;
280 if (!array_key_exists($sorting, $this->sortationOptions)) {
281 $sorting = $this->defaultSorting;
282 }
283 ilSession::set(self::SORTATION_SESSION_KEY, $sorting);
284
285 $this->listCertificates();
286 }
287
291 public function download(): void
292 {
293 $pdfGenerator = new ilPdfGenerator($this->userCertificateRepository);
294
295 $userCertificateId = (int) $this->request->getQueryParams()['certificate_id'];
296
297 try {
298 $userCertificate = $this->userCertificateRepository->fetchCertificate($userCertificateId);
299 if ($userCertificate->getUserId() !== $this->user->getId()) {
300 throw new ilException(sprintf('User "%s" tried to access certificate: "%s"', $this->user->getLogin(), $userCertificateId));
301 }
302 } catch (ilException $exception) {
303 $this->certificateLogger->warning($exception->getMessage());
304 $this->template->setOnScreenMessage('failure', $this->language->txt('cert_error_no_access'));
305 $this->listCertificates();
306
307 return;
308 }
309
310 $pdfAction = new ilCertificatePdfAction(
311 $pdfGenerator,
313 $this->language->txt('error_creating_certificate_pdf')
314 );
315
316 $pdfAction->downloadPdf($userCertificate->getUserId(), $userCertificate->getObjId());
317
318 $this->listCertificates();
319 }
320}
Builds a Color from either hex- or rgb values.
Definition: Factory.php:31
const IL_CAL_UNIX
Just a wrapper class to create Unit Test for other classes.
static setUseRelativeDates(bool $a_status)
set use relative dates
static formatDate(ilDateTime $date, bool $a_skip_day=false, bool $a_include_wd=false, bool $include_seconds=false, ?ilObjUser $user=null,)
@classDescription Date and time handling
Base class for ILIAS Exception handling.
static getWebspaceDir(string $mode="filesystem")
get webspace directory
Help GUI class.
language handling
Component logger with individual log levels by component id.
User class.
static _getAllReferences(int $id)
get all reference ids for object ID
static get(string $a_var)
static set(string $a_var, $a_val)
Set a value.
ILIAS Setting Class.
@ilCtrl_IsCalledBy ilUserCertificateGUI: ilAchievementsGUI
readonly ServerRequestInterface $request
readonly ilAccessHandler $access
readonly ilUserCertificateRepository $userCertificateRepository
readonly ilCtrlInterface $ctrl
__construct(?ilGlobalTemplateInterface $template=null, ?ilCtrlInterface $ctrl=null, ?ilLanguage $language=null, ?ilObjUser $user=null, ?ilUserCertificateRepository $userCertificateRepository=null, ?ServerRequestInterface $request=null, ?ilLogger $certificateLogger=null, private readonly ilSetting $certificateSettings=new ilSetting('certificate'), ?Factory $uiFactory=null, ?Renderer $uiRenderer=null, ?ilAccessHandler $access=null, ?Filesystem $filesystem=null, ?ilHelpGUI $help=null, ?ilDBInterface $db=null, private ?IRSS $irss=null)
readonly ilGlobalTemplateInterface $template
readonly ilDBInterface $db
readonly ilLogger $certificateLogger
static getImagePath(string $image_name, string $module_path="", string $mode="output", bool $offline=false)
get image path (for images located in a template directory)
static signFile(string $path_to_file)
The filesystem interface provides the public interface for the Filesystem service API consumer.
Definition: Filesystem.php:37
This is how the factory for UI elements looks.
Definition: Factory.php:38
An entity that renders components to a string output.
Definition: Renderer.php:31
Interface ilAccessHandler This interface combines all available interfaces which can be called via gl...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Interface ilDBInterface.
$provider
Definition: ltitoken.php:80
global $DIC
Definition: shib_login.php:26
$refId
Definition: xapitoken.php:58