ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
Renderer.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
34 
36 {
40  public function render(Component $component, RendererInterface $default_renderer): string
41  {
42  $this->checkComponent($component);
43 
44  if ($component instanceof Notification) {
45  return $this->renderNotification($component, $default_renderer);
46  } elseif ($component instanceof Group) {
47  return $this->renderGroup($component, $default_renderer);
48  } elseif ($component instanceof Standard) {
49  return $this->renderStandard($component, $default_renderer);
50  } elseif ($component instanceof Shy) {
51  return $this->renderShy($component, $default_renderer);
52  }
53  return "";
54  }
55 
56  protected function renderGroup(Group $component, RendererInterface $default_renderer): string
57  {
58  $tpl = $this->getTemplate("tpl.group.html", true, true);
59  $title = $component->getTitle();
60  $items = $component->getItems();
61 
62  // items
63  foreach ($items as $item) {
64  $tpl->setCurrentBlock("item");
65  $tpl->setVariable("ITEM", $default_renderer->render($item));
66  $tpl->parseCurrentBlock();
67  }
68 
69  if ($title != "") {
70  $tpl->setCurrentBlock("title");
71  $tpl->setVariable("TITLE", $title);
72  $tpl->parseCurrentBlock();
73  }
74 
75  // actions
76  $actions = $component->getActions();
77  if ($actions !== null) {
78  $tpl->setVariable("ACTIONS", $default_renderer->render($actions));
79  } else {
80  $tpl->setVariable("ACTIONS", "");
81  }
82 
83  return $tpl->get();
84  }
85 
86  protected function renderStandard(Item $component, RendererInterface $default_renderer): string
87  {
88  $tpl = $this->getTemplate("tpl.item_standard.html", true, true);
89 
90  $this->renderTitle($component, $default_renderer, $tpl);
91  $this->renderDescription($component, $tpl);
92  $this->renderProperties($component, $default_renderer, $tpl);
93  $this->renderAudioPlayer($component, $default_renderer, $tpl);
94  // color
95  $color = $component->getColor();
96  if ($color !== null) {
97  $tpl->setCurrentBlock("color");
98  $tpl->setVariable("COLOR", $color->asHex());
99  $tpl->parseCurrentBlock();
100  }
101 
102  // lead
103  $lead = $component->getLead();
104  $progress = $component->getProgress();
105  if ($lead != null) {
106  if (is_string($lead)) {
107  if ($progress != null) {
108  $tpl->setCurrentBlock("lead_text_with_progress");
109  $tpl->touchBlock("item_with_lead_and_progress");
110  } else {
111  $tpl->setCurrentBlock("lead_text");
112  $tpl->touchBlock("item_with_lead_only");
113  }
114  $tpl->setVariable("LEAD_TEXT", $lead);
115  $tpl->parseCurrentBlock();
116  }
117  if ($lead instanceof Image) {
118  if ($progress != null) {
119  $tpl->setCurrentBlock("lead_image_with_progress");
120  $tpl->touchBlock("item_with_lead_and_progress");
121  } else {
122  $tpl->setCurrentBlock("lead_image");
123  $tpl->touchBlock("item_with_lead_only");
124  }
125  $tpl->setVariable("LEAD_IMAGE", $default_renderer->render($lead));
126  $tpl->parseCurrentBlock();
127  }
128  if ($lead instanceof Icon || $lead instanceof Avatar) {
129  $tpl->setCurrentBlock("lead_icon");
130  $tpl->setVariable("LEAD_ICON", $default_renderer->render($lead));
131  $tpl->parseCurrentBlock();
132  $tpl->setCurrentBlock("lead_start_icon");
133  $tpl->parseCurrentBlock();
134  } else {
135  $tpl->setCurrentBlock("lead_start");
136  $tpl->parseCurrentBlock();
137  }
138  if ($progress != null && ($lead instanceof Icon || $lead instanceof Avatar)) {
139  $tpl->setCurrentBlock("progress_end_with_lead_icon");
140  $tpl->setVariable("PROGRESS", $default_renderer->render($progress));
141  $tpl->parseCurrentBlock();
142  } elseif ($progress != null) {
143  $tpl->setCurrentBlock("progress_end");
144  $tpl->setVariable("PROGRESS", $default_renderer->render($progress));
145  $tpl->parseCurrentBlock();
146  } else {
147  $tpl->touchBlock("lead_end");
148  }
149  } elseif ($progress != null) {
150  $tpl->touchBlock("item_with_progress_only");
151  $tpl->setCurrentBlock("progress_end");
152  $tpl->setVariable("PROGRESS", $default_renderer->render($progress));
153  $tpl->parseCurrentBlock();
154  }
155 
156  // main action
157  $main_action = $component->getMainAction();
158  if ($main_action !== null) {
159  $tpl->setCurrentBlock("main_action");
160  $tpl->setVariable("MAIN_ACTION", $default_renderer->render($main_action));
161  $tpl->parseCurrentBlock();
162  }
163 
164  // actions
165  $actions = $component->getActions();
166  if ($actions !== null) {
167  $tpl->setCurrentBlock("actions");
168  $tpl->setVariable("ACTIONS", $default_renderer->render($actions));
169  $tpl->parseCurrentBlock();
170  }
171 
172  return $tpl->get();
173  }
174 
175  protected function renderShy(Shy $component, RendererInterface $default_renderer): string
176  {
177  $tpl = $this->getTemplate("tpl.item_shy.html", true, true);
178 
179  $this->renderTitle($component, $default_renderer, $tpl);
180  $this->renderDescription($component, $tpl);
181 
182  if ($component->getProperties() !== []) {
183  foreach ($component->getProperties() as $name => $value) {
184  $name = htmlentities($name);
185  if ($value instanceof Button\Shy) {
186  $value = $default_renderer->render($value);
187  } else {
188  $value = htmlentities($value);
189  }
190  $tpl->setCurrentBlock("property_row");
191  $tpl->setVariable("PROP_NAME_A", $name);
192  $tpl->setVariable("PROP_VAL_A", $value);
193  $tpl->parseCurrentBlock();
194  }
195  $tpl->setCurrentBlock("properties");
196  $tpl->parseCurrentBlock();
197  }
198 
199  if ($component->getLeadIcon() !== null) {
200  $tpl->setCurrentBlock("lead_icon");
201  $tpl->setVariable("LEAD_ICON", $default_renderer->render($component->getLeadIcon()));
202  $tpl->parseCurrentBlock();
203  }
204 
205  if ($component->getClose() !== null) {
206  $tpl->setCurrentBlock("close");
207  $tpl->setVariable("CLOSE", $default_renderer->render($component->getClose()));
208  $tpl->parseCurrentBlock();
209  }
210 
211  if ($component->getOnLoadCode() !== null) {
212  $tpl->setCurrentBlock("id");
213  $tpl->setVariable('ID', $this->bindJavaScript($component));
214  $tpl->parseCurrentBlock();
215  }
216 
217  return $tpl->get();
218  }
219 
220  protected function renderNotification(Notification $component, RendererInterface $default_renderer): string
221  {
222  $tpl = $this->getTemplate("tpl.item_notification.html", true, true);
223  $this->renderTitle($component, $default_renderer, $tpl);
224  $desc = $component->getDescription();
225  if (!is_null($desc) && trim($desc) != "") {
226  $tpl->setCurrentBlock("desc");
227  $tpl->setVariable("DESC", $desc);
228  $tpl->parseCurrentBlock();
229  }
230  $this->renderProperties($component, $default_renderer, $tpl);
231  $tpl->setVariable("LEAD_ICON", $default_renderer->render($component->getLeadIcon()));
232 
233  // actions
234  $actions = $component->getActions();
235  if ($actions !== null) {
236  $tpl->setVariable("ACTIONS", $default_renderer->render($actions));
237  }
238 
239  // additional content
240  if ($component->getAdditionalContent()) {
241  $tpl->setCurrentBlock("additional_content");
242  $tpl->setVariable("ADDITIONAL_CONTENT", $default_renderer->render($component->getAdditionalContent()));
243  $tpl->parseCurrentBlock();
244  }
245 
246  // aggregate notification
247  $title = $this->getUIFactory()->button()->bulky($this->getUIFactory()->symbol()->glyph()->back(), $this->txt("back"), "");
248  $aggregates_html = $default_renderer->render(
249  $this->getUIFactory()->mainControls()->slate()->notification($default_renderer->render($title), $component->getAggregateNotifications())
250  );
251 
252  $toggleable = true;
253  if (!empty($component->getAggregateNotifications())) {
254  $toggleable = false;
255  }
256 
260  $component = $component->withAdditionalOnLoadCode(
261  fn($id) => "il.UI.item.notification.getNotificationItemObject($($id)).registerAggregates($toggleable);"
262  );
263 
264  //Bind id
265  $item_id = $this->bindJavaScript($component);
266 
267  $tpl->setCurrentBlock("aggregate_notifications");
268  $tpl->setVariable("AGGREGATES", $aggregates_html);
269  $tpl->setVariable("PARENT_ID", $item_id);
270  $tpl->parseCurrentBlock();
271 
272  // close action
273  if ($component->getCloseAction()) {
274  $url = $component->getCloseAction();
278  $close_action = $this->getUIFactory()->button()->close()->withAdditionalOnLoadCode(
279  fn($id) => "il.UI.item.notification.getNotificationItemObject($($id)).registerCloseAction('$url',1);"
280  );
281  $tpl->setVariable("CLOSE_ACTION", $default_renderer->render($close_action));
282  }
283 
284  $tpl->setCurrentBlock("id");
285  $tpl->setVariable('ID', $item_id);
286  $tpl->parseCurrentBlock();
287 
288  return $tpl->get();
289  }
290 
291  protected function renderTitle(Item $component, RendererInterface $default_renderer, Template $tpl): void
292  {
293  $title = $component->getTitle();
294  if ($title instanceof Button\Shy || $title instanceof Link) {
295  $title = $default_renderer->render($title);
296  } else {
297  $title = htmlentities($title);
298  }
299  $tpl->setVariable("TITLE", $title);
300  }
301 
302  protected function renderDescription(Item $component, Template $tpl): void
303  {
304  // description
305  $desc = $component->getDescription();
306  if (!is_null($desc) && trim($desc) != "") {
307  $tpl->setCurrentBlock("desc");
308  $tpl->setVariable("DESC", htmlentities($desc));
309  $tpl->parseCurrentBlock();
310  }
311  }
312 
313  protected function renderAudioPlayer(
314  Item $component,
315  RendererInterface $default_renderer,
316  Template $tpl
317  ): void {
318  // description
319  $audio = $component->getAudioPlayer();
320  if (!is_null($audio)) {
321  $tpl->setCurrentBlock("audio");
322  $tpl->setVariable("AUDIO", $default_renderer->render($audio));
323  $tpl->parseCurrentBlock();
324  }
325  }
326 
327  protected function renderProperties(Item $component, RendererInterface $default_renderer, Template $tpl): void
328  {
329  $props = $component->getProperties();
330  if (count($props) > 0) {
331  $cnt = 0;
332  foreach ($props as $name => $value) {
333  $name = htmlentities($name);
334  if ($value instanceof Button\Shy || $value instanceof \ILIAS\UI\Component\Symbol\Icon\Icon) {
335  $value = $default_renderer->render($value);
336  } else {
337  //Note, as soon as we got rid of all legacy ListGUI needing to render LP Icons as string, we
338  //should introduce here htmlentities
339  $value = $value;
340  }
341  $cnt++;
342  if ($cnt % 2 == 1) {
343  $tpl->setCurrentBlock("property_row");
344  $tpl->setVariable("PROP_NAME_A", $name);
345  $tpl->setVariable("PROP_VAL_A", $value);
346  } else {
347  $tpl->setVariable("PROP_NAME_B", $name);
348  $tpl->setVariable("PROP_VAL_B", $value);
349  $tpl->parseCurrentBlock();
350  }
351  }
352  if ($cnt % 2 == 1) {
353  $tpl->parseCurrentBlock();
354  }
355  $tpl->setCurrentBlock("properties");
356  $tpl->parseCurrentBlock();
357  }
358  }
359 
363  public function registerResources(ResourceRegistry $registry): void
364  {
365  parent::registerResources($registry);
366  $registry->register('./src/UI/templates/js/Item/dist/notification.js');
367  }
368 
372  protected function getComponentInterfaceName(): array
373  {
374  return [
375  Standard::class,
376  Shy::class,
377  Group::class,
378  Notification::class
379  ];
380  }
381 }
Registry for resources required by rendered output like Javascript or CSS.
getTitle()
Gets the title of the item.
getActions()
Get the actions of the item.
renderGroup(Group $component, RendererInterface $default_renderer)
Definition: Renderer.php:56
getAggregateNotifications()
Get the list of Notification Items, this Notification Item aggregates or an empty list...
This describes a symbol.
Definition: Symbol.php:29
getTitle()
Gets the title of the group.
getAdditionalContent()
Get the additional content of the item or null.
checkComponent(Component $component)
Check if a given component fits this renderer and throw if that is not the case. ...
renderShy(Shy $component, RendererInterface $default_renderer)
Definition: Renderer.php:175
Class ChatMainBarProvider .
This describes how an icon could be modified during construction of UI.
Definition: Icon.php:28
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
txt(string $id)
Get a text from the language file.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Definition: Bulky.php:21
renderAudioPlayer(Item $component, RendererInterface $default_renderer, Template $tpl)
Definition: Renderer.php:313
renderTitle(Item $component, RendererInterface $default_renderer, Template $tpl)
Definition: Renderer.php:291
setCurrentBlock(string $name)
Set the block to work on.
setVariable(string $name, $value)
Set a variable in the current block.
This describes how a letter or a picture avatar could be modified during construction of UI...
Definition: Avatar.php:28
render(Component $component, RendererInterface $default_renderer)
Definition: Renderer.php:40
Common interface to all items.
Definition: Item.php:31
getTemplate(string $name, bool $purge_unfilled_vars, bool $purge_unused_blocks)
Get template of component this renderer is made for.
getActions()
Get the actions Dropdown of the group.
getOnLoadCode()
Get the currently bound on load code.
$url
Definition: ltiregstart.php:35
getItems()
Gets item of the group.
renderStandard(Item $component, RendererInterface $default_renderer)
Definition: Renderer.php:86
getDescription()
Get the description of the item.
registerResources(ResourceRegistry $registry)
Announce resources this renderer requires.
Definition: Renderer.php:363
register(string $name)
Add a dependency.
renderDescription(Item $component, Template $tpl)
Definition: Renderer.php:302
parseCurrentBlock()
Parse the block that is currently worked on.
getProperties()
Get the properties of the appointment.
renderProperties(Item $component, RendererInterface $default_renderer, Template $tpl)
Definition: Renderer.php:327
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
getCloseAction()
Get the url attached to this Notification Item.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Definition: Factory.php:21
bindJavaScript(JavaScriptBindable $component)
Bind the component to JavaScript.