ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
class.ilBadgeImageTemplateTableGUI.php
Go to the documentation of this file.
1 <?php
2 
18 declare(strict_types=1);
19 
20 namespace ILIAS\Badge;
21 
27 use ilLanguage;
34 use Generator;
39 
41 {
42  private readonly Factory $factory;
43  private readonly Renderer $renderer;
44  private readonly \ILIAS\Refinery\Factory $refinery;
46  private readonly Services $http;
47  private readonly ilLanguage $lng;
48  private readonly ilGlobalTemplateInterface $tpl;
50  private ?array $cached_records = null;
51 
52  public function __construct(protected bool $has_write = false)
53  {
54  global $DIC;
55  $this->lng = $DIC->language();
56  $this->tpl = $DIC->ui()->mainTemplate();
57  $this->factory = $DIC->ui()->factory();
58  $this->renderer = $DIC->ui()->renderer();
59  $this->refinery = $DIC->refinery();
60  $this->request = $DIC->http()->request();
61  $this->http = $DIC->http();
62  }
63 
67  private function getRecords(): array
68  {
69  if ($this->cached_records !== null) {
70  return $this->cached_records;
71  }
72 
73  $modal_container = new ModalBuilder();
74  $rows = [];
75 
76  foreach (ilBadgeImageTemplate::getInstances() as $template) {
77  $image = '';
78  $title = $template->getTitle();
79 
80  $image_src = $template->getImageFromResourceId();
81  if ($image_src !== '') {
82  $image_component = $this->factory->image()->responsive(
83  $image_src,
84  $template->getTitle()
85  );
86  $image_html = $this->renderer->render($image_component);
87 
88  $image_src_large = $template->getImageFromResourceId(
90  );
91  $large_image_component = $this->factory->image()->responsive(
92  $image_src_large,
93  $template->getTitle()
94  );
95 
96  $modal = $modal_container->constructModal($large_image_component, $template->getTitle());
97 
98  $image = implode('', [
99  $modal_container->renderShyButton($image_html, $modal),
100  $modal_container->renderModal($modal)
101  ]);
102  $title = $modal_container->renderShyButton($template->getTitle(), $modal);
103  }
104 
105  $rows[] = [
106  'id' => $template->getId(),
107  'image' => $image,
108  'title' => $title,
109  'title_sortable' => $template->getTitle()
110  ];
111  }
112 
113  $this->cached_records = $rows;
114 
115  return $rows;
116  }
117 
118  public function getRows(
119  DataRowBuilder $row_builder,
120  array $visible_column_ids,
121  Range $range,
122  Order $order,
123  ?array $filter_data,
124  ?array $additional_parameters
125  ): Generator {
126  $records = $this->getRecords();
127 
128  if ($order) {
129  [$order_field, $order_direction] = $order->join(
130  [],
131  fn($ret, $key, $value) => [$key, $value]
132  );
133 
134  usort($records, static function (array $left, array $right) use ($order_field): int {
135  if ($order_field === 'title') {
136  return \ilStr::strCmp(
137  $left[$order_field . '_sortable'],
138  $right[$order_field . '_sortable']
139  );
140  }
141 
142  return $left[$order_field] <=> $right[$order_field];
143  });
144 
145  if ($order_direction === Order::DESC) {
146  $records = array_reverse($records);
147  }
148  }
149 
150  if ($range) {
151  $records = \array_slice($records, $range->getStart(), $range->getLength());
152  }
153 
154  foreach ($records as $record) {
155  yield $row_builder->buildDataRow((string) $record['id'], $record);
156  }
157  }
158 
159  public function getTotalRowCount(
160  ?array $filter_data,
161  ?array $additional_parameters
162  ): ?int {
163  return \count($this->getRecords());
164  }
165 
169  public function getColumns(): array
170  {
171  return [
172  'image' => $this->factory->table()->column()->text($this->lng->txt('image'))->withIsSortable(false),
173  'title' => $this->factory->table()->column()->text($this->lng->txt('title'))
174  ];
175  }
176 
180  private function getActions(
181  URLBuilder $url_builder,
182  URLBuilderToken $action_parameter_token,
183  URLBuilderToken $row_id_token
184  ): array {
185  return $this->has_write ? [
186  'badge_image_template_edit' => $this->factory->table()->action()->single(
187  $this->lng->txt('edit'),
188  $url_builder->withParameter($action_parameter_token, 'badge_image_template_editImageTemplate'),
189  $row_id_token
190  ),
191  'badge_image_template_delete' =>
192  $this->factory->table()->action()->standard(
193  $this->lng->txt('delete'),
194  $url_builder->withParameter($action_parameter_token, 'badge_image_template_delete'),
195  $row_id_token
196  )
197  ] : [];
198  }
199 
200  public function renderTable(string $url): void
201  {
202  $df = new \ILIAS\Data\Factory();
203 
204  $table_uri = $df->uri($url);
205  $url_builder = new URLBuilder($table_uri);
206  $query_params_namespace = ['tid'];
207 
208  [$url_builder, $action_parameter_token, $row_id_token] = $url_builder->acquireParameters(
209  $query_params_namespace,
210  'table_action',
211  'id',
212  );
213 
214  $table = $this->factory
215  ->table()
216  ->data($this->lng->txt('badge_image_templates'), $this->getColumns(), $this)
217  ->withId(self::class)
218  ->withOrder(new Order('title', Order::ASC))
219  ->withActions($this->getActions($url_builder, $action_parameter_token, $row_id_token))
220  ->withRequest($this->request);
221 
222  $out = [$table];
223  $query = $this->http->wrapper()->query();
224  if ($query->has('tid')) {
225  $query_values = $query->retrieve(
226  'tid',
227  $this->refinery->kindlyTo()->listOf($this->refinery->kindlyTo()->string())
228  );
229 
230  $items = [];
231  if ($query_values === ['ALL_OBJECTS']) {
232  foreach (ilBadgeImageTemplate::getInstances() as $template) {
233  if ($template->getId() !== null) {
234  $items[] = $this->factory->modal()->interruptiveItem()->keyValue(
235  (string) $template->getId(),
236  (string) $template->getId(),
237  $template->getTitle()
238  );
239  }
240  }
241  } elseif (\is_array($query_values)) {
242  foreach ($query_values as $id) {
243  $badge = new ilBadgeImageTemplate((int) $id);
244  $items[] = $this->factory->modal()->interruptiveItem()->keyValue(
245  (string) $id,
246  (string) $badge->getId(),
247  $badge->getTitle()
248  );
249  }
250  } else {
251  $badge = new ilBadgeImageTemplate($query_values);
252  $items[] = $this->factory->modal()->interruptiveItem()->keyValue(
253  (string) $badge->getId(),
254  (string) $badge->getId(),
255  $badge->getTitle()
256  );
257  }
258  if ($query->has($action_parameter_token->getName())) {
259  $action = $query->retrieve($action_parameter_token->getName(), $this->refinery->kindlyTo()->string());
260  if ($action === 'badge_image_template_delete') {
261  $this->http->saveResponse(
262  $this->http
263  ->response()
264  ->withBody(
265  Streams::ofString($this->renderer->renderAsync([
266  $this->factory->modal()->interruptive(
267  $this->lng->txt('badge_deletion'),
268  $this->lng->txt('badge_deletion_confirmation'),
269  '#'
270  )->withAffectedItems($items)
271  ]))
272  )
273  );
274  $this->http->sendResponse();
275  $this->http->close();
276  }
277  }
278  }
279 
280  $this->tpl->setContent($this->renderer->render($out));
281  }
282 }
getActions(URLBuilder $url_builder, URLBuilderToken $action_parameter_token, URLBuilderToken $row_id_token)
getRows(DataRowBuilder $row_builder, array $visible_column_ids, Range $range, Order $order, ?array $filter_data, ?array $additional_parameters)
$url
Definition: shib_logout.php:63
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 http()
Fetches the global http state from ILIAS.
$out
Definition: buildRTE.php:24
global $DIC
Definition: shib_login.php:25
readonly ServerRequestInterface RequestInterface $request
static ofString(string $string)
Creates a new stream with an initial value.
Definition: Streams.php:41
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:24
const DESC
Definition: Order.php:15