ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
CertificateExport.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
25use ILIAS\FileDelivery\Services as FileDeliveryServices;
26
28{
29 public function __construct(
30 private readonly Language $lng,
31 private readonly \ilDBInterface $db,
32 private readonly TestLogger $logger,
33 private \ilGlobalTemplateInterface $tpl,
34 private FileDeliveryServices $file_delivery,
35 private readonly \ilObjTest $object
36 ) {
37 }
38
39 public function deliver(): void
40 {
41 if (($path = $this->write()) === null) {
42 return;
43 }
44 $this->file_delivery->legacyDelivery()->attached(
45 $path,
46 null,
47 null,
48 true
49 );
50 }
51
52 public function write(): ?string
53 {
54 $global_certificate_prerequisites = new \ilCertificateActiveValidator();
55 if (!$global_certificate_prerequisites->validate()) {
56 $this->tpl->setOnScreenMessage('failure', $this->lng->txt('permission_denied'));
57 return null;
58 }
59
60 $path_factory = new \ilCertificatePathFactory();
61 $obj_id = $this->object->getId();
62 $zip_action = new \ilUserCertificateZip(
63 $obj_id,
64 $path_factory->create($this->object)
65 );
66
67 $archive_dir = $zip_action->createArchiveDirectory();
68
69 $this->object->setAccessFilteredParticipantList(
70 $this->object->buildStatisticsAccessFilteredParticipantList()
71 );
72
73 $certificate_repo = new \ilUserCertificateRepository($this->db);
74 $pdf_generator = new \ilPdfGenerator($certificate_repo);
75
76 $total_users = $this->object->evalTotalPersonsArray();
77 if (count($total_users) === 0) {
78 $this->tpl->setOnScreenMessage(
79 'info',
80 $this->lng->txt('export_cert_no_users'),
81 true
82 );
83 return null;
84 }
85
86 $cert_validator = new \ilCertificateDownloadValidator();
87
88 $num_pdfs = 0;
89 $ignored_usr_ids = [];
90 $failed_pdf_generation_usr_ids = [];
91 foreach ($total_users as $active_id => $name) {
93
94 if (!$cert_validator->isCertificateDownloadable($user_id, $obj_id)) {
95 $this->logger->debug(
96 sprintf(
97 'No certificate available for user %s in test %s ' .
98 '(Check if: \ilServer is enabled / Certificates are enabled globally / ' .
99 'A Certificate is issued for the user)',
100 $user_id,
101 $obj_id
102 )
103 );
104 $ignored_usr_ids[] = $user_id;
105 continue;
106 }
107
108 $pdf_action = new \ilCertificatePdfAction(
109 $pdf_generator,
111 $this->lng->txt('error_creating_certificate_pdf')
112 );
113
114 $pdf = $pdf_action->createPDF($user_id, $obj_id);
115 if ($pdf !== '') {
116 $zip_action->addPDFtoArchiveDirectory(
117 $pdf,
118 $archive_dir,
119 $user_id . '_' . str_replace(' ', '_', \ilFileUtils::getASCIIFilename($name)) . '.pdf'
120 );
121 ++$num_pdfs;
122 } else {
123 $this->logger->error(
124 sprintf(
125 'The certificate service could not create a PDF for user %s and test %s',
126 $user_id,
127 $obj_id
128 )
129 );
130 $failed_pdf_generation_usr_ids[] = $user_id;
131 }
132 }
133
134 $zip_file_dir = null;
135 if ($num_pdfs > 0) {
136 try {
137 $zip_file_dir = $zip_action->zipCertificatesInArchiveDirectory($archive_dir, false);
138 } catch (\ILIAS\Filesystem\Exception\IOException $e) {
139 $this->logger->error($e->getMessage());
140 $this->logger->error($e->getTraceAsString());
141 $this->tpl->setOnScreenMessage(
142 'failure',
143 $this->lng->txt('error_creating_certificate_zip_empty'),
144 true
145 );
146 }
147 }
148
149 $components = [];
150 if ($ignored_usr_ids !== []) {
151 $components[] = $this->buildIgnoredUsersMessage($ignored_usr_ids);
152 }
153 if ($failed_pdf_generation_usr_ids !== []) {
154 $components[] = $this->buildFailedGenerationMessage($failed_pdf_generation_usr_ids);
155 }
156 if ($components !== []) {
157 $this->tpl->setOnScreenMessage('info', implode('<br>', $components), true);
158 }
159
160 return $zip_file_dir;
161 }
162
163 private function buildIgnoredUsersMessage(array $ignored_user_ids): string
164 {
165 $ignored_user_logins = $this->getLoginsForIds($ignored_user_ids);
166 $nr_ignored_users = count($ignored_user_ids);
167 if ($nr_ignored_users === 1) {
168 return sprintf(
169 $this->lng->txt('export_cert_ignored_for_users_s'),
170 $ignored_user_logins[0]
171 );
172 }
173 return sprintf(
174 $this->lng->txt('export_cert_ignored_for_users_p'),
175 $nr_ignored_users,
176 implode(', ', $ignored_user_logins)
177 );
178 }
179
180 private function buildFailedGenerationMessage(array $failed_pdf_generation_ids): string
181 {
182 $failed_pdf_generation_logins = $this->getLoginsForIds($failed_pdf_generation_ids);
183 $nr_failed_pdf_generation = count($failed_pdf_generation_ids);
184 if ($nr_failed_pdf_generation === 1) {
185 return sprintf(
186 $this->lng->txt('export_cert_failed_for_users_s'),
187 $failed_pdf_generation_logins[0]
188 );
189 }
190
191 return sprintf(
192 $this->lng->txt('export_cert_failed_for_users_p'),
193 $nr_failed_pdf_generation,
194 implode(', ', $failed_pdf_generation_logins)
195 );
196 }
197
198 private function getLoginsForIds(array $user_ids): array
199 {
200 return array_map(
201 function ($usr_id): string {
202 $login = \ilObjUser::_lookupLogin((int) $usr_id);
203 if ($login !== '') {
204 return $login;
205 }
206 return $this->lng->txt('deleted_user');
207 },
208 $user_ids
209 );
210 }
211}
$components
buildFailedGenerationMessage(array $failed_pdf_generation_ids)
__construct(private readonly Language $lng, private readonly \ilDBInterface $db, private readonly TestLogger $logger, private \ilGlobalTemplateInterface $tpl, private FileDeliveryServices $file_delivery, private readonly \ilObjTest $object)
buildIgnoredUsersMessage(array $ignored_user_ids)
Just a wrapper class to create Unit Test for other classes.
static getASCIIFilename(string $a_filename)
static _getUserIdFromActiveId(int $active_id)
static _lookupLogin(int $a_user_id)
$file_delivery
Definition: deliver.php:29
Interface ilDBInterface.
$path
Definition: ltiservices.php:30
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.
global $lng
Definition: privfeed.php:31