ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
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
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}
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
renderSlate(ISlate\Slate $component, $contents, RendererInterface $default_renderer)
Definition: Renderer.php:89
renderNotificationSlate(ISlate\Slate $component, RendererInterface $default_renderer)
Definition: Renderer.php:165
render(Component\Component $component, RendererInterface $default_renderer)
Definition: Renderer.php:31
registerResources(\ILIAS\UI\Implementation\Render\ResourceRegistry $registry)
Definition: Renderer.php:179
cannotHandleComponent(Component $component)
This method MUST be called by derived component renderers, if.
Definition: UI.php:24
return true
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.