ILIAS  trunk Revision v12.0_alpha-377-g3641b37b9db
Renderer.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
24use ILIAS\UI\Renderer as RendererInterface;
29use iljQueryUtil;
30
32{
33 public const string COOKIE_NAME_SLATES_ENGAGED = 'il_mb_slates';
34
38 public function render(Component\Component $component, RendererInterface $default_renderer): string
39 {
40 if ($component instanceof Component\Layout\Page\Standard) {
41 return $this->renderStandardPage($component, $default_renderer);
42 } elseif ($component instanceof Mail) {
43 return $this->renderMailPage($component, $default_renderer);
44 }
45
46 $this->cannotHandleComponent($component);
47 }
48
49 protected function renderStandardPage(
50 Component\Layout\Page\Standard $component,
51 RendererInterface $default_renderer
52 ): string {
53 $tpl = $this->getTemplate("tpl.standardpage.html", true, true);
54
55 $tpl->setVariable('FAVICON_PATH', $component->getFaviconPath());
56
57 $id = $this->bindJavaScript($component);
58 $tpl->setVariable("ID", $id);
59
60 if ($component->hasOverlay()) {
61 $tpl->setVariable('OVERLAY', $default_renderer->render($component->getOverlay()));
62 }
63 if ($component->hasMetabar()) {
64 $tpl->setVariable('METABAR', $default_renderer->render($component->getMetabar()));
65 }
66 if ($component->hasMainbar()) {
67 $tpl->setVariable('MAINBAR', $default_renderer->render($component->getMainbar()));
68 // There is a roadmap entry for this.
69 $slates_cookie = $_COOKIE[self::COOKIE_NAME_SLATES_ENGAGED] ?? '';
70 if ($slates_cookie && json_decode($slates_cookie, true)['engaged']) {
71 $tpl->touchBlock('slates_engaged');
72 }
73 }
74 if ($component->hasModeInfo()) {
75 $tpl->setVariable('MODEINFO', $default_renderer->render($component->getModeInfo()));
76 }
77 if ($component->hasSystemInfos()) {
78 $tpl->setVariable('SYSTEMINFOS', $default_renderer->render($component->getSystemInfos()));
79 }
80
81 $breadcrumbs = $component->getBreadcrumbs();
82 if ($breadcrumbs && $breadcrumbs->getItems()) {
83 $tpl->setVariable('BREADCRUMBS', $default_renderer->render($breadcrumbs));
84
85 $dropdown = $this->convertBreadcrumbsToDropdownLocator($breadcrumbs);
86 $tpl->setVariable('HEADER_BREADCRUMBS', $default_renderer->render($dropdown));
87 }
88 if ($component->hasLogo()) {
89 $tpl->setVariable('LOGO', $default_renderer->render($component->getLogo()));
90 }
91 if ($component->hasResponsiveLogo()) {
92 $tpl->setVariable('RESPONSIVE_LOGO', $default_renderer->render($component->getResponsiveLogo()));
93 } elseif ($component->hasLogo()) {
94 $tpl->setVariable('RESPONSIVE_LOGO', $default_renderer->render($component->getLogo()));
95 }
96
97 $tpl->setVariable("TITLE", $component->getTitle());
98 $tpl->setVariable("SHORT_TITLE", $component->getShortTitle());
99 $tpl->setVariable("VIEW_TITLE", $component->getViewTitle());
100 $tpl->setVariable("LANGUAGE", $this->getLangKey());
101 $tpl->setVariable("TEXT_DIRECTION", $component->getTextDirection());
102 $tpl->setVariable('CONTENT', $default_renderer->render($component->getContent()));
103
104 if ($component->hasFooter()) {
105 $tpl->setVariable('FOOTER', $default_renderer->render($component->getFooter()));
106 }
107
108 if ($component->getWithHeaders()) {
109 $tpl = $this->setHeaderVars($tpl, $component->getIsUIDemo());
110 }
111
112 $tpl->setVariable('META_DATA', $this->getDataFactory()->htmlMetadata()->collection(
113 $component->getMetaData()
114 )->toHtml());
115
116 return $tpl->get();
117 }
118
119 protected function renderMailPage(
120 Mail $component,
121 RendererInterface $default_renderer
122 ): string {
123
124 $tpl = $this->getTemplate('tpl.mailpage.html', true, true);
125
126 $tpl->setVariable('LOGO_SRC', $component->getLogoURL());
127 $tpl->setVariable('INSTALLATION_TITLE', $component->getInstallationTitle());
128 $tpl->setVariable('CONTENT', $default_renderer->render($component->getContent()));
129 $tpl->setVariable('FOOTER_URL', $default_renderer->render($this->getUIFactory()->link()->standard($component->getFooterURL()->getLabel(), $component->getFooterURL()->getURL()->getBaseURI())));
130 $tpl->setVariable('CSS_CONTENT', file_get_contents($component->getStyleSheetPath()) ?: '');
131
132 return $tpl->get();
133 }
134
137 ): Component\Dropdown\Dropdown {
138 $f = $this->getUIFactory();
139 $buttons = [];
140 $items = array_reverse($breadcrumbs->getItems());
141 $current = array_shift($items);
142 foreach ($items as $item) {
143 $button = $f->button()->shy(
144 $item->getLabel(),
145 $item->getAction()
146 );
147 $buttons[] = $button;
148 }
149 return $f->dropdown()->standard($buttons)->withLabel($current->getLabel());
150 }
151
158 protected function setHeaderVars(Template $tpl, bool $for_ui_demo = false): Template
159 {
160 global $DIC;
161 $il_tpl = $DIC["tpl"] ?? null;
162
163 $js_files = [];
164 $js_inline = [];
165 $css_files = [];
166 $css_inline = [];
167
168 if ($il_tpl instanceof ilGlobalPageTemplate) {
169 $layout = $DIC->globalScreen()->layout();
170 foreach ($layout->meta()->getJs()->getItemsInOrderOfDelivery() as $js) {
171 $js_files[] = $js->getContent();
172 }
173 foreach ($layout->meta()->getCss()->getItemsInOrderOfDelivery() as $css) {
174 $css_files[] = ['file' => $css->getContent(), 'media' => $css->getMedia()];
175 }
176 foreach ($layout->meta()->getInlineCss()->getItemsInOrderOfDelivery() as $inline_css) {
177 $css_inline[] = $inline_css->getContent();
178 }
179 foreach ($layout->meta()->getOnloadCode()->getItemsInOrderOfDelivery() as $on_load_code) {
180 $js_inline[] = $on_load_code->getContent();
181 }
182 }
183
184 if ($for_ui_demo) {
185 $additional_js_files = [
187 'assets/js/Basic.js',
188 './assets/js/jquery.js',
189 './assets/js/jquery-migrate.min.js',
190 ];
191
192 array_unshift($js_files, ...$additional_js_files);
193
194 $css_files[] = ['file' => './assets/css/delos.css'];
195 }
196
197 foreach ($js_files as $js_file) {
198 $tpl->setCurrentBlock("js_file");
199 $tpl->setVariable("JS_FILE", $js_file);
200 $tpl->parseCurrentBlock();
201 }
202 foreach ($css_files as $css_file) {
203 $tpl->setCurrentBlock("css_file");
204 $tpl->setVariable("CSS_FILE", $css_file['file']);
205 $tpl->parseCurrentBlock();
206 }
207
208 $tpl->setVariable("CSS_INLINE", implode(PHP_EOL, $css_inline));
209 $tpl->setVariable("OLCODE", implode(PHP_EOL, $js_inline));
210
211 return $tpl;
212 }
213
217 public function registerResources(ResourceRegistry $registry): void
218 {
219 parent::registerResources($registry);
220 $registry->register('assets/js/stdpage.js');
221 }
222}
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
setHeaderVars(Template $tpl, bool $for_ui_demo=false)
When rendering the whole page, all resources must be included.
Definition: Renderer.php:158
convertBreadcrumbsToDropdownLocator(Component\Breadcrumbs\Breadcrumbs $breadcrumbs)
Definition: Renderer.php:135
render(Component\Component $component, RendererInterface $default_renderer)
Definition: Renderer.php:38
renderStandardPage(Component\Layout\Page\Standard $component, RendererInterface $default_renderer)
Definition: Renderer.php:49
renderMailPage(Mail $component, RendererInterface $default_renderer)
Definition: Renderer.php:119
registerResources(ResourceRegistry $registry)
Announce resources this renderer requires.
Definition: Renderer.php:217
cannotHandleComponent(Component $component)
This method MUST be called by derived component renderers, if.
bindJavaScript(JavaScriptBindable $component)
Bind the component to JavaScript.
getTemplate(string $name, bool $purge_unfilled_vars, bool $purge_unused_blocks)
Get template of component this renderer is made for.
return true
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getLocaljQueryPath()
This describes the Page.
Definition: Page.php:31
Registry for resources required by rendered output like Javascript or CSS.
register(string $name)
Add a dependency.
Interface to templating as it is used in the UI framework.
Definition: Template.php:29
setVariable(string $name, $value)
Set a variable in the current block.
setCurrentBlock(string $name)
Set the block to work on.
parseCurrentBlock()
Parse the block that is currently worked on.
An entity that renders components to a string output.
Definition: Renderer.php:31
RFC 822 Email address list validation Utility.
global $DIC
Definition: shib_login.php:26
$_COOKIE[session_name()]
Definition: xapitoken.php:52