ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
class.ilClassificationBlockGUI.php
Go to the documentation of this file.
1 <?php
2 
20 
27 {
28  protected \ILIAS\Container\Classification\ClassificationManager $classification;
31  protected ilTree $tree;
32  protected string $parent_obj_type;
33  protected int $parent_obj_id;
34  protected int $parent_ref_id;
35  protected array $providers;
36  protected array $item_list_gui;
37  protected static array $providers_cache;
38 
39  public function __construct()
40  {
41  global $DIC;
42 
43  $service = $DIC->container()->internal();
44 
45  $domain = $service->domain();
46  $gui = $service->gui();
47 
48  $this->lng = $domain->lng();
49  $this->obj_definition = $domain->objectDefinition();
50  $this->tree = $domain->repositoryTree();
51  $this->access = $domain->access();
52 
53  $this->ctrl = $gui->ctrl();
54 
56 
57  $this->parent_ref_id = $this->requested_ref_id;
58  $this->parent_obj_id = ilObject::_lookupObjId($this->parent_ref_id);
59  $this->parent_obj_type = ilObject::_lookupType($this->parent_obj_id);
60 
61  $this->lng->loadLanguageModule("classification");
62  $this->setTitle($this->lng->txt("clsfct_block_title"));
63 
64  $this->cl_request = $gui->classification()->standardRequest();
65 
66  $this->classification = $domain->classification($this->parent_ref_id);
67  }
68 
69  public function getBlockType(): string
70  {
71  return 'clsfct';
72  }
73 
74  protected function isRepositoryObject(): bool
75  {
76  return false;
77  }
78 
79  public function executeCommand(): void
80  {
81  $ilCtrl = $this->ctrl;
82 
83  $cmd = $ilCtrl->getCmd();
84  $next_class = $ilCtrl->getNextClass($this);
85 
86  switch ($next_class) {
87  default:
88  // explorer call
89  if ($ilCtrl->isAsynch() && $cmd != "getAjax" && $cmd != "filterContainer") {
90  $this->getHTML();
91  } else {
92  $this->$cmd();
93  }
94  break;
95  }
96  }
97 
98  public static function getScreenMode(): string
99  {
100  global $DIC;
101 
102  $ilCtrl = $DIC->ctrl();
103 
104  if ($ilCtrl->isAsynch()) {
105  return "";
106  }
107 
108  switch ($ilCtrl->getCmd()) {
109  case "filterContainer":
110  return IL_SCREEN_CENTER;
111  }
112  return "";
113  }
114 
115  public function getHTML(): string
116  {
117  $this->initProviders();
118 
119  if (!$this->validate()) {
120  return "";
121  }
122  //$module = '<script type="module" src="../components/ILIAS/Container/resources/ilClassification.js"></script>';
123  $module = '<script type="module" src="./assets/js/ilClassification.js"></script>';
124 
125  return parent::getHTML() . $module;
126  }
127 
128  public function getAjax(): void
129  {
131 
132  $this->initProviders(true);
133 
134  echo $this->getHTML();
135  echo $tpl->getOnLoadCodeForAsynch();
136 
137  exit();
138  }
139 
140  protected function getLegacyContent(): string
141  {
143 
144  $ilCtrl = $this->ctrl;
145 
146  $html = array();
147  foreach ($this->providers as $provider) {
148  $provider->render($html, $this);
149  }
150 
151  // $this->tpl->setVariable("BLOCK_ROW", "");
152 
153  $ajax_block_id = "block_" . $this->getBlockType() . "_0";
154  $ajax_block_url = $ilCtrl->getLinkTarget($this, "getAjax", "", true, false);
155  $ajax_content_id = "il_center_col";
156  $ajax_content_url = $ilCtrl->getLinkTarget($this, "filterContainer", "", true, false);
157 
158  $tabs = new ilTabsGUI();
159  $tabs->setBackTarget($this->lng->txt("clsfct_back_to_cat"), $ilCtrl->getLinkTarget($this, "returnToParent"));
160  $tabs->addTab("sel_objects", $this->lng->txt("clsfct_selected_objects"), "#");
161  $tabs_html = $tabs->getHTML();
162 
163 
164  // #15008 - always load regardless of content (because of redraw)
165  /*$tpl->addOnLoadCode('il.Classification.setAjax("' . $ajax_block_id . '", "' .
166  $ajax_block_url . '", "' . $ajax_content_id . '", "' . $ajax_content_url . '", ' . json_encode($tabs_html) . ');');*/
167 
168  $overall_html = "";
169  if (sizeof($html)) {
170  $btpl = new ilTemplate("tpl.classification_block.html", true, true, "components/ILIAS/Container/Classification");
171 
172  foreach ($html as $item) {
173  $btpl->setCurrentBlock("provider_chunk_bl");
174  $btpl->setVariable("TITLE", $item["title"]);
175  $btpl->setVariable("CHUNK", $item["html"]);
176  $btpl->parseCurrentBlock();
177  }
178 
179  $btpl->setVariable("AJAX_BLOCK_ID", $ajax_block_id);
180  $btpl->setVariable("AJAX_BLOCK_URL", $ajax_block_url);
181  $btpl->setVariable("AJAX_CONTENT_ID", $ajax_content_id);
182  $btpl->setVariable("AJAX_CONTENT_URL", $ajax_content_url);
183  $btpl->setVariable("TABS_HTML", json_encode($tabs_html));
184 
185  $overall_html .= $btpl->get();
186  //$this->tpl->setVariable("DATA", $btpl->get());
187  }
188  return $overall_html;
189  }
190 
191  protected function returnToParent(): void
192  {
193  $this->classification->clearSelection();
194  $this->ctrl->returnToParent($this);
195  }
196 
197  protected function validate(): bool
198  {
199  return sizeof($this->providers);
200  }
201 
202  protected function filterContainer(): void
203  {
204  $objDefinition = $this->obj_definition;
205  $lng = $this->lng;
206  $tree = $this->tree;
207  $ilAccess = $this->access;
209 
210  $this->initProviders();
211 
212  // empty selection is invalid
213  if ($this->classification->isEmptySelection()) {
214  exit();
215  }
216 
217  $all_matching_provider_object_ids = null;
218  $no_provider = true;
219  foreach ($this->providers as $provider) {
220  $id = get_class($provider);
221  $current = $this->classification->getSelectionOfProvider($id);
222  if ($current) {
223  $no_provider = false;
224  // combine providers AND
225  $provider_object_ids = $provider->getFilteredObjects();
226  if (isset($all_matching_provider_object_ids)) {
227  $all_matching_provider_object_ids = array_intersect($all_matching_provider_object_ids, $provider_object_ids);
228  } else {
229  $all_matching_provider_object_ids = $provider_object_ids;
230  }
231  }
232  }
233  $has_content = false;
234 
235 
236  $ltpl = new ilTemplate("tpl.classification_object_list.html", true, true, "components/ILIAS/Container/Classification");
237 
238  if (isset($all_matching_provider_object_ids) && sizeof($all_matching_provider_object_ids)) {
239  $fields = array(
240  "object_reference.ref_id"
241  ,"object_data.obj_id"
242  ,"object_data.type"
243  ,"object_data.title"
244  ,"object_data.description"
245  );
246  // see #28883 (tags + filter still work on current level only)
247  // see also JF comment on https://docu.ilias.de/goto.php?target=wiki_1357_Tagging_in_Categories
248  $matching = $tree->getSubTreeFilteredByObjIds(
249  $this->parent_ref_id,
250  $all_matching_provider_object_ids,
251  $fields
252  );
253  //$matching = $this->getSubItemIds($all_matching_provider_object_ids);
254  if (sizeof($matching)) {
255  $valid_objects = array();
256 
258 
259  foreach ($matching as $item) {
260  if ($item["ref_id"] != $this->parent_ref_id &&
261  !$tree->isDeleted($item["ref_id"]) &&
262  $ilAccess->checkAccess("visible", "", $item["ref_id"])) {
263  // group all valid items in blocks
264  // by their parent group/course or category
265  $block_ref_id = 0;
266  $block_title = "";
267  foreach ($tree->getPathFull($item["ref_id"]) as $p) {
268  if (in_array($p["type"], array("root", "cat", "crs", "grp"))) {
269  $block_ref_id = $p["ref_id"];
270  $block_title = $p["title"];
271  }
272  }
273  if ($block_ref_id > 0) {
274  if (!isset($valid_objects[$block_ref_id])) {
275  $valid_objects[$block_ref_id] = array(
276  "title" => $block_title,
277  "items" => array()
278  );
279  }
280  $valid_objects[$block_ref_id]["items"][] = $item;
281  }
282 
283  $preloader->addItem($item["obj_id"], $item["type"], $item["ref_id"]);
284  }
285  }
286  $valid_objects = ilArrayUtil::sortArray($valid_objects, "title", "asc", false, true);
287  if (sizeof($valid_objects)) {
288  $has_content = true;
289 
290  $preloader->preload();
291 
292  $this->item_list_gui = array();
293  foreach ($valid_objects as $block) {
294  $items = ilArrayUtil::sortArray($block["items"], "title", "asc", false, true);
295  foreach ($items as $obj) {
296  $type = $obj["type"];
297 
298  // get list gui class for each object type
299  if (empty($this->item_list_gui[$type])) {
300  $class = $objDefinition->getClassName($type);
301  $location = $objDefinition->getLocation($type);
302 
303  $full_class = "ilObj" . $class . "ListGUI";
304 
305  $this->item_list_gui[$type] = new $full_class();
306  $this->item_list_gui[$type]->enableDelete(false);
307  $this->item_list_gui[$type]->enablePath(
308  true,
309  $this->parent_ref_id,
311  );
312  $this->item_list_gui[$type]->enableLinkedPath(true);
313  $this->item_list_gui[$type]->enableCut(false);
314  $this->item_list_gui[$type]->enableCopy(false);
315  $this->item_list_gui[$type]->enableSubscribe(false);
316  $this->item_list_gui[$type]->enableLink(false);
317  $this->item_list_gui[$type]->enableIcon(true);
318 
319  // :TOOD: for each item or just for each list?
320  foreach ($this->providers as $provider) {
321  $provider->initListGUI($this->item_list_gui[$type]);
322  }
323  }
324 
325  $html = $this->item_list_gui[$type]->getListItemHTML(
326  $obj["ref_id"],
327  $obj["obj_id"],
328  $obj["title"],
329  $obj["description"]
330  );
331 
332  if ($html != "") {
333  $ltpl->setCurrentBlock("res_row");
334  $ltpl->setVariable("RESOURCE_HTML", $html);
335  $ltpl->parseCurrentBlock();
336  }
337  }
338  $ltpl->setCurrentBlock("block");
339  $ltpl->setVariable("BLOCK_TITLE", $block["title"]);
340  $ltpl->parseCurrentBlock();
341  }
342  }
343  }
344  }
345 
346  // if nothing has been selected reload to category page
347  if ($no_provider) {
348  echo "<span id='block_" . $this->getBlockType() . "_0_loader'></span>";
349  //echo "<script>il.Classification.returnToParent();</script>";
350  echo "<script>document.location.reload();</script>";
351  //$this->ctrl->redirect($this->returnToParent());
352  exit();
353  }
354 
355  if ($has_content) {
356  echo $ltpl->get();
357  } else {
358  //$content_block->setContent($lng->txt("clsfct_content_no_match"));
359  echo ilUtil::getSystemMessageHTML($lng->txt("clsfct_content_no_match"), "info");
360  }
361 
362  exit();
363  }
364 
365  protected function initProviders(bool $a_check_post = false): void
366  {
367  if (!isset(self::$providers_cache[$this->parent_ref_id])) {
369  $this->parent_ref_id,
370  $this->parent_obj_id,
371  $this->parent_obj_type
372  );
373  }
374  $this->providers = self::$providers_cache[$this->parent_ref_id];
375  if ($a_check_post && !$this->cl_request->getRedraw()) {
376  foreach ($this->providers as $provider) {
377  $id = get_class($provider);
378  $current = $provider->importPostData(
379  $this->classification->getSelectionOfProvider($id)
380  );
381  if (is_array($current) || $current) {
382  $this->classification->setSelectionOfProvider($id, $current);
383  }
384  }
385  }
386 
387  foreach ($this->providers as $provider) {
388  $id = get_class($provider);
389  $current = $this->classification->getSelectionOfProvider($id);
390  if ($current) {
391  $provider->setSelection($current);
392  }
393  }
394  }
395 
396  protected function toggle(): void
397  {
398  $this->initProviders(true);
399  $this->ctrl->returnToParent($this);
400  }
401 
407  protected function getSubItemIds(array $obj_ids): array
408  {
409  $tree = $this->tree;
410  if (ilObject::_lookupType($this->parent_ref_id, true) == "cat") {
411  $matching = array_filter($tree->getChilds($this->parent_ref_id), function ($item) use ($obj_ids) {
412  return in_array($item["obj_id"], $obj_ids);
413  });
414  } else {
415  $fields = array(
416  "object_reference.ref_id"
417  ,"object_data.obj_id"
418  ,"object_data.type"
419  ,"object_data.title"
420  ,"object_data.description"
421  );
422  $matching = $tree->getSubTreeFilteredByObjIds($this->parent_ref_id, $obj_ids, $fields);
423  }
424 
425  return $matching;
426  }
427 }
getSubItemIds(array $obj_ids)
Get sub item ids depending on container type that match the preselected object ids.
ILIAS Container Classification ClassificationManager $classification
static getSystemMessageHTML(string $a_txt, string $a_type="info")
Get HTML for a system message.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
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...
ilLanguage $lng
$location
Definition: buildRTE.php:22
getChilds(int $a_node_id, string $a_order="", string $a_direction="ASC")
get child nodes of given node
getCmd(?string $fallback_command=null)
isDeleted(int $a_node_id)
This is a wrapper for isSaved() with a more useful name.
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...
static _lookupObjId(int $ref_id)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
Classification block, displayed in different contexts, e.g.
$provider
Definition: ltitoken.php:80
ilGlobalTemplateInterface $main_tpl
getSubTreeFilteredByObjIds(int $a_node_id, array $a_obj_ids, array $a_fields=[])
get all node ids in the subtree under specified node id, filter by object ids
ilTemplate $tpl
global $DIC
Definition: shib_login.php:26
const IL_SCREEN_CENTER
PathGUI which handles materials assigned to sessions.
exit
initProviders(bool $a_check_post=false)
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
__construct(Container $dic, ilPlugin $plugin)
setTitle(string $a_title)
This class represents a block method of a block.
ilAccessHandler $access
static _lookupType(int $id, bool $reference=false)
static getValidProviders(int $a_parent_ref_id, int $a_parent_obj_id, string $a_parent_obj_type)
Get all valid providers (for parent container)
$service
Definition: ltiservices.php:40
static sortArray(array $array, string $a_array_sortby_key, string $a_array_sortorder="asc", bool $a_numeric=false, bool $a_keep_keys=false)