ILIAS  release_8 Revision v8.19
All Data Structures Namespaces Files Functions Variables Modules Pages
class.ilRepositoryTrashGUI.php
Go to the documentation of this file.
1 <?php
2 
20 
28 {
29  protected ilLanguage $lng;
30  protected ilSetting $settings;
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;
181  $tpl = $this->tpl;
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) {
212  $obj_id = ilObject::_lookupObjId($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 
228  ilObject::collectDeletionDependencies($deps, $ref_id, $obj_id, $type);
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;
345  $lng = $this->lng;
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 {
408  $lng = $this->lng;
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;
496  $lng = $this->lng;
497  $objDefinition = $this->obj_definition;
498  $tpl = $this->tpl;
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 }
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
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...
buildPath(array $ref_ids)
Build path with deep-link.
static _getIcon(int $obj_id=0, string $size="big", string $type="", bool $offline=false)
Get icon for repository item.
Explorer for selecting repository items.
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...
$type
const ROOT_FOLDER_ID
Definition: constants.php:32
static collectDeletionDependencies(array &$deps, int $ref_id, int $obj_id, string $type, int $depth=0)
Collect deletion dependencies.
static stripSlashes(string $a_str, bool $a_strip_html=true, string $a_allow="")
static _getAllReferences(int $id)
get all reference ids for object ID
isDeleted(int $a_node_id)
This is a wrapper for isSaved() with a more useful name.
get(string $part=self::DEFAULT_BLOCK)
Renders the given block and returns the html string.
$target_id
Definition: goto.php:52
loadLanguageModule(string $a_module)
Load language module.
setVariable(string $variable, $value='')
Sets the given variable to the given value.
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...
$path
Definition: ltiservices.php:32
static _lookupObjId(int $ref_id)
deleteObjects(int $a_cur_ref_id, array $a_ref_ids)
handleMultiReferences(int $a_obj_id, int $a_ref_id, string $a_form_name)
global $DIC
Definition: feed.php:28
removeObjectsFromSystem(array $a_ref_ids, bool $a_from_recovery_folder=false)
parses the objects.xml it handles the xml-description of all ilias objects
$ref_id
Definition: ltiauth.php:67
setContent(string $a_html)
Sets content for standard template.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
restoreToNewLocation(ilPropertyFormGUI $form=null)
getSavedNodeData(int $a_parent_id)
get data saved/deleted nodes
Class ilObjectGUI Basic methods of all Output classes.
static restoreObjects(int $a_cur_ref_id, array $a_ref_ids)
Move objects from trash back to repository.
Repository GUI Utilities.
showDeleteConfirmation(?array $a_ids, bool $a_supress_message=false)
ilObjectDefinition $obj_definition
setRequired(bool $a_required)
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() ...
restoreObjects(int $a_cur_ref_id, array $a_ref_ids)
Restore objects from trash.
static lookupTxtById(string $plugin_id, string $lang_var)
setSelectMode(string $a_postvar, bool $a_multi=false)
Set select mode (to deactivate, pass an empty string as postvar)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getClassByType(string $obj_type)
setCurrentBlock(string $part=self::DEFAULT_BLOCK)
Sets the template to the given block.
global $ilSetting
Definition: privfeed.php:17
__construct(Container $dic, ilPlugin $plugin)
confirmRemoveFromSystemObject(array $a_ids)
Confirmation for trash.
ilGlobalTemplateInterface $tpl
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
parseCurrentBlock(string $block_name=self::DEFAULT_BLOCK)
Parses the given block.
static _lookupType(int $id, bool $reference=false)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...