They pointed to /typo3conf/ext/..., which only exists in the static docroots. Co-Authored-By: Claude Opus 5.5 <[email protected]>
226 lines
10 KiB
Plaintext
226 lines
10 KiB
Plaintext
page = PAGE
|
|
page {
|
|
meta {
|
|
viewport = width=device-width, initial-scale=1
|
|
X-UA-Compatible = ie=edge
|
|
format-detection = telephone=no
|
|
}
|
|
|
|
bodyTagCObject = COA
|
|
bodyTagCObject {
|
|
10 = TEXT
|
|
10.value = <body class="antialiased text-zinc-800 font-sans pt-14 lg:pt-8 bg-white
|
|
20 = TEXT
|
|
20 {
|
|
field = tx_eptheme_bodyclass
|
|
if.isTrue.field = tx_eptheme_bodyclass
|
|
noTrimWrap = | ||
|
|
}
|
|
30 = TEXT
|
|
30 {
|
|
value = {$plugin.tx_eptheme.settings.themekey}
|
|
if.isTrue = {$plugin.tx_eptheme.settings.themekey}
|
|
noTrimWrap = | ||
|
|
}
|
|
35 = TEXT
|
|
35 {
|
|
field = uid
|
|
noTrimWrap = | page-||
|
|
}
|
|
40 = TEXT
|
|
40.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 = <link rel="preconnect" href="https://cdn.ep-reisen.de">
|
|
|
|
headerData.333 = TEXT
|
|
headerData.333.value (
|
|
<link rel="shortcut icon" type="image/x-icon" href="/{path:EXT:ep_theme/Resources/Public/images/favicon.ico}">
|
|
<link rel="icon" type="image/x-icon" href="/{path:EXT:ep_theme/Resources/Public/images/favicon.ico}">
|
|
<link rel="icon" type="image/gif" href="/{path:EXT:ep_theme/Resources/Public/images/favicon.gif}">
|
|
<link rel="icon" type="image/png" href="/{path:EXT:ep_theme/Resources/Public/images/favicon.png}">
|
|
<link rel="apple-touch-icon" href="/{path:EXT:ep_theme/Resources/Public/images/apple-touch-icon.png}">
|
|
<link rel="apple-touch-icon" href="/{path:EXT:ep_theme/Resources/Public/images/apple-touch-icon-57x57.png}" sizes="57x57">
|
|
<link rel="apple-touch-icon" href="/{path:EXT:ep_theme/Resources/Public/images/apple-touch-icon-60x60.png}" sizes="60x60">
|
|
<link rel="apple-touch-icon" href="/{path:EXT:ep_theme/Resources/Public/images/apple-touch-icon-72x72.png}" sizes="72x72">
|
|
<link rel="apple-touch-icon" href="/{path:EXT:ep_theme/Resources/Public/images/apple-touch-icon-76x76.png}" sizes="76x76">
|
|
<link rel="apple-touch-icon" href="/{path:EXT:ep_theme/Resources/Public/images/apple-touch-icon-114x114.png}" sizes="114x114">
|
|
<link rel="apple-touch-icon" href="/{path:EXT:ep_theme/Resources/Public/images/apple-touch-icon-120x120.png}" sizes="120x120">
|
|
<link rel="apple-touch-icon" href="/{path:EXT:ep_theme/Resources/Public/images/apple-touch-icon-128x128.png}" sizes="128x128">
|
|
<link rel="apple-touch-icon" href="/{path:EXT:ep_theme/Resources/Public/images/apple-touch-icon-144x144.png}" sizes="144x144">
|
|
<link rel="apple-touch-icon" href="/{path:EXT:ep_theme/Resources/Public/images/apple-touch-icon-152x152.png}" sizes="152x152">
|
|
<link rel="apple-touch-icon" href="/{path:EXT:ep_theme/Resources/Public/images/apple-touch-icon-180x180.png}" sizes="180x180">
|
|
<link rel="apple-touch-icon" href="/{path:EXT:ep_theme/Resources/Public/images/apple-touch-icon-precomposed.png}">
|
|
<link rel="icon" type="image/png" href="/{path:EXT:ep_theme/Resources/Public/images/favicon-16x16.png}" sizes="16x16">
|
|
<link rel="icon" type="image/png" href="/{path:EXT:ep_theme/Resources/Public/images/favicon-32x32.png}" sizes="32x32">
|
|
<link rel="icon" type="image/png" href="/{path:EXT:ep_theme/Resources/Public/images/favicon-96x96.png}" sizes="96x96">
|
|
<link rel="icon" type="image/png" href="/{path:EXT:ep_theme/Resources/Public/images/favicon-160x160.png}" sizes="160x160">
|
|
<link rel="icon" type="image/png" href="/{path:EXT:ep_theme/Resources/Public/images/favicon-192x192.png}" sizes="192x192">
|
|
<link rel="icon" type="image/png" href="/{path:EXT:ep_theme/Resources/Public/images/favicon-196x196.png}" sizes="196x196">
|
|
)
|
|
headerData.333.insertData = 1
|
|
|
|
# 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 = <script src="{$plugin.tx_eptheme.settings.cookieFirstScriptUrl}"></script>
|
|
if.isTrue = {$plugin.tx_eptheme.settings.cookieFirstScriptUrl}
|
|
}
|
|
|
|
headerData.995 = TEXT
|
|
headerData.995 {
|
|
value (
|
|
<!-- Google Tag Manager -->
|
|
<script type="text/plain" data-cookiefirst-category="necessary">(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
|
|
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
|
|
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
|
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
|
|
})(window,document,'script','dataLayer','{$plugin.tx_eptheme.settings.googleTagManagerId}');</script>
|
|
<!-- End Google Tag Manager -->
|
|
)
|
|
if.isTrue = {$plugin.tx_eptheme.settings.googleTagManagerId}
|
|
}
|
|
}
|
|
|
|
[traverse(page, "backend_layout") == 'pagets__popup']
|
|
page.bodyTagCObject >
|
|
page.bodyTagCObject = TEXT
|
|
page.bodyTagCObject.value = <body class="antialiased text-zinc-800 font-sans bg-white p-4">
|
|
page.headerData.333 >
|
|
# page.headerData.990 >
|
|
# page.headerData.995 >
|
|
[end]
|
|
|
|
[traverse(page, "backend_layout") == 'pagets__travelinfo']
|
|
page.bodyTagCObject >
|
|
page.bodyTagCObject = TEXT
|
|
page.bodyTagCObject.value = <body class="antialiased text-zinc-800 font-sans bg-white">
|
|
[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]
|