ILIAS  trunk Revision v11.0_alpha-1761-g6dbbfa7b760
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
CertificateExport.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
26 
27 class CertificateExport implements Exporter
28 {
29  public function __construct(
30  private readonly Language $lng,
31  private readonly \ilDBInterface $db,
32  private readonly TestLogger $logger,
33  private \ilGlobalTemplateInterface $tpl,
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 }
Interface Observer Contains several chained tasks and infos about them.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$path
Definition: ltiservices.php:29
$components
static getASCIIFilename(string $a_filename)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
static _getUserIdFromActiveId(int $active_id)
__construct(private readonly Language $lng, private readonly \ilDBInterface $db, private readonly TestLogger $logger, private \ilGlobalTemplateInterface $tpl, private FileDeliveryServices $file_delivery, private readonly \ilObjTest $object)
buildFailedGenerationMessage(array $failed_pdf_generation_ids)
global $lng
Definition: privfeed.php:31
buildIgnoredUsersMessage(array $ignored_user_ids)
$file_delivery
Definition: deliver.php:29
static _lookupLogin(int $a_user_id)