/** * Makes TCA available inside eID * * @return void */ public static function initTCA() { // Some badly made extensions attempt to manipulate TCA in a wrong way // (inside ext_localconf.php). Therefore $GLOBALS['TCA'] may become an array // but in fact it is not loaded. The check below ensure that // TCA is still loaded if such bad extensions are installed if (!is_array($GLOBALS['TCA']) || !isset($GLOBALS['TCA']['pages'])) { ExtensionManagementUtility::loadBaseTca(); } }
/** * Load extbase dependencies to use repositories and persistence. */ public function init() { ExtensionManagementUtility::loadBaseTca(false); if (!isset($GLOBALS['TSFE']) || empty($GLOBALS['TSFE']->sys_page)) { $GLOBALS['TSFE']->sys_page = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('t3lib_pageSelect'); } if (!isset($GLOBALS['TSFE']) || empty($GLOBALS['TSFE']->tmpl)) { $GLOBALS['TSFE']->tmpl = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('t3lib_tstemplate'); } }
/** * Load ext_tables and friends. * * This will mainly set up $TCA and several other global arrays * through API's like extMgm. * Executes ext_tables.php files of loaded extensions or the * according cache file if exists. * * @param bool $allowCaching True, if reading compiled ext_tables file from cache is allowed * @return Bootstrap * @internal This is not a public API method, do not use in own extensions */ public function loadExtensionTables($allowCaching = true) { ExtensionManagementUtility::loadBaseTca($allowCaching); ExtensionManagementUtility::loadExtTables($allowCaching); $this->runExtTablesPostProcessingHooks(); return $this; }
/** * @test */ public function loadBaseTcaCreatesCacheFileWithContentOfAnExtensionsConfigurationTcaPhpFile() { $extensionName = $this->getUniqueId('test_baseTca_'); $packageManager = $this->createMockPackageManagerWithMockPackage($extensionName); $packagePath = $packageManager->getPackage($extensionName)->getPackagePath(); GeneralUtility::mkdir($packagePath); GeneralUtility::mkdir($packagePath . 'Configuration/'); GeneralUtility::mkdir($packagePath . 'Configuration/TCA/'); $GLOBALS['TYPO3_LOADED_EXT'] = new LoadedExtensionsArray($packageManager); ExtensionManagementUtility::setPackageManager($packageManager); $uniqueTableName = $this->getUniqueId('table_name_'); $uniqueStringInTableConfiguration = $this->getUniqueId('table_configuration_'); $tableConfiguration = '<?php return array(\'foo\' => \'' . $uniqueStringInTableConfiguration . '\'); ?>'; file_put_contents($packagePath . 'Configuration/TCA/' . $uniqueTableName . '.php', $tableConfiguration); $mockCache = $this->getMock(AbstractFrontend::class, array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove', 'flush', 'flushByTag', 'requireOnce'), array(), '', FALSE); /** @var CacheManager|\PHPUnit_Framework_MockObject_MockObject $mockCacheManager */ $mockCacheManager = $this->getMock(CacheManager::class, array('getCache')); $mockCacheManager->expects($this->any())->method('getCache')->will($this->returnValue($mockCache)); ExtensionManagementUtilityAccessibleProxy::setCacheManager($mockCacheManager); $mockCache->expects($this->once())->method('has')->will($this->returnValue(FALSE)); $mockCache->expects($this->once())->method('set')->with($this->anything(), $this->stringContains($uniqueStringInTableConfiguration), $this->anything()); ExtensionManagementUtility::loadBaseTca(TRUE); }
/** * Tries to load the ext_localconf and ext_tables files of all non-core extensions * Writes current extension name to file and deletes it again when inclusion was * successful. * * @param array $extensions * @return void */ protected function tryToLoadExtLocalconfAndExtTablesOfExtensions(array $extensions) { foreach ($extensions as $extensionKey => $extension) { $this->writeCurrentExtensionToFile($extensionKey); $this->loadExtLocalconfForExtension($extensionKey, $extension); $this->removeCurrentExtensionFromFile($extensionKey); } ExtensionManagementUtility::loadBaseTca(false); foreach ($extensions as $extensionKey => $extension) { $this->writeCurrentExtensionToFile($extensionKey); $this->loadExtTablesForExtension($extensionKey, $extension); $this->removeCurrentExtensionFromFile($extensionKey); } }
/** * Load ext_tables and friends. * * This will mainly set up $TCA and several other global arrays * through API's like extMgm. * Executes ext_tables.php files of loaded extensions or the * according cache file if exists. * * @param boolean $allowCaching True, if reading compiled ext_tables file from cache is allowed * @return Bootstrap * @internal This is not a public API method, do not use in own extensions */ public function loadExtensionTables($allowCaching = TRUE) { Utility\ExtensionManagementUtility::loadBaseTca($allowCaching); Utility\ExtensionManagementUtility::loadExtTables($allowCaching); $this->executeExtTablesAdditionalFile(); $this->runExtTablesPostProcessingHooks(); return $this; }
/** * 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 = []; 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 { ExtensionManagementUtility::loadBaseTca(); } $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($GLOBALS['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']->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([$GLOBALS['error'], 'debugOutput'])) { $GLOBALS['error']->debugOutput(); } if (TYPO3_DLOG) { GeneralUtility::devLog('END of FRONTEND session', 'cms', 0, ['_FLUSH' => true]); } return $response; }