ILIAS  release_8 Revision v8.24
class.ilBadgeProfileGUI.php
Go to the documentation of this file.
1<?php
2
20
27{
28 public const BACKPACK_EMAIL = "badge_mozilla_bp";
30
31 protected ilCtrl $ctrl;
32 protected ilLanguage $lng;
34 protected ilTabsGUI $tabs;
35 protected ilObjUser $user;
37 protected \ILIAS\UI\Factory $factory;
38 protected \ILIAS\UI\Renderer $renderer;
40
41 public function __construct()
42 {
43 global $DIC;
44
45 $this->ctrl = $DIC->ctrl();
46 $this->lng = $DIC->language();
47 $this->tpl = $DIC["tpl"];
48 $this->tabs = $DIC->tabs();
49 $this->user = $DIC->user();
50 $this->access = $DIC->access();
51 $this->factory = $DIC->ui()->factory();
52 $this->renderer = $DIC->ui()->renderer();
53 $this->request = new ilBadgeGUIRequest(
54 $DIC->http(),
55 $DIC->refinery()
56 );
57
58 $this->noti_repo = new BadgeNotificationPrefRepository();
59 }
60
61
62 public function executeCommand(): void
63 {
64 $ilCtrl = $this->ctrl;
66
67 $lng->loadLanguageModule("badge");
68
69 switch ($ilCtrl->getNextClass()) {
70 default:
71 $this->setTabs();
72 $cmd = $ilCtrl->getCmd("listBadges");
73 $this->$cmd();
74 break;
75 }
76 }
77
78 protected function setTabs(): void
79 {
80 $ilTabs = $this->tabs;
82 $ilCtrl = $this->ctrl;
83 }
84
85 protected function getSubTabs(string $a_active): void
86 {
87 $ilTabs = $this->tabs;
89 $ilCtrl = $this->ctrl;
90
91 $ilTabs->addTab(
92 "list",
93 $lng->txt("badge_profile_view"),
94 $ilCtrl->getLinkTarget($this, "listBadges")
95 );
96 $ilTabs->addTab(
97 "manage",
98 $lng->txt("badge_profile_manage"),
99 $ilCtrl->getLinkTarget($this, "manageBadges")
100 );
101 $ilTabs->activateTab($a_active);
102 }
103
104 protected function listBadges(): void
105 {
108
109 $this->getSubTabs("list");
110
111 $data = array();
112
113 // see ilBadgePersonalTableGUI::getItems()
114 foreach (ilBadgeAssignment::getInstancesByUserId($ilUser->getId()) as $ass) {
115 $badge = new ilBadge($ass->getBadgeId());
116
117 $data[] = array(
118 "id" => $badge->getId(),
119 "title" => $badge->getTitle(),
120 "description" => $badge->getDescription(),
121 "image" => $badge->getImagePath(),
122 "name" => $badge->getImage(),
123 "issued_on" => $ass->getTimestamp(),
124 "active" => (bool) $ass->getPosition(),
125 "object" => $badge->getParentMeta(),
126 "renderer" => new ilBadgeRenderer($ass)
127 );
128 }
129
130 // :TODO:
131 $data = ilArrayUtil::sortArray($data, "issued_on", "desc", true);
132
133 $tmpl = new ilTemplate("tpl.badge_backpack.html", true, true, "Services/Badge");
134
136
137 $cards = array();
138 $badge_components = array();
139
140 foreach ($data as $badge) {
141 $modal = $this->factory->modal()->roundtrip(
142 $badge["title"],
143 $this->factory->legacy($badge["renderer"]->renderModalContent())
144 )->withCancelButtonLabel("ok");
145 $image = $this->factory->image()->responsive(ilWACSignedPath::signFile($badge["image"]), $badge["name"])
146 ->withAction($modal->getShowSignal());
147
148 $this->ctrl->setParameter($this, "badge_id", $badge["id"]);
149 $url = $this->ctrl->getLinkTarget($this, $badge["active"]
150 ? "deactivateInCard"
151 : "activateInCard");
152 $this->ctrl->setParameter($this, "badge_id", "");
153 $profile_button = $this->factory->button()->standard(
154 $this->lng->txt(!$badge["active"] ? "badge_add_to_profile" : "badge_remove_from_profile"),
155 $url
156 );
157
158 if ($badge["object"]["type"] !== "bdga") {
159 $parent_icon = $this->factory->symbol()->icon()->custom(
160 ilObject::_getIcon((int) $badge["object"]["id"], "big", $badge["object"]["type"]),
161 $this->lng->txt("obj_" . $badge["object"]["type"]),
162 "medium"
163 );
164
165 $ref_ids = ilObject::_getAllReferences($badge["object"]["id"]);
166 $parent_ref_id = array_shift($ref_ids);
167 if ($parent_ref_id && $this->access->checkAccess("read", "", $parent_ref_id)) {
168 $parent_link = $this->factory->link()->standard($badge["object"]["title"], ilLink::_getLink($parent_ref_id));
169 } else {
170 $parent_link = $this->factory->legacy($badge["object"]["title"]);
171 }
172
173 $badge_sections = [
174 $this->factory->listing()->descriptive([
175 $this->lng->txt("object") => $this->factory->legacy(
176 $this->renderer->render($parent_icon) . $this->renderer->render($parent_link)
177 )
178 ]),
179 $profile_button
180 ];
181 } else {
182 $badge_sections = [$profile_button];
183 }
184
185 $cards[] = $this->factory->card()->standard($badge["title"], $image)->withSections($badge_sections)
186 ->withTitleAction($modal->getShowSignal());
187
188 $badge_components[] = $modal;
189 }
190
191 $deck = $this->factory->deck($cards)->withSmallCardsSize();
192 $badge_components[] = $deck;
193
194 $tmpl->setVariable("DECK", $this->renderer->render($badge_components));
195 $tpl->setContent($tmpl->get());
196
197 $this->noti_repo->updateLastCheckedTimestamp();
198 }
199
200 protected function manageBadges(): void
201 {
203
204 $this->getSubTabs("manage");
205
206 $tbl = new ilBadgePersonalTableGUI($this, "manageBadges");
207
208 $tpl->setContent($tbl->getHTML());
209 }
210
211 protected function applyFilter(): void
212 {
213 $tbl = new ilBadgePersonalTableGUI($this, "manageBadges");
214 $tbl->resetOffset();
215 $tbl->writeFilterToSession();
216 $this->manageBadges();
217 }
218
219 protected function resetFilter(): void
220 {
221 $tbl = new ilBadgePersonalTableGUI($this, "manageBadges");
222 $tbl->resetOffset();
223 $tbl->resetFilter();
224 $this->manageBadges();
225 }
226
227 protected function getMultiSelection(): array
228 {
230 $ilCtrl = $this->ctrl;
232
233 $ids = $this->request->getBadgeIds();
234 if (count($ids) > 0) {
235 $res = array();
236 foreach ($ids as $id) {
237 $ass = new ilBadgeAssignment($id, $ilUser->getId());
238 if ($ass->getTimestamp()) {
239 $res[] = $ass;
240 }
241 }
242
243 return $res;
244 }
245
246 $this->tpl->setOnScreenMessage('failure', $lng->txt("select_one"), true);
247 $ilCtrl->redirect($this, "manageBadges");
248 return [];
249 }
250
251 protected function activate(): void
252 {
254 $ilCtrl = $this->ctrl;
255
256 foreach ($this->getMultiSelection() as $ass) {
257 // already active?
258 if (!$ass->getPosition()) {
259 $ass->setPosition(999);
260 $ass->store();
261 }
262 }
263
264 $this->tpl->setOnScreenMessage('success', $lng->txt("settings_saved"), true);
265 $ilCtrl->redirect($this, "manageBadges");
266 }
267
268 protected function deactivate(): void
269 {
271 $ilCtrl = $this->ctrl;
272
273 foreach ($this->getMultiSelection() as $ass) {
274 // already inactive?
275 if ($ass->getPosition()) {
276 $ass->setPosition(null);
277 $ass->store();
278 }
279 }
280
281 $this->tpl->setOnScreenMessage('success', $lng->txt("settings_saved"), true);
282 $ilCtrl->redirect($this, "manageBadges");
283 }
284
285 protected function activateInCard(): void
286 {
288 $ilCtrl = $this->ctrl;
289
290 foreach ($this->getMultiSelection() as $ass) {
291 // already active?
292 if (!$ass->getPosition()) {
293 $ass->setPosition(999);
294 $ass->store();
295 }
296 }
297
298 $this->tpl->setOnScreenMessage('success', $lng->txt("settings_saved"), true);
299 $ilCtrl->redirect($this, "listBadges");
300 }
301
302 protected function deactivateInCard(): void
303 {
305 $ilCtrl = $this->ctrl;
306
307 foreach ($this->getMultiSelection() as $ass) {
308 // already inactive?
309 if ($ass->getPosition()) {
310 $ass->setPosition(null);
311 $ass->store();
312 }
313 }
314
315 $this->tpl->setOnScreenMessage('success', $lng->txt("settings_saved"), true);
316 $ilCtrl->redirect($this, "listBadges");
317 }
318
319
320
321 protected function setBackpackSubTabs(): void
322 {
323 $ilTabs = $this->tabs;
325 $ilCtrl = $this->ctrl;
326
327 $ilTabs->addSubTab(
328 "backpack_badges",
329 $lng->txt("obj_bdga"),
330 $ilCtrl->getLinkTarget($this, "listBackpackGroups")
331 );
332
333 $ilTabs->addSubTab(
334 "backpack_settings",
335 $lng->txt("settings"),
336 $ilCtrl->getLinkTarget($this, "editSettings")
337 );
338
339 $ilTabs->activateTab("backpack_badges");
340 }
341
342 protected function listBackpackGroups(): void
343 {
346 $ilCtrl = $this->ctrl;
347 $ilTabs = $this->tabs;
348
349 $this->setBackpackSubTabs();
350 $ilTabs->activateSubTab("backpack_badges");
351
352 $this->tpl->setOnScreenMessage('info', $lng->txt("badge_backpack_gallery_info"));
353
354 $bp = new ilBadgeBackpack($this->getBackpackMail());
355 $bp_groups = $bp->getGroups();
356
357 if (!count($bp_groups)) {
358 $this->tpl->setOnScreenMessage('info', $lng->txt("badge_backpack_no_groups"));
359 return;
360 }
361
362 $tmpl = new ilTemplate("tpl.badge_backpack.html", true, true, "Services/Badge");
363
364 $tmpl->setVariable("BACKPACK_TITLE", $lng->txt("badge_backpack_list"));
365
367
368 foreach ($bp_groups as $group_id => $group) {
369 $bp_badges = $bp->getBadges($group_id);
370 if (count($bp_badges)) {
371 foreach ($bp_badges as $idx => $badge) {
372 $tmpl->setCurrentBlock("badge_bl");
373 $tmpl->setVariable("BADGE_TITLE", $badge["title"]);
374 $tmpl->setVariable("BADGE_DESC", $badge["description"]);
375 $tmpl->setVariable("BADGE_IMAGE", $badge["image_url"]);
376 $tmpl->setVariable("BADGE_CRITERIA", $badge["criteria_url"]);
377 $tmpl->setVariable("BADGE_ISSUER", $badge["issuer_name"]);
378 $tmpl->setVariable("BADGE_ISSUER_URL", $badge["issuer_url"]);
379 $tmpl->setVariable("BADGE_DATE", ilDatePresentation::formatDate($badge["issued_on"]));
380 $tmpl->parseCurrentBlock();
381 }
382 }
383
384 $tmpl->setCurrentBlock("group_bl");
385 $tmpl->setVariable("GROUP_TITLE", $group["title"]);
386 $tmpl->parseCurrentBlock();
387 }
388
389 $tpl->setContent($tmpl->get());
390 }
391
392 //
393 // settings
394 //
395
396 protected function getBackpackMail(): string
397 {
399
400 $mail = $ilUser->getPref(self::BACKPACK_EMAIL);
401 if (!$mail) {
402 $mail = $ilUser->getEmail();
403 }
404 return $mail;
405 }
406
408 {
410 $ilCtrl = $this->ctrl;
411
412 $form = new ilPropertyFormGUI();
413 $form->setFormAction($ilCtrl->getFormAction($this, "saveSettings"));
414 $form->setTitle($lng->txt("settings"));
415
416 $email = new ilEMailInputGUI($lng->txt("badge_backpack_email"), "email");
417 // $email->setRequired(true);
418 $email->setInfo($lng->txt("badge_backpack_email_info"));
419 $email->setValue($this->getBackpackMail());
420 $form->addItem($email);
421
422 $form->addCommandButton("saveSettings", $lng->txt("save"));
423
424 return $form;
425 }
426
427 protected function editSettings(ilPropertyFormGUI $a_form = null): void
428 {
430 $ilCtrl = $this->ctrl;
431 $ilTabs = $this->tabs;
432
433 $ilCtrl->redirect($this, "listBadges");
434 }
435
436 protected function saveSettings(): void
437 {
440 $ilCtrl = $this->ctrl;
441
442 $form = $this->initSettingsForm();
443 if ($form->checkInput()) {
444 $new_email = $form->getInput("email");
445 $old_email = $this->getBackpackMail();
446
447 ilObjUser::_writePref($ilUser->getId(), self::BACKPACK_EMAIL, $new_email);
448
449 // if email was changed: delete badge files
450 if ($new_email != $old_email) {
452 }
453
454 $this->tpl->setOnScreenMessage('success', $lng->txt("settings_saved"), true);
455 $ilCtrl->redirect($this, "editSettings");
456 }
457
458 $form->setValuesByPost();
459 $this->editSettings($form);
460 }
461}
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
Badge notification repository (using user preferences.
static sortArray(array $array, string $a_array_sortby_key, string $a_array_sortorder="asc", bool $a_numeric=false, bool $a_keep_keys=false)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static clearBadgeCache(int $a_user_id)
static getInstancesByUserId(int $a_user_id)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ilBadgeProfileGUI.
BadgeNotificationPrefRepository $noti_repo
getSubTabs(string $a_active)
editSettings(ilPropertyFormGUI $a_form=null)
ILIAS UI Renderer $renderer
ilGlobalTemplateInterface $tpl
ilBadgeGUIRequest $request
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ilCtrl provides processing control methods.
redirect(object $a_gui_obj, string $a_cmd=null, string $a_anchor=null, bool $is_async=false)
@inheritDoc
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)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
language handling
loadLanguageModule(string $a_module)
Load language module.
txt(string $a_topic, string $a_default_lang_fallback_mod="")
gets the text for a given topic if the topic is not in the list, the topic itself with "-" will be re...
User class.
static _writePref(int $a_usr_id, string $a_keyword, string $a_value)
static _getIcon(int $obj_id=0, string $size="big", string $type="", bool $offline=false)
Get icon for repository item.
static _getAllReferences(int $id)
get all reference ids for object ID
This class represents a property form user interface.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
special template class to simplify handling of ITX/PEAR
static signFile(string $path_to_file)
global $DIC
Definition: feed.php:28
$ilUser
Definition: imgupload.php:34
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setContent(string $a_html)
Sets content for standard template.
$res
Definition: ltiservices.php:69
if( $orgName !==null) if($spconfig->hasValue('contacts')) $email
Definition: metadata.php:302
$url