ILIAS  trunk Revision v11.0_alpha-1715-g7fc467680fb
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
Renderer.php
Go to the documentation of this file.
1 <?php
2 
20 
25 
27 {
31  public function render(Component\Component $component, RendererInterface $default_renderer): string
32  {
33  if (!$component instanceof ISlate\Slate) {
34  $this->cannotHandleComponent($component);
35  }
36 
37  switch (true) {
38  case ($component instanceof ISlate\Notification):
39  return $this->renderNotificationSlate($component, $default_renderer);
40  break;
41 
42  case ($component instanceof ISlate\Combined):
43  case ($component instanceof ISlate\Drilldown):
44  $contents = $this->getCombinedSlateContents($component);
45  break;
46 
47  default:
48  $contents = $component->getContents();
49  }
50 
51  return $this->renderSlate($component, $contents, $default_renderer);
52  }
53 
54  protected function getCombinedSlateContents(
55  ISlate\Slate $component
56  ): array {
57  $f = $this->getUIFactory();
58  $contents = [];
59  foreach ($component->getContents() as $entry) {
60  if ($entry instanceof ISlate\Slate && !$entry instanceof ISlate\Notification) {
61  $trigger_signal = $entry->getToggleSignal();
62  $triggerer = $f->button()->bulky($entry->getSymbol(), $entry->getName(), '#')
63  ->withOnClick($trigger_signal)
64  ->withHelpTopics(...$entry->getHelpTopics())
65  ;
66 
67  $mb_id = $entry->getMainBarTreePosition();
68  if ($mb_id) {
69  $trigger_signal = $component->getTriggerSignal($mb_id);
70  $triggerer = $triggerer
71  ->withOnClick($trigger_signal)
72  ->withAdditionalOnLoadCode(
73  fn($id) => "
74  il.UI.maincontrols.mainbar.addTriggerSignal('{$trigger_signal}');
75  il.UI.maincontrols.mainbar.addPartIdAndEntry('{$mb_id}', 'triggerer', '{$id}');
76  "
77  );
78  }
79  $contents[] = [$triggerer, $entry];
80  } elseif ($component instanceof ISlate\Drilldown) {
81  $contents[] = $entry->withPersistenceId($component->getMainBarTreePosition());
82  } else {
83  $contents[] = $entry;
84  }
85  }
86  return $contents;
87  }
88 
89  protected function renderSlate(
90  ISlate\Slate $component,
91  $contents,
92  RendererInterface $default_renderer
93  ): string {
94  $tpl = $this->getTemplate("Slate/tpl.slate.html", true, true);
95 
96  foreach ($contents as $content) {
97  $content_html = $default_renderer->render($content);
98  if ($content instanceof Component\Button\Button
99  || $content instanceof Component\Link\Link
100  || $content instanceof Component\Divider\Horizontal
101  || is_array($content)
102  ) {
103  $tpl->setCurrentBlock("list_content_component");
104  $tpl->setVariable("LIST_COMPONENT_CONTENT", $content_html);
105  } else {
106  $tpl->setCurrentBlock("none_list_content_component");
107  $tpl->setVariable("NONE_LIST_COMPONENT_CONTENT", $content_html);
108  }
109  $tpl->parseCurrentBlock();
110  }
111 
112 
113  $aria_role = $component->getAriaRole();
114  if ($aria_role != null) {
115  $tpl->setCurrentBlock("with_aria_role");
116  $tpl->setVariable("ARIA_ROLE", $aria_role);
117  $tpl->parseCurrentBlock();
118  }
119 
120  if ($component->getEngaged()) {
121  $tpl->touchBlock('engaged');
122  } else {
123  $tpl->touchBlock('disengaged');
124  }
125 
126  $slate_signals = [
127  'toggle' => $component->getToggleSignal(),
128  'engage' => $component->getEngageSignal(),
129  'replace' => $component->getReplaceSignal()
130  ];
131 
132  $mb_id = $component->getMainBarTreePosition();
133 
134  if ($mb_id) {
135  $tpl->setVariable('TREE_DEPTH', $component->getMainBarTreeDepth());
136  }
137 
138  $component = $component->withAdditionalOnLoadCode(
139  function ($id) use ($slate_signals, $mb_id): string {
140  $js = "";
141  foreach ($slate_signals as $key => $signal) {
142  $js .= "$(document).on('{$signal}', function(event, signalData) {
143  il.UI.maincontrols.slate.onSignal('{$key}',
144  event,
145  signalData,
146  '{$id}'
147  );
148  return false;});";
149  }
150 
151  if ($mb_id) {
152  $js .= "il.UI.maincontrols.mainbar.addPartIdAndEntry('{$mb_id}', 'slate', '{$id}');";
153  }
154 
155 
156  return $js;
157  }
158  );
159  $id = $this->bindJavaScript($component);
160  $tpl->setVariable('ID', $id);
161 
162  return $tpl->get();
163  }
164 
165  protected function renderNotificationSlate(
166  ISlate\Slate $component,
167  RendererInterface $default_renderer
168  ): string {
169  $contents = $component->getContents();
170  $tpl = $this->getTemplate("Slate/tpl.notification.html", true, true);
171  $tpl->setVariable('NAME', $component->getName());
172  $tpl->setVariable('CONTENTS', $default_renderer->render($contents));
173  return $tpl->get();
174  }
175 
179  public function registerResources(\ILIAS\UI\Implementation\Render\ResourceRegistry $registry): void
180  {
181  parent::registerResources($registry);
182  $registry->register('assets/js/maincontrols.min.js');
183  }
184 }
Registry for resources required by rendered output like Javascript or CSS.
Interface Observer Contains several chained tasks and infos about them.
renderNotificationSlate(ISlate\Slate $component, RendererInterface $default_renderer)
Definition: Renderer.php:165
renderSlate(ISlate\Slate $component, $contents, RendererInterface $default_renderer)
Definition: Renderer.php:89
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
getTemplate(string $name, bool $purge_unfilled_vars, bool $purge_unused_blocks)
Get template of component this renderer is made for.
cannotHandleComponent(Component $component)
This method MUST be called by derived component renderers, if.
render(Component\Component $component, RendererInterface $default_renderer)
Definition: Renderer.php:31
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Definition: Combined.php:21
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
registerResources(\ILIAS\UI\Implementation\Render\ResourceRegistry $registry)
Definition: Renderer.php:179
bindJavaScript(JavaScriptBindable $component)
Bind the component to JavaScript.