page = PAGE page { meta { viewport = width=device-width, initial-scale=1 X-UA-Compatible = ie=edge format-detection = telephone=no google-site-verification = {$plugin.tx_eptheme.settings.googleSiteVerification} } bodyTagCObject = COA bodyTagCObject { 10 = TEXT 10.value = } # Every image on the page comes from the CDN host (see Extensions/Replacer.typoscript), # so a cold visitor pays a full DNS + TCP + TLS handshake - measured at 50-70ms - before # the first one can start downloading. `preconnect` gets that out of the way while the # HTML is still parsing. No `crossorigin`: images are fetched without CORS, and an # anonymous-vs-CORS mismatch would open a second connection instead of reusing this one. # Fonts, which would need it, are served by this host now. headerData.100 = TEXT headerData.100.value = # The set realfavicongenerator.net generates (2024): what current browsers use, nothing for # outdated ones. faviconPath is the folder in fileadmin it was uploaded to. headerData.333 = TEXT headerData.333.value ( ) # disableCompression keeps ResourceCompressor's hands off the Encore entries: Webpack # already minifies them, and copying them to typo3temp/assets/compressed only replaces the # content hash with a name derived from md5(abspath + mtime + size), which changes on every # deploy even when the bytes do not - defeating the immutable caching the hash exists for. # RequestHandler turns this into `compress => false`, which PageRendererHooks forwards to # typo3_encore's TagRenderer (whose own default it would otherwise override). includeCSS { main = PKG:ssch/typo3-encore:EpThemeConfig:main # Skips TYPO3's file path check, which would drop the entry name before typo3_encore's hook sees it main.external = 1 main.disableCompression = 1 } includeJSFooter { main = PKG:ssch/typo3-encore:EpThemeConfig:main # Skips TYPO3's file path check, which would drop the entry name before typo3_encore's hook sees it main.external = 1 main.defer = 1 main.disableCompression = 1 } 10 = FLUIDTEMPLATE 10 { file { cObject = TEXT cObject { data = levelfield: -1, backend_layout_next_level, slide override { data = page:backend_layout } ifEmpty = Default split { token = pagets__ 1.current = 1 1.wrap = | } wrap = EXT:ep_theme/Resources/Private/Templates/Page/|.html case = ucfirst } } layoutRootPaths.0 = EXT:ep_theme/Resources/Private/Layouts/ partialRootPaths.0 = EXT:ep_theme/Resources/Private/Partials/ templateRootPaths.0 = EXT:ep_theme/Resources/Private/Templates/ dataProcessing { 10 = EP\EpTheme\DataProcessing\ContextProcessor 20 = EP\EpTheme\DataProcessing\SliderProcessor 25 = EP\EpTheme\DataProcessing\ProductRatingProcessor 30 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor 30 { table = tx_epproducts_domain_model_badge where.data = field:tx_eptheme_badge where.wrap = uid=| pidInList = {$plugin.tx_eptheme.settings.badgeStoragePid} as = badge if { equals.field = backend_layout value = pagets__detail negate = 1 } } 40 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor 40 { special = directory special.value = {$plugin.tx_eptheme.settings.topNavPid} levels = 1 as = topnav } 50 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor 50 { special = directory special.value = {$plugin.tx_eptheme.settings.mainNavPid} levels = 3 titleField = title as = mainnav } 60 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor 60 { special = directory special.value = {$plugin.tx_eptheme.settings.mobileNavPid} levels = 4 expandAll = 1 titleField = title as = mobilenav } 70 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor 70 { special = directory special.value = {$plugin.tx_eptheme.settings.footerNavPid} levels = 2 expandAll = 1 titleField = title as = footernav } 80 = TYPO3\CMS\Frontend\DataProcessing\SiteProcessor 80 { as = site } } settings < plugin.tx_eptheme.settings } headerData.990 = TEXT headerData.990 { value = if.isTrue = {$plugin.tx_eptheme.settings.cookieFirstScriptUrl} } headerData.995 = TEXT headerData.995 { value ( ) if.isTrue = {$plugin.tx_eptheme.settings.googleTagManagerId} } } [traverse(page, "backend_layout") == 'pagets__popup'] page.bodyTagCObject > page.bodyTagCObject = TEXT page.bodyTagCObject.value = page.headerData.333 > # page.headerData.990 > # page.headerData.995 > [end] [traverse(page, "backend_layout") == 'pagets__travelinfo'] page.bodyTagCObject > page.bodyTagCObject = TEXT page.bodyTagCObject.value = [end] [request.getNormalizedParams() && like(request.getNormalizedParams().getHttpUserAgent(), "*Googlebot*")] page.headerData.990 > page.headerData.995 > [end] # Comparisons with TYPO3 10 (.ddev/plans/checks): an element that fails renders the error placeholder # instead of failing the page, so the other elements of the page can still be compared [applicationContext == "Development" && traverse(request.getHeaders(), 'x-ep-compare/0') == '1'] config.contentObjectExceptionHandler = 1 [end] #[applicationContext == "Development" || applicationContext == "Production/Staging"] # page.headerData.990 > # page.headerData.995 > #[end]