2 declare(strict_types = 1);
19 use Psr\Http\Message\ResponseInterface;
20 use Psr\Http\Message\ServerRequestInterface;
21 use Psr\Http\Server\RequestHandlerInterface as PsrRequestHandlerInterface;
73 public function handleRequest(ServerRequestInterface $request): ResponseInterface
75 return $this->
handle($request);
87 $originalGetParameters = $request->getAttribute(
'_originalGetParameters',
null);
88 if ($originalGetParameters !==
null && !empty($_GET) && $_GET !== $originalGetParameters) {
91 if (!empty($modifiedGetParameters)) {
92 $queryParams = array_replace_recursive($modifiedGetParameters, $request->getQueryParams());
93 $request = $request->withQueryParams($queryParams);
95 $this->timeTracker->setTSlogMessage(
'GET parameters have been modified during Request building in a hook.');
99 $originalPostParameters = $request->getAttribute(
'_originalPostParameters',
null);
100 if ($request->getMethod() ===
'POST' && $originalPostParameters !==
null && !empty($_POST) && $_POST !== $originalPostParameters) {
103 if (!empty($modifiedPostParameters)) {
104 $parsedBody = array_replace_recursive($modifiedPostParameters, $request->getParsedBody());
105 $request = $request->withParsedBody($parsedBody);
107 $this->timeTracker->setTSlogMessage(
'POST parameters have been modified during Request building in a hook.');
124 if ($request->getQueryParams() !== $_GET) {
125 $queryParams = $request->getQueryParams();
126 $_GET = $queryParams;
129 if ($request->getMethod() ===
'POST') {
130 $parsedBody = $request->getParsedBody();
131 if (is_array($parsedBody) && $parsedBody !== $_POST) {
132 $_POST = $parsedBody;
143 public function handle(ServerRequestInterface $request): ResponseInterface
146 $this->timeTracker = GeneralUtility::makeInstance(TimeTracker::class);
155 if ($controller->isGeneratePage()) {
156 $this->timeTracker->push(
'Page generation');
157 $controller->generatePage_preProcessing();
158 $controller->preparePageContentGeneration($request);
161 $this->timeTracker->incStackPointer();
162 $this->timeTracker->push($controller->sPre,
'PAGE');
165 if ($controller->config[
'config'][
'disableAllHeaderCode'] ??
false) {
171 $this->timeTracker->pull($this->timeTracker->LR ? $controller->content :
'');
172 $this->timeTracker->decStackPointer();
174 $controller->setAbsRefPrefix();
175 $controller->generatePage_postProcessing();
176 $this->timeTracker->pull();
178 $controller->releaseLocks();
181 if ($controller->isINTincScript()) {
182 if (!$controller->isGeneratePage()) {
184 $controller->preparePageContentGeneration($request);
186 $this->timeTracker->push(
'Non-cached objects');
187 $controller->INTincScript();
188 $this->timeTracker->pull();
195 $isOutputting = $controller->isOutputting();
197 $this->timeTracker->push(
'Print Content');
198 $response = $controller->applyHttpHeadersToResponse($response);
199 $controller->processContentForOutput();
200 $this->timeTracker->pull();
203 $controller->fe_user->storeSessionData();
206 $redirectResponse = $controller->redirectToExternalUrl(
true);
207 if ($redirectResponse instanceof ResponseInterface) {
208 $controller->sendHttpHeadersDirectly();
209 return $redirectResponse;
213 $GLOBALS[
'TYPO3_MISC'][
'microtime_end'] = microtime(
true);
214 if ($isOutputting && ($controller->config[
'config'][
'debug'] ?? !empty(
$GLOBALS[
'TYPO3_CONF_VARS'][
'FE'][
'debug']))) {
215 $response = $response->withHeader(
'X-TYPO3-Parsetime', $this->timeTracker->getParseTime() .
'ms');
220 $controller->previewInfo(
true);
223 $_params = [
'pObj' => &$controller];
224 foreach (
$GLOBALS[
'TYPO3_CONF_VARS'][
'SC_OPTIONS'][
'tslib/class.tslib_fe.php'][
'hook_eofe'] ?? [] as $_funcRef) {
225 GeneralUtility::callUserFunction($_funcRef, $_params, $controller);
229 $this->timeTracker->pull();
232 $response->getBody()->write($controller->content);
246 $pageContent = $controller->cObj->cObjGet($controller->pSetup) ?:
'';
247 if ($controller->pSetup[
'wrap'] ??
false) {
248 $pageContent = $controller->cObj->wrap($pageContent, $controller->pSetup[
'wrap']);
250 if ($controller->pSetup[
'stdWrap.'] ??
false) {
251 $pageContent = $controller->cObj->stdWrap($pageContent, $controller->pSetup[
'stdWrap.']);
270 if ($controller->config[
'config'][
'moveJsFromHeaderToFooter'] ??
false) {
271 $pageRenderer->enableMoveJsFromHeaderToFooter();
273 if ($controller->config[
'config'][
'pageRendererTemplateFile'] ??
false) {
275 $file = GeneralUtility::makeInstance(FilePathSanitizer::class)->sanitize($controller->config[
'config'][
'pageRendererTemplateFile']);
276 $pageRenderer->setTemplateFile($file);
281 $headerComment = trim($controller->config[
'config'][
'headerComment'] ??
'');
282 if ($headerComment) {
283 $pageRenderer->addInlineComment(
"\t" . str_replace(LF, LF .
"\t", $headerComment) . LF);
286 $theCharset = $controller->metaCharset;
288 $controller->content =
'';
289 $htmlTagAttributes = [];
290 $htmlLang = $controller->config[
'config'][
'htmlTag_langKey'] ?? ($controller->sys_language_isocode ?:
'en');
291 $direction = $controller->config[
'config'][
'htmlTag_dir'] ??
null;
292 if ($siteLanguage !==
null) {
298 $htmlTagAttributes[
'dir'] = htmlspecialchars($direction);
304 switch ((
string)($controller->config[
'config'][
'xmlprologue'] ??
'')) {
306 $xmlDocument =
false;
309 $docTypeParts[] =
'<?xml version="1.0" encoding="' . $theCharset .
'"?>';
312 $docTypeParts[] =
'<?xml version="1.1" encoding="' . $theCharset .
'"?>';
315 if ($controller->xhtmlVersion) {
316 $docTypeParts[] =
'<?xml version="1.0" encoding="' . $theCharset .
'"?>';
318 $xmlDocument =
false;
322 $docTypeParts[] = $controller->config[
'config'][
'xmlprologue'];
325 $doctype = $controller->config[
'config'][
'doctype'] ??
null;
329 $docTypeParts[] =
'<!DOCTYPE html
330 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
331 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
334 $docTypeParts[] =
'<!DOCTYPE html
335 PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
336 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
339 $docTypeParts[] =
'<!DOCTYPE html
340 PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN"
341 "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">';
344 $docTypeParts[] =
'<!DOCTYPE html
345 PUBLIC "-//W3C//DTD XHTML 1.1//EN"
346 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">';
348 case 'xhtml+rdfa_10':
349 $docTypeParts[] =
'<!DOCTYPE html
350 PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN"
351 "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">';
354 $docTypeParts[] =
'<!DOCTYPE html>';
356 $pageRenderer->setMetaCharsetTag(
'<meta charset="|" />');
358 $pageRenderer->setMetaCharsetTag(
'<meta charset="|">');
364 $docTypeParts[] = $doctype;
367 $docTypeParts[] =
'<!DOCTYPE html>';
369 $pageRenderer->setMetaCharsetTag(
'<meta charset="|" />');
371 $pageRenderer->setMetaCharsetTag(
'<meta charset="|">');
374 if ($controller->xhtmlVersion) {
375 $htmlTagAttributes[
'xml:lang'] = $htmlLang;
377 if ($controller->xhtmlVersion < 110 || $doctype ===
'html5') {
378 $htmlTagAttributes[
'lang'] = $htmlLang;
380 if ($controller->xhtmlVersion || $doctype ===
'html5' && $xmlDocument) {
382 $htmlTagAttributes[
'xmlns'] =
'http://www.w3.org/1999/xhtml';
383 if (is_array($controller->config[
'config'][
'namespaces.'])) {
384 foreach ($controller->config[
'config'][
'namespaces.'] as $prefix => $uri) {
386 $htmlTagAttributes[
'xmlns:' . htmlspecialchars($prefix)] = $uri;
391 if ($controller->config[
'config'][
'doctypeSwitch'] ??
false) {
392 $docTypeParts = array_reverse($docTypeParts);
395 if (!empty($docTypeParts)) {
396 $pageRenderer->setXmlPrologAndDocType(implode(LF, $docTypeParts));
399 $htmlTag = $this->
generateHtmlTag($htmlTagAttributes, $controller->config[
'config'] ?? [], $controller->cObj);
400 $pageRenderer->setHtmlTag($htmlTag);
402 $headTag = $controller->pSetup[
'headTag'] ??
'<head>';
403 if (isset($controller->pSetup[
'headTag.'])) {
404 $headTag = $controller->cObj->stdWrap($headTag, $controller->pSetup[
'headTag.']);
406 $pageRenderer->setHeadTag($headTag);
408 $pageRenderer->setCharSet($theCharset);
409 $pageRenderer->addInlineComment(
' This website is powered by TYPO3 - inspiring people to share!
410 TYPO3 is a free open source Content Management Framework initially created by Kasper Skaarhoj and licensed under GNU/GPL.
411 TYPO3 is copyright ' . TYPO3_copyright_year .
' of Kasper Skaarhoj. Extensions are copyright of their respective owners.
412 Information and contribution at ' . TYPO3_URL_GENERAL .
'
414 if ($controller->baseUrl) {
415 $pageRenderer->setBaseUrl($controller->baseUrl);
417 if ($controller->pSetup[
'shortcutIcon'] ??
false) {
419 $favIcon = GeneralUtility::makeInstance(FilePathSanitizer::class)->sanitize($controller->pSetup[
'shortcutIcon']);
421 if ($iconFileInfo->isFile()) {
422 $iconMimeType = $iconFileInfo->getMimeType();
424 $iconMimeType =
' type="' . $iconMimeType .
'"';
425 $pageRenderer->setIconMimeType($iconMimeType);
434 if (isset($controller->tmpl->setup[
'plugin.']) && is_array($controller->tmpl->setup[
'plugin.'])) {
435 $stylesFromPlugins =
'';
436 foreach ($controller->tmpl->setup[
'plugin.'] as $key => $iCSScode) {
437 if (is_array($iCSScode)) {
438 if ($iCSScode[
'_CSS_DEFAULT_STYLE'] && empty($controller->config[
'config'][
'removeDefaultCss'])) {
439 if (isset($iCSScode[
'_CSS_DEFAULT_STYLE.'])) {
440 $cssDefaultStyle = $controller->cObj->stdWrap($iCSScode[
'_CSS_DEFAULT_STYLE'], $iCSScode[
'_CSS_DEFAULT_STYLE.']);
442 $cssDefaultStyle = $iCSScode[
'_CSS_DEFAULT_STYLE'];
444 $stylesFromPlugins .=
'/* default styles for extension "' . substr($key, 0, -1) .
'" */' . LF . $cssDefaultStyle . LF;
446 if ($iCSScode[
'_CSS_PAGE_STYLE'] && empty($controller->config[
'config'][
'removePageCss'])) {
447 $cssPageStyle = implode(LF, $iCSScode[
'_CSS_PAGE_STYLE']);
448 if (isset($iCSScode[
'_CSS_PAGE_STYLE.'])) {
449 $cssPageStyle = $controller->cObj->stdWrap($cssPageStyle, $iCSScode[
'_CSS_PAGE_STYLE.']);
451 $cssPageStyle =
'/* specific page styles for extension "' . substr($key, 0, -1) .
'" */' . LF . $cssPageStyle;
456 if (!empty($stylesFromPlugins)) {
463 if (isset($controller->pSetup[
'includeCSS.']) && is_array($controller->pSetup[
'includeCSS.'])) {
464 foreach ($controller->pSetup[
'includeCSS.'] as $key => $CSSfile) {
465 if (!is_array($CSSfile)) {
466 $cssFileConfig = &$controller->pSetup[
'includeCSS.'][$key .
'.'];
467 if (isset($cssFileConfig[
'if.']) && !$controller->cObj->checkIf($cssFileConfig[
'if.'])) {
470 if ($cssFileConfig[
'external']) {
474 $ss = GeneralUtility::makeInstance(FilePathSanitizer::class)->sanitize($CSSfile);
480 if ($cssFileConfig[
'import']) {
481 if (!$cssFileConfig[
'external'] && $ss[0] !==
'/') {
483 $ss = GeneralUtility::dirname(GeneralUtility::getIndpEnv(
'SCRIPT_NAME')) .
'/' . $ss;
485 $cssMedia = !empty($cssFileConfig[
'media']) ?
' ' . htmlspecialchars($cssFileConfig[
'media']) :
'';
486 $pageRenderer->addCssInlineBlock(
'import_' . $key,
'@import url("' . htmlspecialchars($ss) .
'")' . $cssMedia .
';', empty($cssFileConfig[
'disableCompression']), (
bool)$cssFileConfig[
'forceOnTop']);
488 $pageRenderer->addCssFile(
490 $cssFileConfig[
'alternate'] ?
'alternate stylesheet' :
'stylesheet',
491 $cssFileConfig[
'media'] ?:
'all',
492 $cssFileConfig[
'title'] ?:
'',
493 $cssFileConfig[
'external'] || (
bool)$cssFileConfig[
'inline'] ?
false : empty($cssFileConfig[
'disableCompression']),
494 (
bool)$cssFileConfig[
'forceOnTop'],
495 $cssFileConfig[
'allWrap'],
496 (
bool)$cssFileConfig[
'excludeFromConcatenation'] || (
bool)$cssFileConfig[
'inline'],
497 $cssFileConfig[
'allWrap.'][
'splitChar'],
498 $cssFileConfig[
'inline']
500 unset($cssFileConfig);
506 if (isset($controller->pSetup[
'includeCSSLibs.']) && is_array($controller->pSetup[
'includeCSSLibs.'])) {
507 foreach ($controller->pSetup[
'includeCSSLibs.'] as $key => $CSSfile) {
508 if (!is_array($CSSfile)) {
509 $cssFileConfig = &$controller->pSetup[
'includeCSSLibs.'][$key .
'.'];
510 if (isset($cssFileConfig[
'if.']) && !$controller->cObj->checkIf($cssFileConfig[
'if.'])) {
513 if ($cssFileConfig[
'external']) {
517 $ss = GeneralUtility::makeInstance(FilePathSanitizer::class)->sanitize($CSSfile);
523 if ($cssFileConfig[
'import']) {
524 if (!$cssFileConfig[
'external'] && $ss[0] !==
'/') {
526 $ss = GeneralUtility::dirname(GeneralUtility::getIndpEnv(
'SCRIPT_NAME')) .
'/' . $ss;
528 $cssMedia = !empty($cssFileConfig[
'media']) ?
' ' . htmlspecialchars($cssFileConfig[
'media']) :
'';
529 $pageRenderer->addCssInlineBlock(
'import_' . $key,
'@import url("' . htmlspecialchars($ss) .
'")' . $cssMedia .
';', empty($cssFileConfig[
'disableCompression']), (
bool)$cssFileConfig[
'forceOnTop']);
531 $pageRenderer->addCssLibrary(
533 $cssFileConfig[
'alternate'] ?
'alternate stylesheet' :
'stylesheet',
534 $cssFileConfig[
'media'] ?:
'all',
535 $cssFileConfig[
'title'] ?:
'',
536 $cssFileConfig[
'external'] || (
bool)$cssFileConfig[
'inline'] ?
false : empty($cssFileConfig[
'disableCompression']),
537 (
bool)$cssFileConfig[
'forceOnTop'],
538 $cssFileConfig[
'allWrap'],
539 (
bool)$cssFileConfig[
'excludeFromConcatenation'] || (
bool)$cssFileConfig[
'inline'],
540 $cssFileConfig[
'allWrap.'][
'splitChar'],
541 $cssFileConfig[
'inline']
543 unset($cssFileConfig);
551 $style = trim($controller->pSetup[
'CSS_inlineStyle'] ??
'');
552 $style .= $controller->cObj->cObjGet($controller->pSetup[
'cssInline.'] ??
null,
'cssInline.');
557 if (isset($controller->pSetup[
'javascriptLibs.']) && is_array($controller->pSetup[
'javascriptLibs.'])) {
559 trigger_error(
'The setting page.javascriptLibs will be removed in TYPO3 v10.0.', E_USER_DEPRECATED);
562 if (!empty($controller->pSetup[
'javascriptLibs.'][
'jQuery'])) {
564 trigger_error(
'The setting page.javascriptLibs.jQuery will be removed in TYPO3 v10.0.', E_USER_DEPRECATED);
566 $jQueryTS = $controller->pSetup[
'javascriptLibs.'][
'jQuery.'];
568 $version = $jQueryTS[
'version'] ??
null;
569 $source = $jQueryTS[
'source'] ??
null;
571 if (!isset($jQueryTS[
'noConflict']) || !empty($jQueryTS[
'noConflict'])) {
572 $namespace =
'noConflict';
576 $pageRenderer->loadJquery($version, $source, $namespace,
true);
580 if (isset($controller->pSetup[
'includeJSLibs.']) && is_array($controller->pSetup[
'includeJSLibs.'])) {
581 foreach ($controller->pSetup[
'includeJSLibs.'] as $key => $JSfile) {
582 if (!is_array($JSfile)) {
583 if (isset($controller->pSetup[
'includeJSLibs.'][$key .
'.'][
'if.']) && !$controller->cObj->checkIf($controller->pSetup[
'includeJSLibs.'][$key .
'.'][
'if.'])) {
586 if ($controller->pSetup[
'includeJSLibs.'][$key .
'.'][
'external']) {
590 $ss = GeneralUtility::makeInstance(FilePathSanitizer::class)->sanitize($JSfile);
596 $jsFileConfig = &$controller->pSetup[
'includeJSLibs.'][$key .
'.'];
597 $type = $jsFileConfig[
'type'];
599 $type =
'text/javascript';
601 $crossOrigin = $jsFileConfig[
'crossorigin'];
602 if (!$crossOrigin && $jsFileConfig[
'integrity'] && $jsFileConfig[
'external']) {
603 $crossOrigin =
'anonymous';
605 $pageRenderer->addJsLibrary(
609 $jsFileConfig[
'external'] ?
false : empty($jsFileConfig[
'disableCompression']),
610 (
bool)$jsFileConfig[
'forceOnTop'],
611 $jsFileConfig[
'allWrap'],
612 (
bool)$jsFileConfig[
'excludeFromConcatenation'],
613 $jsFileConfig[
'allWrap.'][
'splitChar'],
614 (
bool)$jsFileConfig[
'async'],
615 $jsFileConfig[
'integrity'],
616 (
bool)$jsFileConfig[
'defer'],
619 unset($jsFileConfig);
624 if (isset($controller->pSetup[
'includeJSFooterlibs.']) && is_array($controller->pSetup[
'includeJSFooterlibs.'])) {
625 foreach ($controller->pSetup[
'includeJSFooterlibs.'] as $key => $JSfile) {
626 if (!is_array($JSfile)) {
627 if (isset($controller->pSetup[
'includeJSFooterlibs.'][$key .
'.'][
'if.']) && !$controller->cObj->checkIf($controller->pSetup[
'includeJSFooterlibs.'][$key .
'.'][
'if.'])) {
630 if ($controller->pSetup[
'includeJSFooterlibs.'][$key .
'.'][
'external']) {
634 $ss = GeneralUtility::makeInstance(FilePathSanitizer::class)->sanitize($JSfile);
640 $jsFileConfig = &$controller->pSetup[
'includeJSFooterlibs.'][$key .
'.'];
641 $type = $jsFileConfig[
'type'];
643 $type =
'text/javascript';
645 $crossorigin = $jsFileConfig[
'crossorigin'];
646 if (!$crossorigin && $jsFileConfig[
'integrity'] && $jsFileConfig[
'external']) {
647 $crossorigin =
'anonymous';
649 $pageRenderer->addJsFooterLibrary(
653 $jsFileConfig[
'external'] ?
false : empty($jsFileConfig[
'disableCompression']),
654 (
bool)$jsFileConfig[
'forceOnTop'],
655 $jsFileConfig[
'allWrap'],
656 (
bool)$jsFileConfig[
'excludeFromConcatenation'],
657 $jsFileConfig[
'allWrap.'][
'splitChar'],
658 (
bool)$jsFileConfig[
'async'],
659 $jsFileConfig[
'integrity'],
660 (
bool)$jsFileConfig[
'defer'],
663 unset($jsFileConfig);
669 if (isset($controller->pSetup[
'includeJS.']) && is_array($controller->pSetup[
'includeJS.'])) {
670 foreach ($controller->pSetup[
'includeJS.'] as $key => $JSfile) {
671 if (!is_array($JSfile)) {
672 if (isset($controller->pSetup[
'includeJS.'][$key .
'.'][
'if.']) && !$controller->cObj->checkIf($controller->pSetup[
'includeJS.'][$key .
'.'][
'if.'])) {
675 if ($controller->pSetup[
'includeJS.'][$key .
'.'][
'external']) {
679 $ss = GeneralUtility::makeInstance(FilePathSanitizer::class)->sanitize($JSfile);
685 $jsConfig = &$controller->pSetup[
'includeJS.'][$key .
'.'];
686 $type = $jsConfig[
'type'];
688 $type =
'text/javascript';
690 $crossorigin = $jsConfig[
'crossorigin'];
691 if (!$crossorigin && $jsConfig[
'integrity'] && $jsConfig[
'external']) {
692 $crossorigin =
'anonymous';
694 $pageRenderer->addJsFile(
697 $jsConfig[
'external'] ?
false : empty($jsConfig[
'disableCompression']),
698 (
bool)$jsConfig[
'forceOnTop'],
699 $jsConfig[
'allWrap'],
700 (
bool)$jsConfig[
'excludeFromConcatenation'],
701 $jsConfig[
'allWrap.'][
'splitChar'],
702 (
bool)$jsConfig[
'async'],
703 $jsConfig[
'integrity'],
704 (
bool)$jsConfig[
'defer'],
712 if (isset($controller->pSetup[
'includeJSFooter.']) && is_array($controller->pSetup[
'includeJSFooter.'])) {
713 foreach ($controller->pSetup[
'includeJSFooter.'] as $key => $JSfile) {
714 if (!is_array($JSfile)) {
715 if (isset($controller->pSetup[
'includeJSFooter.'][$key .
'.'][
'if.']) && !$controller->cObj->checkIf($controller->pSetup[
'includeJSFooter.'][$key .
'.'][
'if.'])) {
718 if ($controller->pSetup[
'includeJSFooter.'][$key .
'.'][
'external']) {
722 $ss = GeneralUtility::makeInstance(FilePathSanitizer::class)->sanitize($JSfile);
728 $jsConfig = &$controller->pSetup[
'includeJSFooter.'][$key .
'.'];
729 $type = $jsConfig[
'type'];
731 $type =
'text/javascript';
733 $crossorigin = $jsConfig[
'crossorigin'];
734 if (!$crossorigin && $jsConfig[
'integrity'] && $jsConfig[
'external']) {
735 $crossorigin =
'anonymous';
737 $pageRenderer->addJsFooterFile(
740 $jsConfig[
'external'] ?
false : empty($jsConfig[
'disableCompression']),
741 (
bool)$jsConfig[
'forceOnTop'],
742 $jsConfig[
'allWrap'],
743 (
bool)$jsConfig[
'excludeFromConcatenation'],
744 $jsConfig[
'allWrap.'][
'splitChar'],
745 (
bool)$jsConfig[
'async'],
746 $jsConfig[
'integrity'],
747 (
bool)$jsConfig[
'defer'],
756 if (isset($controller->pSetup[
'headerData.']) && is_array($controller->pSetup[
'headerData.'])) {
757 $pageRenderer->addHeaderData($controller->cObj->cObjGet($controller->pSetup[
'headerData.'],
'headerData.'));
760 if (isset($controller->pSetup[
'footerData.']) && is_array($controller->pSetup[
'footerData.'])) {
761 $pageRenderer->addFooterData($controller->cObj->cObjGet($controller->pSetup[
'footerData.'],
'footerData.'));
766 $_params = [
'page' => $controller->page];
768 foreach (
$GLOBALS[
'TYPO3_CONF_VARS'][
'SC_OPTIONS'][
'TYPO3\CMS\Frontend\Page\PageGenerator'][
'generateMetaTags'] ?? [] as $_funcRef) {
769 GeneralUtility::callUserFunction($_funcRef, $_params, $_ref);
773 $controller->pSetup[
'meta.'] ?? [],
777 unset($controller->additionalHeaderData[
'JSCode']);
778 if (isset($controller->config[
'INTincScript']) && is_array($controller->config[
'INTincScript'])) {
779 $controller->additionalHeaderData[
'JSCode'] = $controller->JSCode;
781 $controller->config[
'INTincScript_ext'][
'divKey'] = $controller->
uniqueHash();
782 $controller->config[
'INTincScript_ext'][
'additionalHeaderData'] = $controller->additionalHeaderData;
784 $controller->config[
'INTincScript_ext'][
'additionalFooterData'] = $controller->additionalFooterData;
786 $controller->config[
'INTincScript_ext'][
'additionalJavaScript'] = $controller->additionalJavaScript;
788 $controller->config[
'INTincScript_ext'][
'additionalCSS'] = $controller->additionalCSS;
790 $controller->additionalHeaderData = [
'<!--HD_' . $controller->config[
'INTincScript_ext'][
'divKey'] .
'-->'];
792 $controller->additionalFooterData = [
'<!--FD_' . $controller->config[
'INTincScript_ext'][
'divKey'] .
'-->'];
794 $controller->divSection .=
'<!--TDS_' . $controller->config[
'INTincScript_ext'][
'divKey'] .
'-->';
800 if ($controller->spamProtectEmailAddresses && $controller->spamProtectEmailAddresses !==
'ascii') {
802 /* decrypt helper function */
803 function decryptCharcode(n,start,end,offset) {
805 if (offset > 0 && n > end) {
806 n = start + (n - end - 1);
807 } else if (offset < 0 && n < start) {
808 n = end - (start - n - 1);
810 return String.fromCharCode(n);
813 function decryptString(enc,offset) {
815 var len = enc.length;
816 for(var i=0; i < len; i++) {
817 var n = enc.charCodeAt(i);
818 if (n >= 0x2B && n <= 0x3A) {
819 dec += decryptCharcode(n,0x2B,0x3A,offset); /* 0-9 . , - + / : */
820 } else if (n >= 0x40 && n <= 0x5A) {
821 dec += decryptCharcode(n,0x40,0x5A,offset); /* A-Z @ */
822 } else if (n >= 0x61 && n <= 0x7A) {
823 dec += decryptCharcode(n,0x61,0x7A,offset); /* a-z */
825 dec += enc.charAt(i);
830 /* decrypt spam-protected emails */
831 function linkTo_UnCryptMailto(s) {
832 location.href = decryptString(s,' . $controller->spamProtectEmailAddresses * -1 .
');
839 if (is_array($controller->inlineJS)) {
840 foreach ($controller->inlineJS as $key => $val) {
841 if (!is_array($val)) {
842 $inlineJS .= LF . $val . LF;
848 $inline = $controller->cObj->cObjGet($controller->pSetup[
'jsInline.'] ??
null,
'jsInline.');
850 $inlineJS .= LF . $inline . LF;
853 $inlineFooterJs = $controller->cObj->cObjGet($controller->pSetup[
'jsFooterInline.'] ??
null,
'jsFooterInline.');
855 if ($controller->config[
'config'][
'compressJs'] ??
false) {
856 $pageRenderer->enableCompressJavascript();
857 $minifyErrorScript = ($minifyErrorInline =
'');
858 $scriptJsCode = GeneralUtility::minifyJavaScript($scriptJsCode, $minifyErrorScript);
859 if ($minifyErrorScript) {
860 $this->timeTracker->setTSlogMessage($minifyErrorScript, 3);
863 $inlineJS = GeneralUtility::minifyJavaScript($inlineJS, $minifyErrorInline);
864 if ($minifyErrorInline) {
865 $this->timeTracker->setTSlogMessage($minifyErrorInline, 3);
868 if ($inlineFooterJs) {
869 $inlineFooterJs = GeneralUtility::minifyJavaScript($inlineFooterJs, $minifyErrorInline);
870 if ($minifyErrorInline) {
871 $this->timeTracker->setTSlogMessage($minifyErrorInline, 3);
875 if (!isset($controller->config[
'config'][
'removeDefaultJS']) || !$controller->config[
'config'][
'removeDefaultJS']) {
878 $pageRenderer->addJsInlineCode(
'_scriptCode', $scriptJsCode, $controller->config[
'config'][
'compressJs']);
881 $pageRenderer->addJsInlineCode(
'TS_inlineJS', $inlineJS, $controller->config[
'config'][
'compressJs']);
883 if ($inlineFooterJs) {
884 $pageRenderer->addJsFooterInlineCode(
'TS_inlineFooter', $inlineFooterJs, $controller->config[
'config'][
'compressJs']);
886 } elseif ($controller->config[
'config'][
'removeDefaultJS'] ===
'external') {
899 $pageRenderer->addJsInlineCode(
'TS_inlineJSint', $inlineJSint, $controller->config[
'config'][
'compressJs']);
901 if (trim($scriptJsCode . $inlineJS)) {
902 $pageRenderer->addJsFile(GeneralUtility::writeJavaScriptContentToTemporaryFile($scriptJsCode . $inlineJS),
'text/javascript', $controller->config[
'config'][
'compressJs']);
904 if ($inlineFooterJs) {
905 $inlineFooterJSint =
'';
907 if ($inlineFooterJSint) {
908 $pageRenderer->addJsFooterInlineCode(
'TS_inlineFooterJSint', $inlineFooterJSint, $controller->config[
'config'][
'compressJs']);
910 $pageRenderer->addJsFooterFile(GeneralUtility::writeJavaScriptContentToTemporaryFile($inlineFooterJs),
'text/javascript', $controller->config[
'config'][
'compressJs']);
915 $pageRenderer->addJsInlineCode(
'TS_inlineJS', $inlineJS, $controller->config[
'config'][
'compressJs']);
917 if ($inlineFooterJs) {
918 $pageRenderer->addJsFooterInlineCode(
'TS_inlineFooter', $inlineFooterJs, $controller->config[
'config'][
'compressJs']);
921 if (isset($controller->pSetup[
'inlineLanguageLabelFiles.']) && is_array($controller->pSetup[
'inlineLanguageLabelFiles.'])) {
922 foreach ($controller->pSetup[
'inlineLanguageLabelFiles.'] as $key => $languageFile) {
923 if (is_array($languageFile)) {
926 $languageFileConfig = &$controller->pSetup[
'inlineLanguageLabelFiles.'][$key .
'.'];
927 if (isset($languageFileConfig[
'if.']) && !$controller->cObj->checkIf($languageFileConfig[
'if.'])) {
930 $pageRenderer->addInlineLanguageLabelFile(
932 $languageFileConfig[
'selectionPrefix'] ?:
'',
933 $languageFileConfig[
'stripFromSelectionName'] ?:
''
937 if (isset($controller->pSetup[
'inlineSettings.']) && is_array($controller->pSetup[
'inlineSettings.'])) {
938 $pageRenderer->addInlineSettingArray(
'TS', $controller->pSetup[
'inlineSettings.']);
941 if ($controller->config[
'config'][
'compressCss'] ??
false) {
942 $pageRenderer->enableCompressCss();
944 if ($controller->config[
'config'][
'compressJs'] ??
false) {
945 $pageRenderer->enableCompressJavascript();
947 if ($controller->config[
'config'][
'concatenateCss'] ??
false) {
948 $pageRenderer->enableConcatenateCss();
950 if ($controller->config[
'config'][
'concatenateJs'] ??
false) {
951 $pageRenderer->enableConcatenateJavascript();
955 if ($controller->config[
'config'][
'concatenateJsAndCss'] ??
false) {
956 trigger_error(
'Setting config.concatenateJsAndCss is deprecated in favor of config.concatenateJs and config.concatenateCss, and will have no effect anymore in TYPO3 v10.0.', E_USER_DEPRECATED);
957 $pageRenderer->enableConcatenateCss();
958 $pageRenderer->enableConcatenateJavascript();
961 if ($controller->additionalHeaderData) {
962 $pageRenderer->addHeaderData(implode(LF, $controller->additionalHeaderData));
965 if ($controller->additionalFooterData) {
966 $pageRenderer->addFooterData(implode(LF, $controller->additionalFooterData));
970 if ($controller->config[
'config'][
'disableBodyTag'] ??
false) {
973 $defBT = (isset($controller->pSetup[
'bodyTagCObject']) && $controller->pSetup[
'bodyTagCObject'])
974 ? $controller->cObj->cObjGetSingle($controller->pSetup[
'bodyTagCObject'], $controller->pSetup[
'bodyTagCObject.'],
'bodyTagCObject')
976 $bodyTag = (isset($controller->pSetup[
'bodyTag']) && $controller->pSetup[
'bodyTag'])
977 ? $controller->pSetup[
'bodyTag']
979 if (trim($controller->pSetup[
'bodyTagAdd'] ??
'')) {
980 $bodyTag = preg_replace(
'/>$/',
'', trim($bodyTag)) .
' ' . trim($controller->pSetup[
'bodyTagAdd']) .
'>';
983 $pageRenderer->addBodyContent(LF . $bodyTag);
985 if ($controller->divSection) {
986 $pageRenderer->addBodyContent(LF . $controller->divSection);
989 $pageRenderer->addBodyContent(LF . $pageContent);
990 if (!empty($controller->config[
'INTincScript']) && is_array($controller->config[
'INTincScript'])) {
992 $controller->config[
'INTincScript_ext'][
'pageRenderer'] = serialize($pageRenderer);
994 $pageContent = $pageRenderer->renderPageWithUncachedObjects($controller->config[
'INTincScript_ext'][
'divKey']);
997 $pageContent = $pageRenderer->render();
999 return $pageContent ?:
'';
1018 preg_match_all(
'/\\<\\!--INT_SCRIPT.[a-z0-9]*--\\>/', $searchString, $tempArray);
1019 $searchString = preg_replace(
'/\\<\\!--INT_SCRIPT.[a-z0-9]*--\\>/',
'', $searchString);
1020 $intObjects = implode(
'', $tempArray[0]);
1033 $typoScriptService = GeneralUtility::makeInstance(TypoScriptService::class);
1034 $conf = $typoScriptService->convertTypoScriptArrayToPlainArray($metaTagTypoScript);
1035 foreach ($conf as $key => $properties) {
1037 if (is_array($properties)) {
1038 $nodeValue = $properties[
'_typoScriptNodeValue'] ??
'';
1039 $value = trim((
string)$cObj->
stdWrap($nodeValue, $metaTagTypoScript[$key .
'.']));
1040 if ($value ===
'' && !empty($properties[
'value'])) {
1041 $value = $properties[
'value'];
1045 $value = $properties;
1048 $attribute =
'name';
1049 if ((is_array($properties) && !empty($properties[
'httpEquivalent'])) || strtolower($key) ===
'refresh') {
1050 $attribute =
'http-equiv';
1052 if (is_array($properties) && !empty($properties[
'attribute'])) {
1053 $attribute = $properties[
'attribute'];
1055 if (is_array($properties) && !empty($properties[
'replace'])) {
1059 if (!is_array($value)) {
1060 $value = (array)$value;
1062 foreach ($value as $subValue) {
1063 if (trim($subValue ??
'') !==
'') {
1064 $pageRenderer->setMetaTag($attribute, $key, $subValue, [], $replace);
1075 return GeneralUtility::makeInstance(PageRenderer::class);
1088 if (empty($controller->config[
'config'][
'inlineStyle2TempFile'] ??
false)) {
1092 GeneralUtility::writeStyleSheetContentToTemporaryFile($cssStyles),
1096 (
bool)($controller->config[
'config'][
'compressCss'] ??
false),
1099 $excludeFromConcatenation
1125 if (is_array($configuration[
'htmlTag.'][
'attributes.'] ??
null)) {
1126 $attributeString =
'';
1127 foreach ($configuration[
'htmlTag.'][
'attributes.'] as $attributeName => $value) {
1128 $attributeString .=
' ' . htmlspecialchars($attributeName) . ($value !==
'' ?
'="' . htmlspecialchars((
string)$value) .
'"' :
'');
1130 if (isset($htmlTagAttributes[$attributeName])) {
1131 unset($htmlTagAttributes[$attributeName]);
1134 $attributeString = ltrim(GeneralUtility::implodeAttributes($htmlTagAttributes) . $attributeString);
1135 } elseif (($configuration[
'htmlTag_setParams'] ??
'') ===
'none') {
1136 $attributeString =
'';
1137 } elseif (isset($configuration[
'htmlTag_setParams'])) {
1138 $attributeString = $configuration[
'htmlTag_setParams'];
1140 $attributeString = GeneralUtility::implodeAttributes($htmlTagAttributes);
1142 $htmlTag =
'<html' . ($attributeString ?
' ' . $attributeString :
'') .
'>';
1143 if (isset($configuration[
'htmlTag_stdWrap.'])) {
1144 $htmlTag = $cObj->
stdWrap($htmlTag, $configuration[
'htmlTag_stdWrap.']);