ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
class.ilMediaCastManageTableGUI.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
27 
28 class ilMediaCastManageTableGUI implements Table\DataRetrieval
29 {
30  protected $parent_obj;
31  protected ilTemplate $tpl;
33  protected \ILIAS\HTTP\Services $http;
34  protected \ILIAS\Data\Factory $df;
35  protected string $parent_cmd;
36  protected ilLanguage $lng;
38  protected bool $preview;
39  protected bool $playtime;
43 
45  protected \ILIAS\MediaObjects\MediaType\MediaTypeManager $media_type;
46  protected bool $presentation_mode;
49  protected bool $downloadable = false;
50  protected bool $edit_order;
51  protected \ILIAS\DI\UIServices $ui;
52 
53  public function __construct(
54  ilObjMediaCastGUI $parent_gui,
55  string $parent_cmd = "",
56  bool $a_edit_order = false,
57  bool $a_presentation_mode = false
58  ) {
59  global $DIC;
60 
61  $this->ctrl = $DIC->ctrl();
62  $this->lng = $DIC->language();
63  $this->access = $DIC->access();
64  $ilCtrl = $DIC->ctrl();
65  $lng = $DIC->language();
66  $this->request = $DIC->mediaCast()
67  ->internal()
68  ->gui()
69  ->standardRequest();
70  $this->ui = $DIC->ui();
71  $this->edit_order = $a_edit_order;
72  $this->presentation_mode = $a_presentation_mode;
73  $this->mediacast = $parent_gui->getObject();
74  $this->downloadable = $this->mediacast->getDownloadable();
75 
76  $this->parent_gui = $parent_gui;
77  $this->parent_cmd = $parent_cmd;
78  $this->media_type = $DIC->mediaObjects()->internal()->domain()->mediaType();
79  $this->df = new \ILIAS\Data\Factory();
80  $this->http = $DIC->http();
81 
82  $this->playtime = ($this->mediacast->getViewMode() !== ilObjMediaCast::VIEW_IMG_GALLERY);
83  $this->preview = ($this->mediacast->getViewMode() !== ilObjMediaCast::VIEW_PODCAST);
84 
85  $form_action = $this->df->uri(
86  ILIAS_HTTP_PATH . '/' .
87  $this->ctrl->getLinkTarget($this->parent_gui, $this->parent_cmd)
88  );
89  $this->url_builder = new URLBuilder($form_action);
91  $this->url_builder->acquireParameters(
92  ["mcst"], // namespace
93  "table_action", //this is the actions's parameter name
94  "ids" //this is the parameter name to be used for row-ids
95  );
96  }
97 
98  protected function getColumns(): array
99  {
100  $f = $this->ui->factory();
101  $c = $f->table()->column();
102  $columns = [
103  'title' => $c->text($this->lng->txt("title"))->withIsSortable(false),
104  'type' => $c->text($this->lng->txt("type"))->withIsSortable(false),
105  'size' => $c->text($this->lng->txt("size"))->withIsSortable(false)
106  ];
107  if ($this->playtime) {
108  $columns['playtime'] = $c->text($this->lng->txt("mcst_play_time"))->withIsSortable(false);
109  }
110  $columns['creation_date'] = $c->text($this->lng->txt("created"))->withIsSortable(false);
111  $columns['update_date'] = $c->text($this->lng->txt("last_update"))->withIsSortable(false);
112  if ($this->preview) {
113  $columns['preview'] = $c->text($this->lng->txt("preview"))->withIsSortable(false);
114  }
115 
116  return $columns;
117  }
118 
119  public function getRows(
120  Table\DataRowBuilder $row_builder,
121  array $visible_column_ids,
122  Range $range,
123  Order $order,
124  ?array $filter_data,
125  ?array $additional_parameters
126  ): \Generator {
127  $cnt = 0;
128  foreach ($this->mediacast->getSortedItemsArray() as $item) {
129  $cnt++;
130  if ($cnt < $range->getStart() || $cnt > $range->getEnd()) {
131  continue;
132  }
133 
134  $row_id = (string) $item['id'];
135  $mob = new ilObjMediaObject($item["mob_id"]);
136  $med = $mob->getMediaItem("Standard");
137 
138 
139  $data['title'] = $item["title"];
140  $data['creation_date'] = ilDatePresentation::formatDate(new ilDateTime($item["creation_date"], IL_CAL_DATETIME));
141  if ($item["update_date"] !== $item["creation_date"]) {
142  $data['update_date'] =
143  ilDatePresentation::formatDate(new ilDateTime($item["update_date"], IL_CAL_DATETIME));
144  } else {
145  $data['update_date'] = "-";
146  }
147  if ($item["playtime"] !== "00:00:00") {
148  $data['playtime'] = $item["playtime"];
149  } else {
150  $data['playtime'] = "-";
151  }
152 
153  $file = ilObjMediaObject::_lookupItemPath($med->getMobId(), false, false, "Standard");
154  if (is_file($file)) {
155  $size = filesize($file);
156  $size = sprintf("%.1f MB", $size / 1024 / 1024);
157  $data['size'] = $size;
158  } else {
159  $data['size'] = "-";
160  }
161  $data['type'] = $med->getFormat();
162  if ($mob->getVideoPreviewPic() !== "") {
163  // workaround since we dont have image columns yet
164  $image = $this->ui->factory()->image()->responsive($mob->getVideoPreviewPic(), $item["title"]);
165  $html = $this->ui->renderer()->render($image);
166  $html = str_replace("<img ", "<img style='max-width:150px;' ", $html);
167  $data['preview'] = $html;
168  } else {
169  $data['preview'] = "";
170  }
171 
172 
173  yield $row_builder->buildDataRow($row_id, $data);
174  }
175  }
176 
177  public function getTotalRowCount(
178  ?array $filter_data,
179  ?array $additional_parameters
180  ): ?int {
181  return count($this->mediacast->getSortedItemsArray());
182  }
183 
184  public function handleCommand(): void
185  {
186  $action = $this->request->getTableAction($this->action_parameter_token->getName());
187  if ($action !== "") {
188  $action .= "Object";
189  // currently done in request wrapper
190  //$ids = $this->request->getTableIds($this->row_id_token->getName());
191  $this->parent_gui->$action();
192  }
193  }
194 
195  public function get(): Table\Data
196  {
197  $f = $this->ui->factory();
198  $a = $f->table()->action();
199 
200  $form_action = $this->df->uri(
201  ILIAS_HTTP_PATH . '/' .
202  $this->ctrl->getLinkTarget($this->parent_gui, $this->parent_cmd)
203  );
204 
205  $url_builder = $this->url_builder;
206  $action_parameter_token = $this->action_parameter_token;
207  $row_id_token = $this->row_id_token;
208 
209  $actions["editCastItem"] = $a->single(
210  $this->lng->txt("edit"),
211  $url_builder->withParameter($action_parameter_token, "editCastItem"),
213  );
214 
215  $actions["showCastItem"] = $a->single(
216  $this->lng->txt("show"),
217  $url_builder->withParameter($action_parameter_token, "showCastItem"),
219  )->withAsync();
220 
221  if ($this->playtime) {
222  $actions["determinePlaytime"] = $a->single(
223  $this->lng->txt("mcst_det_playtime"),
224  $url_builder->withParameter($action_parameter_token, "determinePlaytime"),
226  );
227  }
228 
229  if ($this->downloadable) {
230  $actions["downloadItem"] = $a->single(
231  $this->lng->txt("download"),
232  $url_builder->withParameter($action_parameter_token, "downloadItem"),
234  );
235  }
236 
237  $actions["confirmItemDeletion"] = $a->standard(
238  $this->lng->txt("delete"),
239  $url_builder->withParameter($action_parameter_token, "confirmItemDeletion"),
241  )->withAsync();
242 
243  $table = $f->table()
244  ->data($this->lng->txt("mcst_items"), $this->getColumns(), $this)
245  ->withActions($actions)
246  ->withRequest($this->http->request());
247  return $table;
248  }
249 
250  protected function fillRow(array $a_set): void
251  {
252  $lng = $this->lng;
253  $ilCtrl = $this->ctrl;
254  $ilAccess = $this->access;
255  $size = 0;
256  $ui = $this->ui;
257 
258  $news_set = new ilSetting("news");
259  $enable_internal_rss = $news_set->get("enable_rss_for_internal");
260 
261  if ($this->presentation_mode) {
262  $ilCtrl->setParameterByClass("ilobjmediacastgui", "presentation", "1");
263  }
264 
265  // access
266  if ($enable_internal_rss && !$this->presentation_mode) {
267  $this->tpl->setCurrentBlock("access");
268  $this->tpl->setVariable("TXT_ACCESS", $lng->txt("news_news_item_visibility"));
269  if ($a_set["visibility"] == NEWS_PUBLIC) {
270  $this->tpl->setVariable("VAL_ACCESS", $lng->txt("news_visibility_public"));
271  } else {
272  $this->tpl->setVariable("VAL_ACCESS", $lng->txt("news_visibility_users"));
273  }
274  $this->tpl->parseCurrentBlock();
275  }
276 
277  $ilCtrl->setParameterByClass("ilobjmediacastgui", "item_id", "");
278 
279  if (ilObject::_exists($a_set["mob_id"])) {
280 
281  $mob = new ilObjMediaObject($a_set["mob_id"]);
282  $med = $mob->getMediaItem("Standard");
283 
284  $this->tpl->setVariable(
285  "VAL_DESCRIPTION",
286  $a_set["content"]
287  );
288 
289  $this->tpl->setVariable(
290  "TXT_DURATION",
291  $lng->txt("mcst_play_time")
292  );
293 
294  if (!$this->edit_order) {
295  if ($this->downloadable) {
296  $ilCtrl->setParameterByClass("ilobjmediacastgui", "item_id", $a_set["id"]);
297  // to keep always the order of the purposes
298  // iterate through purposes and display the according mediaitems
299  foreach (ilObjMediaCast::$purposes as $purpose) {
300  $a_mob = $mob->getMediaItem($purpose);
301  if (!is_object($a_mob)) {
302  continue;
303  }
304  $ilCtrl->setParameterByClass("ilobjmediacastgui", "purpose", $a_mob->getPurpose());
305  $file = ilObjMediaObject::_lookupItemPath($a_mob->getMobId(), false, false, $a_mob->getPurpose());
306  $this->tpl->setCurrentBlock("downloadable");
307  $this->tpl->setVariable("TXT_DOWNLOAD", $lng->txt("mcst_download_" . strtolower($a_mob->getPurpose())));
308  $this->tpl->setVariable("CMD_DOWNLOAD", $ilCtrl->getLinkTargetByClass("ilobjmediacastgui", "downloadItem"));
309  $this->tpl->parseCurrentBlock();
310  }
311  }
312 
313  // the news id will be used as player id, see also ilObjMediaCastGUI
314  $event_url = ($this->presentation_mode)
315  ? $ilCtrl->getLinkTarget($this->parent_obj, "handlePlayerEvent", "", true, false)
316  : "";
317  if (!is_null($med)) {
318  if ($med->getLocationType() === "Reference") {
319  $file = $med->getLocation();
320  if (in_array($med->getFormat(), ["video/vimeo", "video/youtube"])) {
321  if (!is_int(strpos($file, "?"))) {
322  $file .= "?controls=0";
323  } else {
324  $file .= "&controls=0";
325  }
326  }
327  } else {
329  ilObjMediaObject::_getURL($mob->getId()) . "/" . $med->getLocation()
330  );
331  }
332  $comp = null;
333  if ($this->media_type->isAudio($med->getFormat())) {
334  $comp = $ui->factory()->player()->audio(
335  $file,
336  ""
337  );
338  } elseif ($this->media_type->isVideo($med->getFormat())) {
339  $comp = $ui->factory()->player()->video(
340  $file
341  );
342  } elseif ($this->media_type->isImage($med->getFormat())) {
343  $comp = $ui->factory()->image()->responsive($file, "");
344  }
345  if (!is_null($comp)) {
346  $this->tpl->setVariable("PLAYER", $ui->renderer()->render($comp));
347  }
348  }
349 
350  // edit link
351  $ilCtrl->setParameterByClass("ilobjmediacastgui", "item_id", $a_set["id"]);
352  if ($ilAccess->checkAccess("write", "", $this->request->getRefId()) &&
353  !$this->presentation_mode) {
354 
355  if (!is_int(strpos($med->getFormat(), "image/"))) {
356  $this->tpl->setVariable("TXT_DET_PLAYTIME", $lng->txt("mcst_det_playtime"));
357  $this->tpl->setVariable(
358  "CMD_DET_PLAYTIME",
359  $ilCtrl->getLinkTargetByClass("ilobjmediacastgui", "determinePlaytime")
360  );
361  }
362  $this->tpl->parseCurrentBlock();
363 
364  $this->tpl->setCurrentBlock("edit_checkbox");
365  $this->tpl->setVariable("VAL_ID", $a_set["id"]);
366  $this->tpl->parseCurrentBlock();
367  // $this->tpl->touchBlock("contrl_col");
368  }
369  } else {
370  $this->tpl->setCurrentBlock("edit_order");
371  $this->tpl->setVariable("VAL_ID", $a_set["id"]);
372  $this->tpl->setVariable("VAL_ORDER", $a_set["order"]);
373  $this->tpl->parseCurrentBlock();
374  // $this->tpl->touchBlock("contrl_col");
375  }
376 
377  // download and play counter
378  if (!$this->presentation_mode) {
379  if ($a_set["mob_cnt_download"] > 0) {
380  $this->tpl->setCurrentBlock("prop");
381  $this->tpl->setVariable("TXT_PROP", $lng->txt("mcst_download_cnt"));
382  $this->tpl->setVariable("VAL_PROP", $a_set["mob_cnt_download"]);
383  $this->tpl->parseCurrentBlock();
384  }
385  if ($a_set["mob_cnt_play"] > 0) {
386  $this->tpl->setCurrentBlock("prop");
387  $this->tpl->setVariable("TXT_PROP", $lng->txt("mcst_play_cnt"));
388  $this->tpl->setVariable("VAL_PROP", $a_set["mob_cnt_play"]);
389  $this->tpl->parseCurrentBlock();
390  }
391  }
392  }
393  }
394 }
This describes a Data Table.
Definition: Data.php:31
const IL_CAL_DATETIME
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...
getRows(Table\DataRowBuilder $row_builder, array $visible_column_ids, Range $range, Order $order, ?array $filter_data, ?array $additional_parameters)
static formatDate(ilDateTime $date, bool $a_skip_day=false, bool $a_include_wd=false, bool $include_seconds=false)
__construct(ilObjMediaCastGUI $parent_gui, string $parent_cmd="", bool $a_edit_order=false, bool $a_presentation_mode=false)
getEnd()
getEnd will return the (excluded) endpoint.
Definition: Range.php:76
Both the subject and the direction need to be specified when expressing an order. ...
Definition: Order.php:12
global $DIC
Definition: feed.php:28
getTotalRowCount(?array $filter_data, ?array $additional_parameters)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static _exists(int $id, bool $reference=false, ?string $type=null)
checks if an object exists in object_data
static http()
Fetches the global http state from ILIAS.
const NEWS_PUBLIC
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
ILIAS MediaObjects MediaType MediaTypeManager $media_type
static array $purposes
static _lookupItemPath(int $a_mob_id, bool $a_url_encode=false, bool $a_web=true, string $a_purpose="")
Get path for item with specific purpose.
withParameter(URLBuilderToken $token, string|array $value)
Change an acquired parameter&#39;s value if the supplied token is valid.
Definition: URLBuilder.php:165
static signFile(string $path_to_file)
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples
static _getURL(int $a_mob_id)
get directory for files of media object
URLBuilder.
Definition: URLBuilder.php:39
A simple class to express a range of whole positive numbers.
Definition: Range.php:30