chore: copy ep_products and ep_theme from EP/website@9593cc8

Copied unchanged from public/typo3conf/ext/ of EP/website at
9593cc8631354f8a363d6609de8b7433f669a9a0 (Git-tracked files only).
History stays in the old repository. Only composer.json files are
added so the extensions install as path packages.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
frommeandClaude Opus 5.5 committed 2026-10-21 14:01:20 +02:00
1 parent 59afaecea1
commit a46918de9d
778 files changed
+67000 -2

No files matched your search

@@ -0,0 +1,30 @@
ajax_page_json = PAGE
ajax_page_json {
typeNum = 1803
config {
disableAllHeaderCode = 1
additionalHeaders.10.header = Content-type:application/json
xhtml_cleaning = 0
admPanel = 0
debug = 0
}
10 = USER_INT
10 {
userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
extensionName = EpTheme
pluginName = Ajax
vendorName = EP
controller = AjaxForm
action = processForm
switchableControllerActions {
AjaxForm {
1 = processForm
}
}
features.requireCHashArgumentForActionArguments = 0
settings =< plugin.tx_eptheme.settings
persistence =< plugin.tx_eptheme.persistence
view =< plugin.tx_eptheme.view
}
}
@@ -0,0 +1,62 @@
# Chatbot content feed: the main content of a page, without header, navigation, footer or
# assets. Fetched by MyE&P for pages the content manifest reports as changed; protected by
# EP\EpProducts\Middleware\ContentPageTypeGuardMiddleware. See
# .ddev/plans/CHATBOT-MCP-01-TYPO3-CONTENT-FEED.md §6.
# Plugins (the booking widget on product detail pages), forms, sub-page menus and teaser cards
# are left out: MyE&P has trip data first-hand, and the pages and records the cards link to are
# in the feed in their own right. The filter applies to top-level elements only; a plugin nested
# in a grid or container element is still rendered by its parent.
lib.contentOnly < lib.dynamicContent
lib.contentOnly.20.select.where = colPos={register:colPos} AND CType NOT IN ({$plugin.tx_eptheme.settings.contentOnlyExcludedCTypes})
tx_eptheme_content_only = PAGE
tx_eptheme_content_only {
typeNum = 1730
config {
disableAllHeaderCode = 1
disablePrefixComment = 1
additionalHeaders.10.header = Content-Type: text/html; charset=utf-8
additionalHeaders.20.header = X-Robots-Tag: noindex, nofollow, noarchive
admPanel = 0
debug = 0
# Never written to disk: the type is key-protected, and a static file would be served
# by .htaccess without that check ever running.
tx_staticfilecache.disableCache = 1
# Same reason for shared caches between us and the consumer: the TYPO3 page cache is
# fine (the guard runs before it), a proxy storing a keyed response is not.
sendCacheHeaders = 0
additionalHeaders.30.header = Cache-Control: private, no-store
}
10 = COA
10 {
wrap = <article>|</article>
10 = TEXT
10.field = title
10.htmlSpecialChars = 1
10.wrap = <h1>|</h1>
# Page templates without a sidebar render colPos 0; the sidebar layouts render 3 (header),
# 4 (content) and 2 (sidebar). colPos 1 holds teaser groups and is left out. The page
# templates pass colPos in as data; here there is no template, so each copy sets it.
# These must be copies (<), not references (=<): removing colPos.cObject on a reference
# leaves the referenced cObject in place, and every column silently renders colPos 0.
20 < lib.contentOnly
20.5.colPos.cObject >
20.5.colPos = 3
30 < lib.contentOnly
30.5.colPos.cObject >
30.5.colPos = 0
40 < lib.contentOnly
40.5.colPos.cObject >
40.5.colPos = 4
50 < lib.contentOnly
50.5.colPos.cObject >
50.5.colPos = 2
}
}
@@ -0,0 +1,25 @@
xmlExport = PAGE
xmlExport {
typeNum = 1972
config {
xhtml_cleaning = none
disableAllHeaderCode = 1
additionalHeaders = Content-Type: text/xml; charset=utf-8
simulateStaticDocuments = 0
admPanel = 0
debug = 0
tx_realurl_enable = 1
}
10 = USER_INT
10 {
userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
extensionName = EpProducts
pluginName = reseller
vendorName = EP
switchableControllerActions {
Reseller {
1 = xml
}
}
}
}
@@ -0,0 +1,214 @@
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="/typo3conf/ext/ep_theme/Resources/Public/images/favicon.ico">
<link rel="icon" type="image/x-icon" href="/typo3conf/ext/ep_theme/Resources/Public/images/favicon.ico">
<link rel="icon" type="image/gif" href="/typo3conf/ext/ep_theme/Resources/Public/images/favicon.gif">
<link rel="icon" type="image/png" href="/typo3conf/ext/ep_theme/Resources/Public/images/favicon.png">
<link rel="apple-touch-icon" href="/typo3conf/ext/ep_theme/Resources/Public/images/apple-touch-icon.png">
<link rel="apple-touch-icon" href="/typo3conf/ext/ep_theme/Resources/Public/images/apple-touch-icon-57x57.png" sizes="57x57">
<link rel="apple-touch-icon" href="/typo3conf/ext/ep_theme/Resources/Public/images/apple-touch-icon-60x60.png" sizes="60x60">
<link rel="apple-touch-icon" href="/typo3conf/ext/ep_theme/Resources/Public/images/apple-touch-icon-72x72.png" sizes="72x72">
<link rel="apple-touch-icon" href="/typo3conf/ext/ep_theme/Resources/Public/images/apple-touch-icon-76x76.png" sizes="76x76">
<link rel="apple-touch-icon" href="/typo3conf/ext/ep_theme/Resources/Public/images/apple-touch-icon-114x114.png" sizes="114x114">
<link rel="apple-touch-icon" href="/typo3conf/ext/ep_theme/Resources/Public/images/apple-touch-icon-120x120.png" sizes="120x120">
<link rel="apple-touch-icon" href="/typo3conf/ext/ep_theme/Resources/Public/images/apple-touch-icon-128x128.png" sizes="128x128">
<link rel="apple-touch-icon" href="/typo3conf/ext/ep_theme/Resources/Public/images/apple-touch-icon-144x144.png" sizes="144x144">
<link rel="apple-touch-icon" href="/typo3conf/ext/ep_theme/Resources/Public/images/apple-touch-icon-152x152.png" sizes="152x152">
<link rel="apple-touch-icon" href="/typo3conf/ext/ep_theme/Resources/Public/images/apple-touch-icon-180x180.png" sizes="180x180">
<link rel="apple-touch-icon" href="/typo3conf/ext/ep_theme/Resources/Public/images/apple-touch-icon-precomposed.png">
<link rel="icon" type="image/png" href="/typo3conf/ext/ep_theme/Resources/Public/images/favicon-16x16.png" sizes="16x16">
<link rel="icon" type="image/png" href="/typo3conf/ext/ep_theme/Resources/Public/images/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="/typo3conf/ext/ep_theme/Resources/Public/images/favicon-96x96.png" sizes="96x96">
<link rel="icon" type="image/png" href="/typo3conf/ext/ep_theme/Resources/Public/images/favicon-160x160.png" sizes="160x160">
<link rel="icon" type="image/png" href="/typo3conf/ext/ep_theme/Resources/Public/images/favicon-192x192.png" sizes="192x192">
<link rel="icon" type="image/png" href="/typo3conf/ext/ep_theme/Resources/Public/images/favicon-196x196.png" sizes="196x196">
)
# 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 = typo3_encore:EpThemeConfig:main
main.disableCompression = 1
}
includeJSFooter {
main = typo3_encore:EpThemeConfig:main
main.defer = 1
main.disableCompression = 1
}
10 = FLUIDTEMPLATE
10 {
file {
cObject = TEXT
cObject {
data = levelfield: -1, backend_layout_next_level, slide
override {
data = TSFE:page|backend_layout
}
ifEmpty = Default
split {
token = pagets__
1.current = 1
1.wrap = |
}
wrap = typo3conf/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}
}
}
[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]
[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]
#[applicationContext == "Development" || applicationContext == "Production/Staging"]
# page.headerData.990 >
# page.headerData.995 >
#[end]