ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
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;
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
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 {
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}
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
$location
Definition: buildRTE.php:22
const IL_SCREEN_CENTER
static sortArray(array $array, string $a_array_sortby_key, string $a_array_sortorder="asc", bool $a_numeric=false, bool $a_keep_keys=false)
This class represents a block method of a block.
ilAccessHandler $access
ilLanguage $lng
setTitle(string $a_title)
ilTemplate $tpl
ilGlobalTemplateInterface $main_tpl
Classification block, displayed in different contexts, e.g.
ILIAS Container Classification ClassificationManager $classification
isRepositoryObject()
Returns whether block has a corresponding repository object.
initProviders(bool $a_check_post=false)
getSubItemIds(array $obj_ids)
Get sub item ids depending on container type that match the preselected object ids.
static getValidProviders(int $a_parent_ref_id, int $a_parent_obj_id, string $a_parent_obj_type)
Get all valid providers (for parent container)
getCmd(?string $fallback_command=null)
@inheritDoc
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...
parses the objects.xml it handles the xml-description of all ilias objects
Preloader for object list GUIs.
static _lookupType(int $id, bool $reference=false)
static _lookupObjId(int $ref_id)
PathGUI which handles materials assigned to sessions.
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
Tree class data representation in hierachical trees using the Nested Set Model with Gaps by Joe Celco...
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.
getChilds(int $a_node_id, string $a_order="", string $a_direction="ASC")
get child nodes of given node
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
static getSystemMessageHTML(string $a_txt, string $a_type="info")
Get HTML for a system message.
exit
$service
Definition: ltiresult.php:36
$provider
Definition: ltitoken.php:80
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
global $DIC
Definition: shib_login.php:26