ILIAS  release_8 Revision v8.24
class.ilCronManagerTableGUI.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22{
24 private bool $mayWrite;
25
26 public function __construct(
27 ilCronManagerGUI $a_parent_obj,
29 string $a_parent_cmd,
30 bool $mayWrite = false
31 ) {
32 $this->cronRepository = $cronRepository;
33 $this->mayWrite = $mayWrite;
34
35 $this->setId('crnmng'); // #14526 / #16391
36
37 parent::__construct($a_parent_obj, $a_parent_cmd);
38
39 if ($this->mayWrite) {
40 $this->addColumn("", "", '1px', true);
41 }
42 $this->addColumn($this->lng->txt('cron_job_id'), 'title');
43 $this->addColumn($this->lng->txt('cron_component'), 'component');
44 $this->addColumn($this->lng->txt('cron_schedule'), 'schedule');
45 $this->addColumn($this->lng->txt('cron_status'), 'status');
46 $this->addColumn($this->lng->txt('cron_status_info'), '');
47 $this->addColumn($this->lng->txt('cron_result'), 'result');
48 $this->addColumn($this->lng->txt('cron_result_info'), '');
49 $this->addColumn($this->lng->txt('cron_last_run'), 'last_run');
50 if ($this->mayWrite) {
51 $this->addColumn($this->lng->txt('actions'), '');
52 }
53
54 $this->setTitle($this->lng->txt('cron_jobs'));
55 $this->setDefaultOrderField('title');
56
57 if ($this->mayWrite) {
58 $this->setSelectAllCheckbox('mjid');
59 $this->addMultiCommand('activate', $this->lng->txt('cron_action_activate'));
60 $this->addMultiCommand('deactivate', $this->lng->txt('cron_action_deactivate'));
61 $this->addMultiCommand('reset', $this->lng->txt('cron_action_reset'));
62 }
63
64 $this->setRowTemplate('tpl.cron_job_row.html', 'Services/Cron');
65 $this->setFormAction($this->ctrl->getFormAction($a_parent_obj, $a_parent_cmd));
66 }
67
68 private function formatSchedule(ilCronJobEntity $entity, array $row): string
69 {
70 $schedule = '';
71 switch ($entity->getEffectiveScheduleType()) {
73 $schedule = $this->lng->txt('cron_schedule_daily');
74 break;
75
77 $schedule = $this->lng->txt('cron_schedule_weekly');
78 break;
79
81 $schedule = $this->lng->txt('cron_schedule_monthly');
82 break;
83
85 $schedule = $this->lng->txt('cron_schedule_quarterly');
86 break;
87
89 $schedule = $this->lng->txt('cron_schedule_yearly');
90 break;
91
93 $schedule = sprintf(
94 $this->lng->txt('cron_schedule_in_minutes'),
96 );
97 break;
98
100 $schedule = sprintf(
101 $this->lng->txt('cron_schedule_in_hours'),
103 );
104 break;
105
107 $schedule = sprintf(
108 $this->lng->txt('cron_schedule_in_days'),
110 );
111 break;
112 }
113
114 return $schedule;
115 }
116
117 private function formatStatusInfo(ilCronJobEntity $entity): string
118 {
119 $status_info = [];
120 if ($entity->getJobStatusTimestamp()) {
121 $status_info[] = ilDatePresentation::formatDate(
123 );
124 }
125
126 if ($entity->getJobStatusType()) {
127 $status_info[] = ilUserUtil::getNamePresentation($entity->getJobStatusUsrId());
128 } else {
129 $status_info[] = $this->lng->txt('cron_changed_by_crontab');
130 }
131
132 return implode('<br />', $status_info);
133 }
134
135 private function formatResult(ilCronJobEntity $entity): string
136 {
137 $result = '-';
138 if ($entity->getJobResultStatus()) {
139 switch ($entity->getJobResultStatus()) {
141 $result = $this->lng->txt('cron_result_status_invalid_configuration');
142 break;
143
145 $result = $this->lng->txt('cron_result_status_no_action');
146 break;
147
149 $result = $this->lng->txt('cron_result_status_ok');
150 break;
151
153 $result = $this->lng->txt('cron_result_status_crashed');
154 break;
155
157 $result = $this->lng->txt('cron_result_status_reset');
158 break;
159
161 $result = $this->lng->txt('cron_result_status_fail');
162 break;
163 }
164 }
165
166 return $result;
167 }
168
169 private function formatResultInfo(ilCronJobEntity $entity): string
170 {
171 $result_info = [];
172 if ($entity->getJobResultDuration()) {
173 $result_info[] = ($entity->getJobResultDuration() / 1000) . ' sec';
174 }
175
176 // #23391 / #11866
177 $resultCode = $entity->getJobResultCode();
178 if (in_array($resultCode, ilCronJobResult::getCoreCodes(), true)) {
179 $result_info[] = $this->lng->txt('cro_job_rc_' . $resultCode);
180 } elseif ($entity->getJobResultMessage()) {
181 $result_info[] = $entity->getJobResultMessage();
182 }
183
184 if (defined('DEVMODE') && DEVMODE && $resultCode) {
185 $result_info[] = $resultCode;
186 }
187
188 if ($entity->getJobResultType()) {
189 $result_info[] = ilUserUtil::getNamePresentation($entity->getJobResultUsrId());
190 } else {
191 $result_info[] = $this->lng->txt('cron_changed_by_crontab');
192 }
193
194 return implode('<br />', $result_info);
195 }
196
197 public function populate(ilCronJobCollection $collection): self
198 {
199 $this->setData(array_map(function (ilCronJobEntity $entity): array {
200 $row = [];
201
202 $row['schedule'] = $this->formatSchedule($entity, $row);
203 $row['status'] = $this->lng->txt('cron_status_inactive');
204 if ($entity->getJobStatus()) {
205 $row['status'] = $this->lng->txt('cron_status_active');
206 }
207 $row['status_info'] = $this->formatStatusInfo($entity);
208 $row['result'] = $this->formatResult($entity);
209 $row['result_info'] = $this->formatResultInfo($entity);
210
211 $row['last_run'] = null;
212 if ($entity->getRunningTimestamp()) {
213 $row['last_run'] = strtotime('+1year', $entity->getRunningTimestamp());
214 } elseif ($entity->getJobResultTimestamp()) {
215 $row['last_run'] = $entity->getJobResultTimestamp();
216 }
217
218 $row['job_id'] = $entity->getJobId();
219 $row['component'] = $entity->getComponent();
220 if ($entity->isPlugin()) {
221 $row['job_id'] = 'pl__' . $row['component'] . '__' . $row['job_id'];
222 $row['component'] = $this->lng->txt('cmps_plugin') . '/' . $row['component'];
223 }
224
225 $row['title'] = $entity->getEffectiveTitle();
226 $row['description'] = $entity->getJob()->getDescription();
227 $row['is_manually_executable'] = $entity->getJob()->isManuallyExecutable();
228 $row['has_settings'] = $entity->getJob()->hasCustomSettings();
229 $row['job_result_status'] = $entity->getJobResultStatus();
230 $row['job_status'] = $entity->getJobStatus();
231 $row['alive_ts'] = $entity->getAliveTimestamp();
232 $row['running_ts'] = $entity->getRunningTimestamp();
233
234 if ($entity->getJob()->hasFlexibleSchedule()) {
235 $row['editable_schedule'] = true;
236 if (!$entity->getScheduleType()) {
237 $this->cronRepository->updateJobSchedule(
238 $entity->getJob(),
239 $entity->getEffectiveScheduleType(),
241 );
242 }
243 } elseif ($entity->getScheduleType()) {
244 $this->cronRepository->updateJobSchedule($entity->getJob(), null, null);
245 }
246
247 return $row;
248 }, $collection->toArray()));
249
250 return $this;
251 }
252
253 protected function fillRow(array $a_set): void
254 {
255 if ($this->mayWrite) {
256 $this->tpl->setVariable('VAL_JID', $a_set['job_id']);
257 }
258 $this->tpl->setVariable('VAL_ID', $a_set['title']);
259
260 if ($a_set['description']) {
261 $this->tpl->setVariable('VAL_DESC', $a_set['description']);
262 }
263
264 $this->tpl->setVariable('VAL_COMPONENT', $a_set['component']);
265 $this->tpl->setVariable('VAL_SCHEDULE', $a_set['schedule']);
266 $this->tpl->setVariable('VAL_STATUS', $a_set['status']);
267 $this->tpl->setVariable('VAL_STATUS_INFO', $a_set['status_info']);
268 $this->tpl->setVariable('VAL_RESULT', $a_set['result']);
269 $this->tpl->setVariable('VAL_RESULT_INFO', $a_set['result_info']);
270 if ($a_set['last_run'] > time()) {
271 $a_set['last_run'] = $this->lng->txt('cron_running_since') . ' ' .
272 ilDatePresentation::formatDate(new ilDateTime($a_set['running_ts'], IL_CAL_UNIX));
273
274 // job has pinged
275 if ($a_set['alive_ts'] !== $a_set['running_ts']) {
276 $a_set['last_run'] .= '<br />(Ping: ' .
277 ilDatePresentation::formatDate(new ilDateTime($a_set['alive_ts'], IL_CAL_UNIX)) . ')';
278 }
279 } elseif ($a_set['last_run']) {
280 $a_set['last_run'] = ilDatePresentation::formatDate(new ilDateTime($a_set['last_run'], IL_CAL_UNIX));
281 }
282 $this->tpl->setVariable('VAL_LAST_RUN', $a_set['last_run'] ?: '-');
283
284 $actions = [];
285 if ($this->mayWrite && !$a_set['running_ts']) {
286 if ($a_set['job_result_status'] === ilCronJobResult::STATUS_CRASHED) {
287 $actions[] = 'reset';
288 } elseif (!$a_set['job_status']) {
289 $actions[] = 'activate';
290 } else {
291 if ($a_set['is_manually_executable']) {
292 $actions[] = 'run';
293 }
294 $actions[] = 'deactivate';
295 }
296
297 if (
298 (isset($a_set['editable_schedule']) && $a_set['editable_schedule']) ||
299 (isset($a_set['has_settings']) && $a_set['has_settings'])
300 ) {
301 $actions[] = 'edit';
302 }
303
304 $this->ctrl->setParameter($this->getParentObject(), 'jid', $a_set['job_id']);
305 foreach ($actions as $action) {
306 $this->tpl->setCurrentBlock('action_bl');
307 $this->tpl->setVariable(
308 'URL_ACTION',
309 $this->ctrl->getLinkTarget($this->getParentObject(), $action)
310 );
311 $this->tpl->setVariable('TXT_ACTION', $this->lng->txt('cron_action_' . $action));
312 $this->tpl->parseCurrentBlock();
313 }
314 $this->ctrl->setParameter($this->getParentObject(), 'jid', '');
315 }
316 }
317}
const IL_CAL_UNIX
const SCHEDULE_TYPE_IN_DAYS
@depracated This will be replaced with an ENUM in ILIAS 9
const SCHEDULE_TYPE_IN_HOURS
@depracated This will be replaced with an ENUM in ILIAS 9
const SCHEDULE_TYPE_IN_MINUTES
@depracated This will be replaced with an ENUM in ILIAS 9
const SCHEDULE_TYPE_WEEKLY
@depracated This will be replaced with an ENUM in ILIAS 9
const SCHEDULE_TYPE_YEARLY
@depracated This will be replaced with an ENUM in ILIAS 9
const SCHEDULE_TYPE_DAILY
@depracated This will be replaced with an ENUM in ILIAS 9
const SCHEDULE_TYPE_QUARTERLY
@depracated This will be replaced with an ENUM in ILIAS 9
const SCHEDULE_TYPE_MONTHLY
@depracated This will be replaced with an ENUM in ILIAS 9
Class ilCronManagerGUI.
fillRow(array $a_set)
Standard Version of Fill Row.
formatResultInfo(ilCronJobEntity $entity)
formatStatusInfo(ilCronJobEntity $entity)
formatSchedule(ilCronJobEntity $entity, array $row)
formatResult(ilCronJobEntity $entity)
__construct(ilCronManagerGUI $a_parent_obj, ilCronJobRepository $cronRepository, string $a_parent_cmd, bool $mayWrite=false)
populate(ilCronJobCollection $collection)
static formatDate(ilDateTime $date, bool $a_skip_day=false, bool $a_include_wd=false, bool $include_seconds=false)
@classDescription Date and time handling
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setTitle(string $a_title, string $a_icon="", string $a_icon_alt="")
addMultiCommand(string $a_cmd, string $a_text)
setFormAction(string $a_form_action, bool $a_multipart=false)
addColumn(string $a_text, string $a_sort_field="", string $a_width="", bool $a_is_checkbox_action_column=false, string $a_class="", string $a_tooltip="", bool $a_tooltip_with_html=false)
setDefaultOrderField(string $a_defaultorderfield)
setSelectAllCheckbox(string $a_select_all_checkbox, bool $a_select_all_on_top=false)
setRowTemplate(string $a_template, string $a_template_dir="")
Set row template.
setId(string $a_val)
setData(array $a_data)
Set table data.
static getNamePresentation( $a_user_id, bool $a_user_image=false, bool $a_profile_link=false, string $a_profile_back_link="", bool $a_force_first_lastname=false, bool $a_omit_login=false, bool $a_sortable=true, bool $a_return_data_array=false, $a_ctrl_path="ilpublicuserprofilegui")
Default behaviour is:
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc