protected function initialize() { if (!is_object($this->typoScriptFrontendController->cObj)) { $this->typoScriptFrontendController->initTemplate(); $this->typoScriptFrontendController->getConfigArray(); $this->typoScriptFrontendController->settingLanguage(); $this->typoScriptFrontendController->newCObj(); } }
/** * Initialize the TSFE. * * @param integer $pageUid The page UID * @param boolean $overrule * @return void */ public function initTSFE($pageUid = -1, $overrule = FALSE) { $rootLine = NULL; $typo3confVariables = $GLOBALS['TYPO3_CONF_VARS']; if ($pageUid == -1 && GeneralUtility::_GP('pid') !== NULL) { $pageUid = intval(GeneralUtility::_GP('pid')); } if ($pageUid === -1) { $pageUid = 0; } // begin if (!is_object($GLOBALS['TT']) || $overrule === TRUE) { $GLOBALS['TT'] = new \TYPO3\CMS\Core\TimeTracker\TimeTracker(); $GLOBALS['TT']->start(); } if ((!is_object($GLOBALS['TSFE']) || $GLOBALS['TSFE'] instanceof \stdClass || $overrule === TRUE) && is_int($pageUid)) { // builds TSFE object $GLOBALS['TSFE'] = $typoScriptFrontendController = new \TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController($typo3confVariables, $pageUid, 0, 0, '', '', '', ''); $typoScriptFrontendController->initTemplate(); // builds a cObj if (is_array($typoScriptFrontendController->page) === FALSE) { $typoScriptFrontendController->page = array(); } $typoScriptFrontendController->newCObj(); // Add the FE user $typoScriptFrontendController->fe_user = EidUtility::initFeUser(); $typoScriptFrontendController->determineId(); $typoScriptFrontendController->getConfigArray(); $this->setRequestedLanguage($typoScriptFrontendController); $typoScriptFrontendController->settingLanguage(); $typoScriptFrontendController->settingLocale(); } }
/** * Initialize frontend environment * * @return void */ public function __construct() { $this->bootstrap = GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Core\\Bootstrap'); $feUserObj = EidUtility::initFeUser(); $pageId = GeneralUtility::_GET('id') ?: 1; $pageType = GeneralUtility::_GET('type') ?: 0; /** @var TypoScriptFrontendController $typoScriptFrontendController */ $this->typoScriptFrontendController = GeneralUtility::makeInstance('TYPO3\\CMS\\Frontend\\Controller\\TypoScriptFrontendController', $GLOBALS['TYPO3_CONF_VARS'], $pageId, $pageType, true); $GLOBALS['TSFE'] = $this->typoScriptFrontendController; $this->typoScriptFrontendController->connectToDB(); $this->typoScriptFrontendController->fe_user = $feUserObj; $this->typoScriptFrontendController->id = $pageId; $this->typoScriptFrontendController->determineId(); $this->typoScriptFrontendController->checkAlternativeIdMethods(); $this->typoScriptFrontendController->getCompressedTCarray(); $this->typoScriptFrontendController->initTemplate(); $this->typoScriptFrontendController->getConfigArray(); $this->typoScriptFrontendController->includeTCA(); $this->typoScriptFrontendController->settingLanguage(); $this->typoScriptFrontendController->settingLocale(); }
/** * Handles a frontend request * * @param \Psr\Http\Message\ServerRequestInterface $request * @return NULL|\Psr\Http\Message\ResponseInterface */ public function handleRequest(\Psr\Http\Message\ServerRequestInterface $request) { $response = null; $this->request = $request; $this->initializeTimeTracker(); // Hook to preprocess the current request: if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/index_ts.php']['preprocessRequest'])) { foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/index_ts.php']['preprocessRequest'] as $hookFunction) { $hookParameters = array(); GeneralUtility::callUserFunction($hookFunction, $hookParameters, $hookParameters); } unset($hookFunction); unset($hookParameters); } $this->initializeController(); if ($GLOBALS['TYPO3_CONF_VARS']['FE']['pageUnavailable_force'] && !GeneralUtility::cmpIP(GeneralUtility::getIndpEnv('REMOTE_ADDR'), $GLOBALS['TYPO3_CONF_VARS']['SYS']['devIPmask'])) { $this->controller->pageUnavailableAndExit('This page is temporarily unavailable.'); } $this->controller->connectToDB(); $this->controller->sendRedirect(); // Output compression // Remove any output produced until now $this->bootstrap->endOutputBufferingAndCleanPreviousOutput(); $this->initializeOutputCompression(); // Initializing the Frontend User $this->timeTracker->push('Front End user initialized', ''); $this->controller->initFEuser(); $this->timeTracker->pull(); // Initializing a possible logged-in Backend User /** @var $GLOBALS['BE_USER'] \TYPO3\CMS\Backend\FrontendBackendUserAuthentication */ $GLOBALS['BE_USER'] = $this->controller->initializeBackendUser(); // Process the ID, type and other parameters. // After this point we have an array, $page in TSFE, which is the page-record // of the current page, $id. $this->timeTracker->push('Process ID', ''); // Initialize admin panel since simulation settings are required here: if ($this->controller->isBackendUserLoggedIn()) { $GLOBALS['BE_USER']->initializeAdminPanel(); $this->bootstrap->initializeBackendRouter()->loadExtensionTables(); } else { $this->bootstrap->loadCachedTca(); } $this->controller->checkAlternativeIdMethods(); $this->controller->clear_preview(); $this->controller->determineId(); // Now, if there is a backend user logged in and he has NO access to this page, // then re-evaluate the id shown! _GP('ADMCMD_noBeUser') is placed here because // \TYPO3\CMS\Version\Hook\PreviewHook might need to know if a backend user is logged in. if ($this->controller->isBackendUserLoggedIn() && (!$GLOBALS['BE_USER']->extPageReadAccess($this->controller->page) || GeneralUtility::_GP('ADMCMD_noBeUser'))) { // Remove user unset($GLOBALS['BE_USER']); $this->controller->beUserLogin = false; // Re-evaluate the page-id. $this->controller->checkAlternativeIdMethods(); $this->controller->clear_preview(); $this->controller->determineId(); } $this->controller->makeCacheHash(); $this->timeTracker->pull(); // Admin Panel & Frontend editing if ($this->controller->isBackendUserLoggedIn()) { $GLOBALS['BE_USER']->initializeFrontendEdit(); if ($GLOBALS['BE_USER']->adminPanel instanceof AdminPanelView) { $this->bootstrap->initializeLanguageObject(); } if ($GLOBALS['BE_USER']->frontendEdit instanceof FrontendEditingController) { $GLOBALS['BE_USER']->frontendEdit->initConfigOptions(); } } // Starts the template $this->timeTracker->push('Start Template', ''); $this->controller->initTemplate(); $this->timeTracker->pull(); // Get from cache $this->timeTracker->push('Get Page from cache', ''); $this->controller->getFromCache(); $this->timeTracker->pull(); // Get config if not already gotten // After this, we should have a valid config-array ready $this->controller->getConfigArray(); // Setting language and locale $this->timeTracker->push('Setting language and locale', ''); $this->controller->settingLanguage(); $this->controller->settingLocale(); $this->timeTracker->pull(); // Convert POST data to utf-8 for internal processing if metaCharset is different $this->controller->convPOSTCharset(); $this->controller->initializeRedirectUrlHandlers(); $this->controller->handleDataSubmission(); // Check for shortcut page and redirect $this->controller->checkPageForShortcutRedirect(); $this->controller->checkPageForMountpointRedirect(); // Generate page $this->controller->setUrlIdToken(); $this->timeTracker->push('Page generation', ''); if ($this->controller->isGeneratePage()) { $this->controller->generatePage_preProcessing(); $temp_theScript = $this->controller->generatePage_whichScript(); if ($temp_theScript) { include $temp_theScript; } else { PageGenerator::pagegenInit(); // Global content object $this->controller->newCObj(); // Content generation if (!$this->controller->isINTincScript()) { PageGenerator::renderContent(); $this->controller->setAbsRefPrefix(); } } $this->controller->generatePage_postProcessing(); } elseif ($this->controller->isINTincScript()) { PageGenerator::pagegenInit(); // Global content object $this->controller->newCObj(); } $this->controller->releaseLocks(); $this->timeTracker->pull(); // Render non-cached parts if ($this->controller->isINTincScript()) { $this->timeTracker->push('Non-cached objects', ''); $this->controller->INTincScript(); $this->timeTracker->pull(); } // Output content $sendTSFEContent = false; if ($this->controller->isOutputting()) { $this->timeTracker->push('Print Content', ''); $this->controller->processOutput(); $sendTSFEContent = true; $this->timeTracker->pull(); } // Store session data for fe_users $this->controller->storeSessionData(); // Statistics $GLOBALS['TYPO3_MISC']['microtime_end'] = microtime(true); $this->controller->setParseTime(); if (isset($this->controller->config['config']['debug'])) { $debugParseTime = (bool) $this->controller->config['config']['debug']; } else { $debugParseTime = !empty($this->controller->TYPO3_CONF_VARS['FE']['debug']); } if ($this->controller->isOutputting() && $debugParseTime) { $this->controller->content .= LF . '<!-- Parsetime: ' . $this->controller->scriptParseTime . 'ms -->'; } $this->controller->redirectToExternalUrl(); // Preview info $this->controller->previewInfo(); // Hook for end-of-frontend $this->controller->hook_eofe(); // Finish timetracking $this->timeTracker->pull(); // Check memory usage MonitorUtility::peakMemoryUsage(); // beLoginLinkIPList echo $this->controller->beLoginLinkIPList(); // Admin panel if ($this->controller->isBackendUserLoggedIn() && $GLOBALS['BE_USER'] instanceof FrontendBackendUserAuthentication) { if ($GLOBALS['BE_USER']->extAdmEnabled) { // Style sheet is also used for frontend editing. $this->controller->content = str_ireplace('</head>', $GLOBALS['BE_USER']->adminPanel->getAdminPanelHeaderData() . '</head>', $this->controller->content); } if ($GLOBALS['BE_USER']->isAdminPanelVisible()) { $this->controller->content = str_ireplace('</body>', $GLOBALS['BE_USER']->displayAdminPanel() . '</body>', $this->controller->content); } } if ($sendTSFEContent) { /** @var \TYPO3\CMS\Core\Http\Response $response */ $response = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Http\Response::class); $response->getBody()->write($this->controller->content); } // Debugging Output if (isset($GLOBALS['error']) && is_object($GLOBALS['error']) && @is_callable(array($GLOBALS['error'], 'debugOutput'))) { $GLOBALS['error']->debugOutput(); } if (TYPO3_DLOG) { GeneralUtility::devLog('END of FRONTEND session', 'cms', 0, array('_FLUSH' => true)); } return $response; }
/** * @param array $params * @param \TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController $pObj * @param string $hookType */ protected function contentPostProc($params, $pObj, $hookType) { if ($this->extensionConfiguration->shouldIncludeEofe() && !$this->extensionConfiguration->hasIncludedEofe()) { $this->extensionConfiguration->setIncludedEofe(true); $eofe = $pObj->cObj->cObjGetSingle($pObj->tmpl->setup['config.']['extbase_hijax.']['eofe'], $pObj->tmpl->setup['config.']['extbase_hijax.']['eofe.']); $pObj->content = str_ireplace('</body>', $eofe . '</body>', $pObj->content); } if ($this->extensionConfiguration->shouldIncludeSofe() && !$this->extensionConfiguration->hasIncludedSofe()) { $this->extensionConfiguration->setIncludedSofe(true); $sofe = $pObj->cObj->cObjGetSingle($pObj->tmpl->setup['config.']['extbase_hijax.']['sofe'], $pObj->tmpl->setup['config.']['extbase_hijax.']['sofe.']); $pObj->content = preg_replace('/<body([^>]*)>/msU', '<body$1>' . $sofe, $pObj->content); } $bodyClass = $pObj->tmpl->setup['config.']['extbase_hijax.']['bodyClass']; if ($bodyClass && !$this->extensionConfiguration->hasAddedBodyClass()) { $matches = array(); preg_match('/<body([^>]*)class="([^>]*)">/msU', $pObj->content, $matches); $count = 0; if (count($matches)) { $classes = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(" ", $matches[2], true); if (!in_array($bodyClass, $classes)) { $pObj->content = preg_replace('/<body([^>]*)class="([^>]*)">/msU', '<body$1class="$2 ' . $bodyClass . '">', $pObj->content, -1, $count); } } else { $pObj->content = preg_replace('/<body([^>]*)>/msU', '<body$1 class="' . $bodyClass . '">', $pObj->content, -1, $count); } if ($count) { $this->extensionConfiguration->setAddedBodyClass(true); } } if ($hookType == 'output') { while ($this->hijaxEventDispatcher->hasPendingNextPhaseEvents()) { // trick to force double rendering of some content elements $GLOBALS['TSFE']->recordRegister = array(); // trick to force loading of full TS template if (!$pObj->tmpl->loaded) { $pObj->forceTemplateParsing = TRUE; $pObj->getConfigArray(); } $this->hijaxEventDispatcher->promoteNextPhaseEvents(); $this->hijaxEventDispatcher->parseAndRunEventListeners($pObj->content); if (!$pObj->config['INTincScript']) { $pObj->config['INTincScript'] = array(); } $pObj->INTincScript(); if (self::$loopCount++ > 99) { // preventing dead loops break; } } } if ($hookType == 'output' || $pObj->isStaticCacheble()) { $this->hijaxEventDispatcher->replaceXMLCommentsWithDivs($pObj->content); } if ($hookType == 'output') { if (count($this->nonCacheableFooterCode)) { ksort($this->nonCacheableFooterCode); $pObj->content = $this->str_lreplace('</body>', '<!-- x123456 -->' . implode('', $this->nonCacheableFooterCode) . '</body>', $pObj->content); } if (count($this->nonCacheableHeaderCode)) { ksort($this->nonCacheableHeaderCode); $pObj->content = $this->str_lreplace('</head>', '<!-- x123456 -->' . implode('', $this->nonCacheableHeaderCode) . '</head>', $pObj->content); } } }