ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
class.ItemSetManager.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
21 namespace ILIAS\Container\Content;
22 
24 
30 {
31  public const FLAT = 0;
32  public const TREE = 1;
33  public const SINGLE = 2;
35  protected bool $admin_mode;
36  protected bool $hiddenfilesfound = false;
37  protected string $parent_type;
38  protected int $parent_obj_id;
39 
40  protected int $parent_ref_id = 0;
41  protected int $single_ref_id = 0;
43  protected array $raw = [];
44  protected array $raw_by_type = [];
46  protected array $rendered = [];
47  protected int $mode = self::FLAT;
49  protected bool $initialised = false;
50 
54  public function __construct(
55  InternalDomainService $domain,
56  int $mode,
57  int $parent_ref_id,
58  ?\ilContainerUserFilter $user_filter = null,
59  int $single_ref_id = 0,
60  bool $admin_mode = false,
61  bool $force_session_order_by_date = true
62  ) {
63  $this->parent_ref_id = $parent_ref_id;
64  $this->parent_obj_id = \ilObject::_lookupObjId($this->parent_ref_id);
65  $this->parent_type = \ilObject::_lookupType($this->parent_obj_id);
66  $this->user_filter = $user_filter;
67  $this->force_session_order_by_date = $force_session_order_by_date;
68 
69  $this->single_ref_id = $single_ref_id;
70  $this->domain = $domain;
71  $this->mode = $mode; // might be refactored as subclasses
72  $this->admin_mode = $admin_mode;
73  $this->init();
74  }
75 
76  public function setHiddenFilesFound(bool $a_hiddenfilesfound): void
77  {
78  $this->hiddenfilesfound = $a_hiddenfilesfound;
79  }
80 
81  public function getHiddenFilesFound(): bool
82  {
84  }
85 
89  protected function init(): void
90  {
91  if ($this->initialised) {
92  return;
93  }
94  $tree = $this->domain->repositoryTree();
95  if ($this->mode === self::TREE) {
96  $this->raw = $tree->getSubTree($tree->getNodeData($this->parent_ref_id));
97  } elseif ($this->mode === self::FLAT) {
98  $this->raw = $tree->getChilds($this->parent_ref_id, "title");
99  } else {
100  $this->raw[] = $tree->getNodeData($this->single_ref_id);
101  }
102  $this->applyUserFilter();
103  $this->getCompleteDescriptions();
104  $this->applyClassificationFilter();
106  $this->applySorting();
107  $this->groupItems();
108  $this->sortSessions();
109  $this->preloadAdvancedMDValues();
110  $this->initialised = true;
111  }
112 
116  public function hasItems(): bool
117  {
118  $this->init();
119  return count($this->raw) > 0;
120  }
121 
122  public function getRefIdsOfType(string $type): array
123  {
124  $this->init();
125  if (isset($this->raw_by_type[$type])) {
126  return array_map(static function ($item) {
127  return (int) $item["child"];
128  }, $this->raw_by_type[$type]);
129  }
130  return [];
131  }
132 
133  public function getAllRefIds(): array
134  {
135  $this->init();
136  return array_keys($this->raw_by_type["_all"]);
137  }
138 
139  public function getRawDataByRefId(int $ref_id): ?array
140  {
141  $this->init();
142  return $this->raw_by_type["_all"][$ref_id] ?? null;
143  }
144 
145  public function isSideBlockItem(int $ref_id): bool
146  {
147  $this->init();
148  $type = $this->raw_by_type["_all"][$ref_id]["type"] ?? "";
149  $obj_definition = $this->domain->objectDefinition();
150  return $obj_definition->isSideBlock($type);
151  }
152 
153  protected function applySorting(): void
154  {
155  $sort = \ilContainerSorting::_getInstance($this->parent_obj_id);
156  $all = $sort->sortItems(["all" => $this->raw]);
157  $this->raw = $all["all"];
158  //$this->raw_by_type = $sort->sortItems($this->raw_by_type);
159  }
160 
164  protected function groupItems(): void
165  {
166  $obj_definition = $this->domain->objectDefinition();
167  $classification_filter_active = $this->isClassificationFilterActive();
168  $this->raw_by_type["_all"] = [];
169  foreach ($this->raw as $key => $object) {
170 
171  // hide object types in devmode
172  if ($object["type"] === "adm" || $object["type"] === "rolf" ||
173  $obj_definition->getDevMode($object["type"])) {
174  continue;
175  }
176 
177  // remove inactive plugins
178  if ($obj_definition->isInactivePlugin($object["type"])) {
179  continue;
180  }
181 
182  // BEGIN WebDAV: Don't display hidden Files, Folders and Categories
183  if (in_array($object['type'], array('file','fold','cat'))) {
184  if (\ilObjFileAccess::_isFileHidden($object['title'])) {
185  $this->setHiddenFilesFound(true);
186  if (!$this->admin_mode) {
187  continue;
188  }
189  }
190  }
191  // END WebDAV: Don't display hidden Files, Folders and Categories
192 
193  // group object type groups together (e.g. learning resources)
194  $type = $obj_definition->getGroupOfObj($object["type"]);
195  if ($type == "") {
196  $type = $object["type"];
197  }
198 
199  $new_key = (int) $object["child"];
200  $this->rendered[$new_key] = false;
201  $this->raw_by_type[$type][$new_key] = $object;
202 
203  $this->raw_by_type["_all"][$new_key] = $object;
204  if ($object["type"] !== "sess") {
205  $this->raw_by_type["_non_sess"][$new_key] = $object;
206  }
207  }
208  }
209 
210  protected function sortSessions(): void
211  {
212  if (!$this->force_session_order_by_date) {
213  return;
214  }
215  if (isset($this->raw_by_type["sess"]) && count($this->raw_by_type["sess"]) > 0) {
216  $this->raw_by_type["sess"] = \ilArrayUtil::sortArray($this->raw_by_type["sess"], 'start', 'ASC', true, true);
217  }
218  }
219 
220  protected function getAdditionalSubItemInformation(): void
221  {
222  foreach ($this->raw as $key => $object) {
223  $this->addAdditionalSubItemInformationToObject($this->raw[$key]);
224  }
225  }
226 
227  protected function addAdditionalSubItemInformationToObject(array &$object): void
228  {
230  }
231 
235  public function isClassificationFilterActive(): bool
236  {
237  // apply container classification filters
238  $classification = $this->domain->classification($this->parent_ref_id);
240  $this->parent_ref_id,
241  $this->parent_obj_id,
242  $this->parent_type
243  ) as $class_provider) {
244  $id = get_class($class_provider);
245  $current = $classification->getSelectionOfProvider($id);
246  if ($current) {
247  return true;
248  }
249  }
250  return false;
251  }
252 
253 
258  protected function applyUserFilter(): void
259  {
260  if (is_null($this->user_filter)) {
261  return;
262  }
263  $filter = $this->domain->content()->filter(
264  $this->raw,
265  $this->user_filter,
267  $this->parent_obj_id,
268  "filter_show_empty",
269  "0"
270  )
271  );
272  $this->raw = $filter->apply();
273  }
274 
278  protected function getCompleteDescriptions(): void
279  {
280  $ilSetting = $this->domain->settings();
281  $ilObjDataCache = $this->domain->objectDataCache();
282 
283  // using long descriptions?
284  $short_desc = $ilSetting->get("rep_shorten_description");
285  $short_desc_max_length = (int) $ilSetting->get("rep_shorten_description_length");
286  if (!$short_desc || $short_desc_max_length != \ilObject::DESC_LENGTH) {
287  // using (part of) shortened description
288  if ($short_desc && $short_desc_max_length && $short_desc_max_length < \ilObject::DESC_LENGTH) {
289  foreach ($this->raw as $key => $object) {
290  $this->raw[$key]["description"] = \ilStr::shortenTextExtended(
291  $object["description"],
292  $short_desc_max_length,
293  true
294  );
295  }
296  }
297  // using (part of) long description
298  else {
299  $obj_ids = array();
300  foreach ($this->raw as $key => $object) {
301  $obj_ids[] = $object["obj_id"];
302  }
303  if (count($obj_ids) > 0) {
304  $long_desc = \ilObject::getLongDescriptions($obj_ids);
305  foreach ($this->raw as $key => $object) {
306  // #12166 - keep translation, ignore long description
307  if ($ilObjDataCache->isTranslatedDescription((int) $object["obj_id"])) {
308  $long_desc[$object["obj_id"]] = $object["description"];
309  }
310  if ($short_desc && $short_desc_max_length) {
311  $long_desc[$object["obj_id"]] = \ilStr::shortenTextExtended(
312  (string) ($long_desc[$object["obj_id"]] ?? ""),
313  $short_desc_max_length,
314  true
315  );
316  }
317  $this->raw[$key]["description"] = $long_desc[$object["obj_id"]] ?? '';
318  }
319  }
320  }
321  }
322  }
323 
327  protected function applyClassificationFilter(): void
328  {
329  // apply container classification filters
330  $classification = $this->domain->classification($this->parent_ref_id);
332  $this->parent_ref_id,
333  $this->parent_obj_id,
334  $this->parent_type
335  ) as $class_provider) {
336  $id = get_class($class_provider);
337  $current = $classification->getSelectionOfProvider($id);
338  if ($current) {
339  $class_provider->setSelection($current);
340  $filtered = $class_provider->getFilteredObjects();
341  $this->raw = array_filter($this->raw, static function ($i) use ($filtered) {
342  return (is_array($filtered) && in_array($i["obj_id"], $filtered));
343  });
344  }
345  }
346  }
347 
348  protected function preloadAdvancedMDValues(): void
349  {
350  $obj_ids = [];
351  foreach ($this->raw_by_type["_all"] as $object) {
352  $obj_ids[] = $object["obj_id"];
353  }
355  }
356 }
static preloadByObjIds(array $a_obj_ids)
Preload list gui data.
const DESC_LENGTH
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static _isFileHidden(string $a_file_name)
Returns true, if a file with the specified name, is usually hidden from the user. ...
static _lookupObjId(int $ref_id)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
static getLongDescriptions(array $obj_ids)
$ref_id
Definition: ltiauth.php:65
__construct(InternalDomainService $domain, int $mode, int $parent_ref_id, ?\ilContainerUserFilter $user_filter=null, int $single_ref_id=0, bool $admin_mode=false, bool $force_session_order_by_date=true)
applyUserFilter()
Apply container user filter on objects.
$classification
static addAdditionalSubItemInformation(array &$item)
Parse item data for list entries.
global $ilSetting
Definition: privfeed.php:31
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
static shortenTextExtended(string $a_str, int $a_len, bool $a_dots=false, bool $a_next_blank=false, bool $a_keep_extension=false)
static _getInstance(int $a_obj_id)
static _lookupContainerSetting(int $a_id, string $a_keyword, ?string $a_default_value=null)
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)
static sortArray(array $array, string $a_array_sortby_key, string $a_array_sortorder="asc", bool $a_numeric=false, bool $a_keep_keys=false)