ILIAS  release_8 Revision v8.24
class.ilRepositoryTrashGUI.php
Go to the documentation of this file.
1<?php
2
20
28{
29 protected ilLanguage $lng;
31 protected ilCtrl $ctrl;
35 protected ilTree $tree;
36 protected ?ilLogger $logger = null;
38 protected object $parent_gui;
39 protected string $parent_cmd;
40
41 public function __construct(
42 ilObjectGUI $a_parent_gui,
43 string $a_parent_cmd = ""
44 ) {
46 global $DIC;
47
48 $this->lng = $DIC->language();
49 $this->settings = $DIC->settings();
50 $this->ctrl = $DIC->ctrl();
51 $this->tpl = $DIC["tpl"];
52 $this->obj_definition = $DIC["objDefinition"];
53 $this->access = $DIC->access();
54 $this->tree = $DIC->repositoryTree();
55 $this->parent_gui = $a_parent_gui;
56 $this->parent_cmd = $a_parent_cmd;
57
58 $this->logger = $DIC->logger()->rep();
59 $this->request = $DIC->repository()
60 ->internal()
61 ->gui()
62 ->trash()
63 ->request();
64 }
65
69 public function executeCommand(): void
70 {
71 $next_class = $this->ctrl->getNextClass($this);
72 switch ($next_class) {
73 case "ilpropertyformgui":
74 $form = $this->initFormTrashTargetLocation();
75 $this->ctrl->forwardCommand($form);
76 break;
77
78 default:
79 $cmd = $this->ctrl->getCmd('cancel');
80 $this->$cmd();
81 break;
82 }
83 }
84
85 protected function cancel(): void
86 {
87 $this->ctrl->returnToParent($this);
88 }
89
90 public function restoreToNewLocation(
91 ilPropertyFormGUI $form = null
92 ): void {
93 $this->lng->loadLanguageModule('rep');
94
95 $trash_ids = $this->request->getTrashIds();
96
97 $this->ctrl->setParameter($this, 'trash_ids', implode(',', $trash_ids));
98
99 if (!count($trash_ids)) {
100 $this->tpl->setOnScreenMessage('failure', $this->lng->txt('select_one'), true);
101 $this->ctrl->returnToParent($this);
102 }
103
104 if (!$form instanceof ilPropertyFormGUI) {
105 $form = $this->initFormTrashTargetLocation();
106 }
107 $this->tpl->setOnScreenMessage('info', $this->lng->txt('rep_target_location_info'));
108 $this->tpl->setContent($form->getHTML());
109 }
110
115 public function doRestoreToNewLocation(): void
116 {
117 $trash_ids = $this->request->getTrashIds();
118
119 $form = $this->initFormTrashTargetLocation();
120 if (!$form->checkInput() && count($trash_ids)) {
121 $this->lng->loadLanguageModule('search');
122 $this->tpl->setOnScreenMessage('failure', $this->lng->txt('search_no_selection'), true);
123 $this->ctrl->returnToParent($this);
124 }
125
126 try {
127 ilRepUtil::restoreObjects($form->getInput('target_id'), $trash_ids);
128 $this->tpl->setOnScreenMessage('success', $this->lng->txt('msg_undeleted'), true);
129 $this->ctrl->returnToParent($this);
130 } catch (ilRepositoryException $e) {
131 $this->tpl->setOnScreenMessage('failure', $e->getMessage(), true);
132 $this->ctrl->returnToParent($this);
133 }
134 }
135
137 {
138 $form = new ilPropertyFormGUI();
139 $form->setFormAction($this->ctrl->getFormAction($this));
140
141 $target = new ilRepositorySelector2InputGUI(
142 $this->lng->txt('rep_target_location'),
143 'target_id',
144 false
145 );
146 $target->setRequired(true);
147
148 $explorer = new ilRepositorySelectorExplorerGUI(
149 [
150 ilAdministrationGUI::class,
151 get_class($this->parent_gui),
152 self::class,
153 ilPropertyFormGUI::class,
154 ilFormPropertyDispatchGUI::class,
155 ilRepositorySelector2InputGUI::class
156 ],
157 'handleExplorerCommand',
158 $target,
159 'root_id',
160 'rep_exp_sel_' . $target->getPostVar()
161 );
162 $explorer->setSelectMode($target->getPostVar() . "_sel", false);
163 $explorer->setRootId(ROOT_FOLDER_ID);
164 $explorer->setTypeWhiteList(['root','cat','crs','grp','fold']);
165 $target->setExplorerGUI($explorer);
166
167 $form->addItem($target);
168 $form->addCommandButton('doRestoreToNewLocation', $this->lng->txt('btn_undelete'));
169 $form->addCommandButton('cancel', $this->lng->txt('cancel'));
170
171 return $form;
172 }
173
174 public function showDeleteConfirmation(
175 ?array $a_ids,
176 bool $a_supress_message = false
177 ): bool {
178 $lng = $this->lng;
180 $ilCtrl = $this->ctrl;
182 $objDefinition = $this->obj_definition;
183
184 if (!is_array($a_ids) || count($a_ids) === 0) {
185 $this->tpl->setOnScreenMessage('failure', $lng->txt("no_checkbox"), true);
186 return false;
187 }
188
189 // Remove duplicate entries
190 $a_ids = array_unique($a_ids);
191
192 $cgui = new ilConfirmationGUI();
193
194 if (!$a_supress_message) {
195 $msg = $lng->txt("info_delete_sure");
196
197 if (!$ilSetting->get('enable_trash')) {
198 $msg .= "<br/>" . $lng->txt("info_delete_warning_no_trash");
199 }
200
201 $cgui->setHeaderText($msg);
202 }
203 $cgui->setFormAction($ilCtrl->getFormAction($this->parent_gui));
204 $cgui->setCancel($lng->txt("cancel"), "cancelDelete");
205 $cgui->setConfirm($lng->txt("confirm"), "confirmedDelete");
206
207 $form_name = "cgui_" . md5(uniqid('', true));
208 $cgui->setFormName($form_name);
209
210 $deps = [];
211 foreach ($a_ids as $ref_id) {
213 $type = ilObject::_lookupType($obj_id);
214 $title = call_user_func([ilObjectFactory::getClassByType($type), '_lookupTitle'], $obj_id);
215 $alt = ($objDefinition->isPlugin($type))
216 ? $lng->txt("icon") . " " . ilObjectPlugin::lookupTxtById($type, "obj_" . $type)
217 : $lng->txt("icon") . " " . $lng->txt("obj_" . $type);
218
219 $cgui->addItem(
220 "id[]",
221 $ref_id,
222 ilUtil::stripSlashes($title) .
223 $this->handleMultiReferences($obj_id, $ref_id, $form_name),
224 ilObject::_getIcon($obj_id, "small", $type),
225 $alt
226 );
227
229 }
230 $deps_html = "";
231
232 if (is_array($deps) && count($deps) > 0) {
233 $tab = new ilRepDependenciesTableGUI($deps);
234 $deps_html = "<br/><br/>" . $tab->getHTML();
235 }
236
237 $tpl->setContent($cgui->getHTML() . $deps_html);
238 return true;
239 }
240
241 // Build sub-item list for multiple references
242 public function handleMultiReferences(
243 int $a_obj_id,
244 int $a_ref_id,
245 string $a_form_name
246 ): string {
247 $lng = $this->lng;
248 $ilAccess = $this->access;
249 $tree = $this->tree;
250
251 // process
252
253 $all_refs = ilObject::_getAllReferences($a_obj_id);
254 if (count($all_refs) > 1) {
255 $lng->loadLanguageModule("rep");
256
257 $may_delete_any = 0;
258 $counter = 0;
259 $items = [];
260 foreach ($all_refs as $mref_id) {
261 // not the already selected reference, no refs from trash
262 if ($mref_id != $a_ref_id && !$tree->isDeleted($mref_id)) {
263 if ($ilAccess->checkAccess("read", "", $mref_id)) {
264 $may_delete = false;
265 if ($ilAccess->checkAccess("delete", "", $mref_id)) {
266 $may_delete = true;
267 $may_delete_any++;
268 }
269
270 $path = $this->buildPath([$mref_id]);
271 $items[] = [
272 "id" => $mref_id,
273 "path" => array_shift($path),
274 "delete" => $may_delete
275 ];
276 } else {
277 $counter++;
278 }
279 }
280 }
281
282
283 // render
284
285 $tpl = new ilTemplate("tpl.rep_multi_ref.html", true, true, "Services/Repository/Trash");
286
287 $tpl->setVariable("TXT_INTRO", $lng->txt("rep_multiple_reference_deletion_intro"));
288
289 if ($may_delete_any) {
290 $tpl->setVariable("TXT_INSTRUCTION", $lng->txt("rep_multiple_reference_deletion_instruction"));
291 }
292
293 if ($items) {
294 $var_name = "mref_id[]";
295
296 foreach ($items as $item) {
297 if ($item["delete"]) {
298 $tpl->setCurrentBlock("cbox");
299 $tpl->setVariable("ITEM_NAME", $var_name);
300 $tpl->setVariable("ITEM_VALUE", $item["id"]);
301 } else {
302 $tpl->setCurrentBlock("item_info");
303 $tpl->setVariable("TXT_ITEM_INFO", $lng->txt("rep_no_permission_to_delete"));
304 }
305 $tpl->parseCurrentBlock();
306
307 $tpl->setCurrentBlock("item");
308 $tpl->setVariable("ITEM_TITLE", $item["path"]);
309 $tpl->parseCurrentBlock();
310 }
311
312 if ($may_delete_any > 1) {
313 $tpl->setCurrentBlock("cbox");
314 $tpl->setVariable("ITEM_NAME", "sall_" . $a_ref_id);
315 $tpl->setVariable("ITEM_VALUE", "");
316 $tpl->setVariable("ITEM_ADD", " onclick=\"il.Util.setChecked('" .
317 $a_form_name . "', '" . $var_name . "', document." . $a_form_name .
318 ".sall_" . $a_ref_id . ".checked)\"");
319 $tpl->parseCurrentBlock();
320
321 $tpl->setCurrentBlock("item");
322 $tpl->setVariable("ITEM_TITLE", $lng->txt("select_all"));
323 $tpl->parseCurrentBlock();
324 }
325 }
326
327 if ($counter) {
328 $tpl->setCurrentBlock("add_info");
329 $tpl->setVariable(
330 "TXT_ADDITIONAL_INFO",
331 sprintf($lng->txt("rep_object_references_cannot_be_read"), $counter)
332 );
333 $tpl->parseCurrentBlock();
334 }
335 return $tpl->get();
336 }
337 return "";
338 }
339
340 public function showTrashTable(
341 int $a_ref_id
342 ): void {
343 $tpl = $this->tpl;
344 $tree = $this->tree;
346
347 $objects = $tree->getSavedNodeData($a_ref_id);
348
349 if (count($objects) === 0) {
350 $this->tpl->setOnScreenMessage('info', $lng->txt("msg_trash_empty"));
351 return;
352 }
353 $ttab = new ilTrashTableGUI($this->parent_gui, "trash", $a_ref_id);
354 $ttab->setData($objects);
355
356 $tpl->setContent($ttab->getHTML());
357 }
358
365 public function restoreObjects(
366 int $a_cur_ref_id,
367 array $a_ref_ids
368 ): bool {
369 $lng = $this->lng;
370 $lng->loadLanguageModule('rep');
371
372 if (!is_array($a_ref_ids) || count($a_ref_ids) === 0) {
373 $this->tpl->setOnScreenMessage('failure', $lng->txt("no_checkbox"), true);
374 return false;
375 }
376
377 $tree_trash_queries = new ilTreeTrashQueries();
378 if ($tree_trash_queries->isTrashedTrash($a_ref_ids)) {
379 $this->tpl->setOnScreenMessage('failure', $this->lng->txt('rep_failure_trashed_trash'), true);
380 return false;
381 }
382 try {
383
384 // find parent foreach node
385 $by_location = [];
386 foreach ($a_ref_ids as $deleted_node_id) {
387 $target_id = $tree_trash_queries->findRepositoryLocationForDeletedNode($deleted_node_id);
388 if ($target_id) {
389 $by_location[$target_id][] = $deleted_node_id;
390 }
391 }
392 foreach ($by_location as $target_id => $deleted_node_ids) {
393 ilRepUtil::restoreObjects($target_id, $deleted_node_ids);
394 }
395 $this->tpl->setOnScreenMessage('success', $lng->txt("msg_undeleted"), true);
396 } catch (Exception $e) {
397 $this->tpl->setOnScreenMessage('failure', $e->getMessage(), true);
398 return false;
399 }
400 return true;
401 }
402
403 public function deleteObjects(
404 int $a_cur_ref_id,
405 array $a_ref_ids
406 ): void {
407 $ilSetting = $this->settings;
409
410 if (!is_array($a_ref_ids) || count($a_ref_ids) === 0) {
411 $this->tpl->setOnScreenMessage('failure', $lng->txt("no_checkbox"), true);
412 } else {
413 try {
414 ilRepUtil::deleteObjects($a_cur_ref_id, $a_ref_ids, false);
415 if ($ilSetting->get('enable_trash')) {
416 $this->tpl->setOnScreenMessage('success', $lng->txt("info_deleted"), true);
417 } else {
418 $this->tpl->setOnScreenMessage('success', $lng->txt("msg_removed"), true);
419 }
420 } catch (Exception $e) {
421 //$this->tpl->setOnScreenMessage('failure', $e->getMessage(), true);
422 // alex: I outcommented this, since it makes tracking down errors impossible
423 // we need a call stack at least in the logs
424 throw $e;
425 }
426 }
427 }
428
429 public function removeObjectsFromSystem(
430 array $a_ref_ids,
431 bool $a_from_recovery_folder = false
432 ): bool {
433 $lng = $this->lng;
434
435 if (!is_array($a_ref_ids) || count($a_ref_ids) === 0) {
436 $this->tpl->setOnScreenMessage('failure', $lng->txt("no_checkbox"), true);
437 return false;
438 }
439
440 try {
441 ilRepUtil::removeObjectsFromSystem($a_ref_ids, $a_from_recovery_folder);
442 $this->tpl->setOnScreenMessage('success', $lng->txt("msg_removed"), true);
443 } catch (Exception $e) {
444 // alex: I outcommented this, since it makes tracking down errors impossible
445 // we need a call stack at least in the logs
446 //$this->tpl->setOnScreenMessage('failure', $e->getMessage(), true);
447 throw $e;
448 return false;
449 }
450
451 return true;
452 }
453
457 protected function buildPath(array $ref_ids): array
458 {
459 $tree = $this->tree;
460
461 if (!count($ref_ids)) {
462 return [];
463 }
464
465 $result = [];
466 foreach ($ref_ids as $ref_id) {
467 $path = "";
468 $path_full = $tree->getPathFull($ref_id);
469 foreach ($path_full as $idx => $data) {
470 if ($idx) {
471 $path .= " &raquo; ";
472 }
473 if ((int) $ref_id !== (int) $data['ref_id']) {
474 $path .= ilUtil::stripSlashes($data['title']);
475 } else {
476 $path .= ('<a target="_top" href="' .
477 ilLink::_getLink($data['ref_id'], $data['type']) . '">' .
478 ilUtil::stripSlashes($data['title']) . '</a>');
479 }
480 }
481
482 $result[] = $path;
483 }
484 return $result;
485 }
486
493 array $a_ids
494 ): void {
495 $ilCtrl = $this->ctrl;
497 $objDefinition = $this->obj_definition;
499
500 if (!is_array($a_ids)) {
501 $a_ids = [$a_ids];
502 }
503
504 $cgui = new ilConfirmationGUI();
505 $cgui->setFormAction($ilCtrl->getFormAction($this->parent_gui));
506 $cgui->setCancel($lng->txt("cancel"), "trash");
507 $cgui->setConfirm($lng->txt("confirm"), "removeFromSystem");
508 $cgui->setFormName("trash_confirmation");
509 $cgui->setHeaderText($lng->txt("info_delete_sure"));
510
511 foreach ($a_ids as $id) {
512 $obj_id = ilObject::_lookupObjId($id);
513 $type = ilObject::_lookupType($obj_id);
514 $title = call_user_func([ilObjectFactory::getClassByType($type), '_lookupTitle'], $obj_id);
515 $alt = ($objDefinition->isPlugin($type))
516 ? $lng->txt("icon") . " " . ilObjectPlugin::lookupTxtById($type, "obj_" . $type)
517 : $lng->txt("icon") . " " . $lng->txt("obj_" . $type);
518
519 $cgui->addItem(
520 "trash_id[]",
521 $id,
522 $title,
523 ilObject::_getIcon($obj_id, "small", $type),
524 $alt
525 );
526 }
527
528 $tpl->setContent($cgui->getHTML());
529 }
530}
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ilCtrl provides processing control methods.
language handling
Component logger with individual log levels by component id.
parses the objects.xml it handles the xml-description of all ilias objects
static getClassByType(string $obj_type)
Class ilObjectGUI Basic methods of all Output classes.
static lookupTxtById(string $plugin_id, string $lang_var)
static _lookupType(int $id, bool $reference=false)
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
static collectDeletionDependencies(array &$deps, int $ref_id, int $obj_id, string $type, int $depth=0)
Collect deletion dependencies.
static _lookupObjId(int $ref_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...
static restoreObjects(int $a_cur_ref_id, array $a_ref_ids)
Move objects from trash back to repository.
static removeObjectsFromSystem(array $a_ref_ids, bool $a_from_recovery_folder=false)
remove objects from trash bin and all entries therefore every object needs a specific deleteObject() ...
static deleteObjects(int $a_cur_ref_id, array $a_ids, bool $throw_error_on_already_deleted=true)
Delete objects.
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...
Explorer for selecting repository items.
Repository GUI Utilities.
handleMultiReferences(int $a_obj_id, int $a_ref_id, string $a_form_name)
restoreToNewLocation(ilPropertyFormGUI $form=null)
ilObjectDefinition $obj_definition
restoreObjects(int $a_cur_ref_id, array $a_ref_ids)
Restore objects from trash.
buildPath(array $ref_ids)
Build path with deep-link.
ilGlobalTemplateInterface $tpl
deleteObjects(int $a_cur_ref_id, array $a_ref_ids)
confirmRemoveFromSystemObject(array $a_ids)
Confirmation for trash.
showDeleteConfirmation(?array $a_ids, bool $a_supress_message=false)
removeObjectsFromSystem(array $a_ref_ids, bool $a_from_recovery_folder=false)
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
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...
getPathFull(int $a_endnode_id, int $a_startnode_id=0)
get path from a given startnode to a given endnode if startnode is not given the rootnode is startnod...
isDeleted(int $a_node_id)
This is a wrapper for isSaved() with a more useful name.
getSavedNodeData(int $a_parent_id)
get data saved/deleted nodes
static stripSlashes(string $a_str, bool $a_strip_html=true, string $a_allow="")
const ROOT_FOLDER_ID
Definition: constants.php:32
global $DIC
Definition: feed.php:28
$target_id
Definition: goto.php:52
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...
if($DIC->http() ->request() ->getMethod()=="GET" &&isset($DIC->http() ->request() ->getQueryParams()['tex'])) $tpl
Definition: latex.php:41
$ref_id
Definition: ltiauth.php:67
$path
Definition: ltiservices.php:32
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
array $settings
Setting values (LTI parameters, custom parameters and local parameters).
Definition: System.php:200
global $ilSetting
Definition: privfeed.php:17
$type
$lng