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