ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
GroupingRetrieval.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
27 use Generator;
30 use ilObject;
33 use ilLanguage;
36 
37 use function ILIAS\UI\examples\Deck\user;
38 
40 {
41  public function __construct(
42  protected int $content_obj_id,
43  protected ilLanguage $lng,
44  protected UIFactory $ui_factory,
45  protected DataFactory $data_factory,
46  protected StaticURL $static_url
47  ) {
48  }
49 
50  public function getRows(
51  DataRowBuilder $row_builder,
52  array $visible_column_ids,
53  Range $range,
54  Order $order,
55  ?array $filter_data,
56  ?array $additional_parameters
57  ): Generator {
58  $grouping_ids = $this->getAllGroupingIDs();
59 
60  $records = [];
61  foreach ($grouping_ids as $grouping_id) {
62  $grouping = new ilObjCourseGrouping($grouping_id);
63  $record = [];
64 
65  $record[GroupingHandler::COL_TITLE] = $grouping->getTitle();
66  $record[GroupingHandler::COL_DESCRIPTION] = $grouping->getDescription();
67 
68  $link = $this->buildLinkToObject($grouping->getContainerRefId());
69  if ($link !== null) {
70  $record[GroupingHandler::COL_SOURCE] = $link;
71  }
72 
73  $record[GroupingHandler::COL_UNIQUE_FIELD] = $this->lng->txt($grouping->getUniqueField());
74 
75  $condition_ref_ids = [];
76  foreach ($grouping->getAssignedItems() as $condition) {
77  $condition_ref_ids[] = $condition['target_ref_id'];
78  }
79  $record[GroupingHandler::COL_ASSIGNED_OBJS] = $this->buildLinkListing(...$condition_ref_ids);
80 
81  $records[$grouping->getId()] = $record;
82  }
83 
84  $records = $this->sortRecords($records, $order);
85  $records = array_slice($records, $range->getStart(), $range->getLength(), true);
86 
87  foreach ($records as $id => $record) {
88  yield $row_builder->buildDataRow((string) $id, $record);
89  }
90  }
91 
95  public function getAllGroupingIDs(): array
96  {
97  return ilObjCourseGrouping::_getVisibleGroupings($this->content_obj_id);
98  }
99 
100  public function getTotalRowCount(?array $filter_data, ?array $additional_parameters): ?int
101  {
102  return count($this->getAllGroupingIDs());
103  }
104 
105  protected function buildLinkToObject(int $ref_id): ?StandardLink
106  {
107  $ref_id = $this->data_factory->refId($ref_id);
108  if (ilObject::_exists($ref_id->toInt(), true)) {
109  $type = ilObject::_lookupType($ref_id->toInt(), true);
110  $title = ilObject::_lookupTitle($ref_id->toObjectId()->toInt());
111  $link = $this->static_url->builder()->build($type, $ref_id);
112  return $this->ui_factory->link()->standard($title, (string) $link);
113  }
114  return null;
115  }
116 
117  protected function buildLinkListing(int ...$ref_ids): UnorderedListing
118  {
119  $links = [];
120  foreach ($ref_ids as $ref_id) {
121  $link = $this->buildLinkToObject($ref_id);
122  if ($link !== null) {
123  $links[] = $link;
124  }
125  }
126  return $this->ui_factory->listing()->unordered($links);
127  }
128 
129  protected function sortRecords(array $records, Order $order): array
130  {
131  $order_field = array_keys($order->get())[0] ?? GroupingHandler::COL_TITLE;
132  $order_direction = $order->get()[$order_field] ?? Order::ASC;
133 
134  $ordering_callable_without_direction = match ($order_field) {
136  fn($a, $b) => $a[$order_field] ?? '' <=> $b[$order_field] ?? '',
138  fn($a, $b) => $a[GroupingHandler::COL_SOURCE]?->getLabel() ?? '' <=> $b[GroupingHandler::COL_SOURCE]?->getLabel() ?? '',
140  function ($a, $b) {
141  $a_items = ($a[GroupingHandler::COL_ASSIGNED_OBJS] ?? null)?->getItems() ?? [];
142  $b_items = ($b[GroupingHandler::COL_ASSIGNED_OBJS] ?? null)?->getItems() ?? [];
143  $a_first_item_label = ($a_items[0] ?? null)?->getLabel() ?? '';
144  $b_first_item_label = ($b_items[0] ?? null)?->getLabel() ?? '';
145  return $a_first_item_label <=> $b_first_item_label;
146  }
147  };
148  $ordering_callable = fn($a, $b) => $order_direction === Order::ASC ?
149  $ordering_callable_without_direction($a, $b) :
150  $ordering_callable_without_direction($b, $a);
151 
152  uasort($records, $ordering_callable);
153  return $records;
154  }
155 }
user()
description: > Example for rendering a user card
Definition: user.php:34
static _getVisibleGroupings(int $a_obj_id)
Returns a list of all groupings for which the current user hast write permission on all assigned obje...
Both the subject and the direction need to be specified when expressing an order. ...
Definition: Order.php:28
buildDataRow(string $id, array $record)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
$static_url
Definition: goto.php:29
getTotalRowCount(?array $filter_data, ?array $additional_parameters)
Mainly for the purpose of pagination-support, it is important to know about the total number of recor...
static _exists(int $id, bool $reference=false, ?string $type=null)
checks if an object exists in object_data
$ref_id
Definition: ltiauth.php:65
static _lookupTitle(int $obj_id)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
__construct(protected int $content_obj_id, protected ilLanguage $lng, protected UIFactory $ui_factory, protected DataFactory $data_factory, protected StaticURL $static_url)
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
global $lng
Definition: privfeed.php:31
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples
getRows(DataRowBuilder $row_builder, array $visible_column_ids, Range $range, Order $order, ?array $filter_data, ?array $additional_parameters)
This is called by the table to retrieve rows; map data-records to rows using the $row_builder e...
static _lookupType(int $id, bool $reference=false)
A simple class to express a naive range of whole positive numbers.
Definition: Range.php:28