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,8 @@
tt_content.button =< lib.contentElement
tt_content.button {
templateName = Button
variables {
referrerPid = TEXT
referrerPid.data = TSFE:id
}
}
@@ -0,0 +1,14 @@
tt_content.calendar =< lib.contentElement
tt_content.calendar {
templateName = Calendar
dataProcessing {
10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
10 {
table = tx_epproducts_domain_model_hotel
where.data = field:tx_eptheme_context_hotel
where.wrap = uid=|
pidInList = 5
as = hotel
}
}
}
@@ -0,0 +1,23 @@
tt_content.contact =< lib.contentElement
tt_content.contact {
templateName = Contact
dataProcessing {
10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
10 {
table = tx_epproducts_domain_model_teammember
where.data = field:tx_eptheme_contact
where.wrap = uid=|
pidInList = {$plugin.tx_eptheme.settings.teamMemberStoragePid}
as = contact
dataProcessing {
10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
10 {
references.fieldName = image
references.table = tx_epproducts_domain_model_teammember
as = image
}
}
}
}
}
@@ -0,0 +1,43 @@
tt_content.ep_container_halves =< lib.contentElement
tt_content.ep_container_halves {
templateName = Halves
templateRootPaths {
10 = EXT:ep_theme/Resources/Private/Templates/Container
}
dataProcessing {
100 = B13\Container\DataProcessing\ContainerProcessor
}
}
tt_content.ep_container_thirds =< lib.contentElement
tt_content.ep_container_thirds {
templateName = Thirds
templateRootPaths {
10 = EXT:ep_theme/Resources/Private/Templates/Container
}
dataProcessing {
100 = B13\Container\DataProcessing\ContainerProcessor
}
}
tt_content.ep_container_quarters =< lib.contentElement
tt_content.ep_container_quarters {
templateName = Quarters
templateRootPaths {
10 = EXT:ep_theme/Resources/Private/Templates/Container
}
dataProcessing {
100 = B13\Container\DataProcessing\ContainerProcessor
}
}
tt_content.ep_container_teasergroup =< lib.contentElement
tt_content.ep_container_teasergroup {
templateName = Teasergroup
templateRootPaths {
10 = EXT:ep_theme/Resources/Private/Templates/Container
}
dataProcessing {
100 = B13\Container\DataProcessing\ContainerProcessor
}
}
@@ -0,0 +1,28 @@
tt_content.disrupter =< lib.contentElement
tt_content.disrupter {
templateName = Disrupter
dataProcessing {
10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
10 {
table = tx_eptheme_domain_model_disrupter
pidInList = {$plugin.tx_eptheme.settings.disrupterStoragePid}
join = tx_eptheme_ttcontent_tx_eptheme_disrupter_mm ON tx_eptheme_ttcontent_tx_eptheme_disrupter_mm.uid_foreign = tx_eptheme_domain_model_disrupter.uid
where {
data = field:uid
intval = 1
wrap = tx_eptheme_ttcontent_tx_eptheme_disrupter_mm.uid_local=|
}
as = disrupter
dataProcessing {
10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
10 {
references.fieldName = image
references.table = tx_eptheme_domain_model_disrupter
as = image
}
20 = EP\EpTheme\DataProcessing\FlexFormProcessor
}
}
}
}
@@ -0,0 +1,13 @@
tt_content.deal_of_the_week =< lib.contentElement
tt_content.deal_of_the_week {
templateName = DealOfTheWeek
}
tt_content.disturber =< lib.contentElement
tt_content.disturber {
templateName = Disturber
dataProcessing {
10 = EP\EpTheme\DataProcessing\TeaserImageProcessor
20 = EP\EpTheme\DataProcessing\FlexFormProcessor
}
}
@@ -0,0 +1,10 @@
tt_content.event_pricetable =< lib.contentElement
tt_content.event_pricetable {
templateName = EventPricetable
variables {
forcePartnerIdSelect = TEXT
forcePartnerIdSelect.value = {$plugin.tx_eptheme.settings.forcePartnerIdSelect}
partnerIdSelectLabel = TEXT
partnerIdSelectLabel.value = {$plugin.tx_eptheme.settings.partnerIdSelectLabel}
}
}
@@ -0,0 +1,17 @@
tt_content.faq_overview =< lib.contentElement
tt_content.faq_overview {
templateName = FaqOverview
settings {
infoPageUid = {$plugin.tx_eptheme.settings.infoPageUid}
}
dataProcessing {
10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
10 {
table = tx_epproducts_domain_model_faq
where = category != ''
orderBy = category ASC, uid ASC
pidInList = {$plugin.tx_epproducts.settings.faqsStoragePid}
as = faqs
}
}
}
@@ -0,0 +1,23 @@
tt_content.gmap =< tt_content.teaser_product
tt_content.gmap {
templateName = Gmap
dataProcessing {
10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
10 {
table = tx_epproducts_domain_model_hotel
where.data = field:tx_eptheme_context_hotel
where.wrap = uid=|
pidInList = {$plugin.tx_epproducts.settings.hotelsStoragePid}
as = hotel
}
20 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
20 {
table = tx_epproducts_domain_model_region
where.data = field:tx_eptheme_context_region
where.wrap = uid=|
pidInList = {$plugin.tx_epproducts.settings.destinationsStoragePid}
recursive = 2
as = region
}
}
}
@@ -0,0 +1,24 @@
tt_content.lineup =< lib.contentElement
tt_content.lineup {
templateName = Lineup
dataProcessing {
10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
10 {
table = tx_eptheme_domain_model_lineup
where.data = field:uid
where.wrap = tt_content=|
orderBy = sorting
as = items
dataProcessing {
10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
10 {
references.fieldName = image
references.table = tx_eptheme_domain_model_lineup
as = image
}
}
}
}
}
@@ -0,0 +1,4 @@
tt_content.list.dataProcessing {
10 = EP\EpTheme\DataProcessing\FlexFormProcessor
}
@@ -0,0 +1,9 @@
tt_content.nlform =< lib.contentElement
tt_content.nlform {
templateName = NewsletterForm
variables {
formUrl = TEXT
formUrl.wrap = |/buchung/anmeldung_news.php
formUrl.data = site:base
}
}
@@ -0,0 +1,31 @@
tt_content.teaser =< lib.contentElement
tt_content.teaser {
templateName = Teaser
dataProcessing {
10 = EP\EpTheme\DataProcessing\ContextProcessor
20 = EP\EpTheme\DataProcessing\TeaserImageProcessor
}
settings.teaserTextMaxChars = {$plugin.tx_eptheme.settings.teaserTextMaxChars}
}
tt_content.teaser_country < lib.contentElement
tt_content.teaser_country {
templateName = TeaserCountry
dataProcessing {
10 = EP\EpTheme\DataProcessing\TeaserProcessor
}
settings.teaserTextMaxChars = {$plugin.tx_eptheme.settings.teaserTextMaxChars}
}
tt_content.teaser_region =< tt_content.teaser_country
tt_content.teaser_region.templateName = TeaserRegion
tt_content.teaser_city =< tt_content.teaser_country
tt_content.teaser_city.templateName = TeaserCity
tt_content.teaser_hotel =< tt_content.teaser_country
tt_content.teaser_hotel.templateName = TeaserHotel
tt_content.teaser_concept =< tt_content.teaser_country
tt_content.teaser_concept.templateName = TeaserConcept
tt_content.teaser_product =< tt_content.teaser_country
tt_content.teaser_product.templateName = TeaserProduct
tt_content.teaser_booking_link =< tt_content.teaser_product
tt_content.teaser_booking_link.templateName = TeaserBookingLink
@@ -0,0 +1,4 @@
tt_content.ytvideo =< lib.contentElement
tt_content.ytvideo {
templateName = YoutubeVideo
}
@@ -0,0 +1,24 @@
@import 'EXT:ep_products/Configuration/TypoScript/setup.typoscript'
plugin.tx_epproducts {
view {
layoutRootPaths.10 = EXT:ep_theme/Resources/Private/Layouts/Product/
templateRootPaths.10 = EXT:ep_theme/Resources/Private/Templates/
partialRootPaths.10 = EXT:ep_theme/Resources/Private/Partials/
}
settings {
teaserTextMaxChars = {$plugin.tx_eptheme.settings.teaserTextMaxChars}
infoPageUid = {$plugin.tx_eptheme.settings.infoPageUid}
defaultAjaxUid = {$plugin.tx_eptheme.settings.defaultAjaxUid}
defaultContactFormPageUid = {$plugin.tx_eptheme.settings.defaultContactFormPageUid}
phoneNumber = {$plugin.tx_eptheme.settings.phoneNumber}
bpnBookingUrlTemplateCode = {$plugin.tx_eptheme.settings.bpnBookingUrlTemplateCode}
showSkipassBadge = {$plugin.tx_eptheme.settings.showSkipassBadge}
ratingWidgetLabel = {$plugin.tx_eptheme.settings.ratingWidgetLabel}
skipassPageUid = {$plugin.tx_eptheme.settings.skipassPageUid}
conceptsPageUid = {$plugin.tx_eptheme.settings.conceptsPageUid}
mapTileUrl = {$plugin.tx_eptheme.settings.mapTileUrl}
mapApiKey = {$plugin.tx_eptheme.settings.mapApiKey}
mapAttribution = {$plugin.tx_eptheme.settings.mapAttribution}
}
}
@@ -0,0 +1,14 @@
@import 'EXT:fluid_styled_content/Configuration/TypoScript/setup.typoscript'
lib.contentElement {
layoutRootPaths.20 = EXT:ep_theme/Resources/Private/Layouts/FluidStyledContent
templateRootPaths.20 = EXT:ep_theme/Resources/Private/Templates/FluidStyledContent
partialRootPaths.20 = EXT:ep_theme/Resources/Private/Partials
settings < plugin.tx_eptheme.settings
settings.themekey = {$plugin.tx_eptheme.settings.themekey}
settings.defaultAjaxUid = {$plugin.tx_eptheme.settings.defaultAjaxUid}
settings.mapTileUrl = {$plugin.tx_eptheme.settings.mapTileUrl}
settings.mapApiKey = {$plugin.tx_eptheme.settings.mapApiKey}
settings.mapAttribution = {$plugin.tx_eptheme.settings.mapAttribution}
}
@@ -0,0 +1,30 @@
@import 'EXT:form/Configuration/TypoScript/setup.typoscript'
@import 'EXT:form_element_linked_checkbox/Configuration/TypoScript/setup.typoscript'
@import 'EXT:bw_captcha/Configuration/TypoScript/setup.typoscript'
plugin.tx_form.view {
templateRootPaths.10 = EXT:ep_theme/Resources/Private/Templates/Form/
}
plugin.tx_form.settings.yamlConfigurations {
1630994710 = EXT:ep_theme/Configuration/Yaml/FormsBase.yaml
1630994711 = EXT:ep_theme/Configuration/Yaml/FormFinishersFrontend.yaml
}
module.tx_form.settings.yamlConfigurations {
1630994710 = EXT:ep_theme/Configuration/Yaml/FormsBase.yaml
1630994711 = EXT:ep_theme/Configuration/Yaml/FormFinishersBackend.yaml
}
plugin.tx_bwcaptcha.settings {
charset = abcdefghjkmnpqrtuvwxy34679
length = 4
width = 220
height = 60
}
# Requests with a malformed type (e.g. ?type=03413) bypass the bw_captcha middleware's
# strict string check and get rendered as this empty PAGE. If it were cacheable, genuine
# ?type=3413 requests would hit that cache entry, TypoScript would never be parsed and
# the middleware would crash on empty settings.
captcha.config.no_cache = 1
@@ -0,0 +1,20 @@
@import 'EXT:gridelements/Configuration/TypoScript/setup.typoscript'
tt_content.gridelements_pi1.20.10.setup {
quarters < lib.gridelements.defaultGridSetup
quarters {
cObject = FLUIDTEMPLATE
cObject {
templateName = Quarters
templateRootPaths.0 = EXT:ep_theme/Resources/Private/Templates/Gridelements/
layoutRootPaths.0 = EXT:ep_theme/Resources/Private/Layouts/Gridelements/
partialRootPaths.0 = EXT:ep_theme/Resources/Private/Partials/
}
}
thirds < .quarters
thirds.cObject.templateName = Thirds
halves < .quarters
halves.cObject.templateName = Halves
halfAndTwoQuarters < .quarters
halfAndTwoQuarters.cObject.templateName = HalfAndTwoQuarters
}
@@ -0,0 +1,13 @@
@import 'EXT:news/Configuration/TypoScript/setup.txt'
plugin.tx_news {
view {
layoutRootPaths.100 = EXT:ep_theme/Resources/Private/Layouts/News/
templateRootPaths.100 = EXT:ep_theme/Resources/Private/Templates/News/
partialRootPaths.100 = EXT:ep_theme/Resources/Private/Partials/News/
widget.GeorgRinger\News\ViewHelpers\Widget\PaginateViewHelper.templateRootPath = EXT:ep_theme/Resources/Private/Templates/News/
}
settings {
tagListPageUid = {$plugin.tx_eptheme.settings.blogTagListPageUid}
}
}
@@ -0,0 +1,26 @@
config.tx_replacer {
enable_regex = 1
# Only images go to the CDN. The theme's own css/js/fonts are served by the production
# host: they are already minified by Webpack, gzipped by mod_deflate and content-hashed
# for a year of immutable browser caching, and keeping them on the page's own origin
# means they arrive over the connection the browser has already opened rather than
# costing a second DNS lookup and TLS handshake on the critical path.
#
# It also keeps them clear of the pull zone's habit of occasionally wedging a single
# cache key (10.0s -> 504 errorcode 106 until that key is purged, while the origin
# serves the same bytes in under 100ms). For an image that degrades one element; for
# js/main.<hash>.js it would take every visitor's JavaScript down.
#
# typo3temp is scoped to generated images on purpose - assets/compressed holds other
# extensions' concatenated css/js, which belongs on the origin for the same reason.
# The quote character is captured rather than matched literally, so url() values
# written with single quotes are rewritten too.
search {
10 = /(["'])\/?(fileadmin|uploads|typo3temp\/assets\/(?:_processed_|images))/
}
replace {
10 = $1https://cdn.ep-reisen.de/$2
}
}
@@ -0,0 +1,18 @@
@import 'EXT:seo/Configuration/TypoScript/XmlSitemap/setup.typoscript'
["{$plugin.tx_eptheme.settings.bookingLinksPid}" > "0"]
plugin.tx_seo {
config {
xmlSitemap {
sitemaps {
pages {
config {
excludedDoktypes = 4,1701,1702,1803
additionalWhere = AND pid NOT IN ({$plugin.tx_eptheme.settings.bookingLinksPid}) AND no_index = 0
}
}
}
}
}
}
[END]
@@ -0,0 +1,10 @@
@import 'EXT:typo3_encore/Configuration/TypoScript/setup.typoscript'
plugin.tx_typo3encore {
settings {
builds {
EpThemeConfig = EXT:ep_theme/Resources/Public
}
preload.enable = 0
}
}
@@ -0,0 +1,13 @@
lib.breadcrumb = HMENU
lib.breadcrumb {
special = rootline
special.range = 0|-1
1 = TMENU
1.wrap = <div class="hidden md:flex container mb-8 text-sm">|</div>
1.NO {
stdWrap.htmlSpecialChars = 1
ATagTitle.field = nav_title // title
linkWrap = |<span class="px-1">/</span>|*||*| |
doNotLinkIt = |*| 0 |*| 1
}
}
@@ -0,0 +1,49 @@
lib.dynamicContent = COA
lib.dynamicContent {
5 = LOAD_REGISTER
5 {
colPos.cObject = TEXT
colPos.cObject {
field = colPos
ifEmpty.cObject = TEXT
ifEmpty.cObject {
value.current = 1
ifEmpty = 0
}
}
pageUid.cObject = TEXT
pageUid.cObject {
field = pageUid
ifEmpty.data = TSFE:id
}
contentFromPid.cObject = TEXT
contentFromPid.cObject {
data = DB:pages:{register:pageUid}:content_from_pid
data.insertData = 1
}
wrap.cObject = TEXT
wrap.cObject {
field = wrap
}
}
20 = CONTENT
20 {
table = tt_content
select {
includeRecordsWithoutDefaultTranslation = 1
orderBy = sorting
where = colPos={register:colPos}
where.insertData = 1
pidInList.data = register:pageUid
pidInList.override.data = register:contentFromPid
}
stdWrap {
dataWrap = {register:wrap}
required = 1
}
}
90 = RESTORE_REGISTER
}
lib.dynamicContentSlide =< lib.dynamicContent
lib.dynamicContentSlide.20.slide = -1
@@ -0,0 +1,124 @@
lib.parseFunc {
makelinks = 1
makelinks {
http {
keep = path
extTarget = _blank
}
mailto {
keep = path
}
}
tags {
link = TEXT
link {
current = 1
typolink {
parameter {
data = parameters : allParams
}
extTarget = _blank
}
parseFunc.constants = 1
}
a = TEXT
a {
current = 1
typolink {
parameter.data = parameters:href
title.data = parameters:title
ATagParams.data = parameters:allParams
target.data = parameters:target
extTarget = _blank
extTarget.override.data = parameters:target
}
}
}
allowTags := addToList(a, abbr, acronym, address, article, aside, b, bdo)
allowTags := addToList(big, blockquote, br, caption, center, cite, code, col)
allowTags := addToList(colgroup, dd, del, dfn, dl, div, dt, em, font)
allowTags := addToList(footer, header, h1, h2, h3, h4, h5, h6, hr, i, img)
allowTags := addToList(ins, kbd, label, li, link, meta, nav, ol, p, pre, q)
allowTags := addToList(samp, sdfield, section, small, span, strike, strong)
allowTags := addToList(style, sub, sup, table, thead, tbody, tfoot, td, th)
allowTags := addToList(tr, title, tt, u, ul, var)
denyTags = *
sword = <span class="text-highlight">|</span>
constants = 1
nonTypoTagStdWrap {
HTMLparser = 1
HTMLparser {
keepNonMatchedTags = 1
htmlSpecialChars = 2
}
}
}
lib.parseFunc_RTE < lib.parseFunc
lib.parseFunc_RTE {
externalBlocks := addToList(article, aside, blockquote, div, dd, dl, footer)
externalBlocks := addToList(header, nav, ol, section, table, ul, pre, svg, use)
externalBlocks {
ol {
stripNL = 1
stdWrap {
parseFunc = < lib.parseFunc
}
}
ul {
stripNL = 1
stdWrap {
parseFunc = < lib.parseFunc
}
}
table {
stripNL = 1
stdWrap {
wrap = <div class="w-full overflow-x-scroll mb-4">|</div>
}
callRecursive = 1
callRecursive.tagStdWrap.HTMLparser = 1
callRecursive.tagStdWrap.HTMLparser.tags.table {
fixAttrib.class.default = w-full
}
HTMLtableCells = 1
HTMLtableCells {
default.stdWrap {
parseFunc = < lib.parseFunc_RTE
parseFunc {
nonTypoTagStdWrap {
encapsLines {
nonWrappedTag =
}
}
}
}
}
}
pre {
stripNL = 1
}
div {
stripNL = 1
callRecursive = 1
}
blockquote < .div
article < .div
aside < .div
footer < .div
header < .div
nav < .div
section < .div
dl < .div
dd < .div
}
nonTypoTagStdWrap.encapsLines >
nonTypoTagStdWrap {
HTMLparser = 1
HTMLparser {
keepNonMatchedTags = 1
htmlSpecialChars = 2
}
}
}
@@ -0,0 +1,21 @@
lib.searchBar = USER
lib.searchBar {
userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
extensionName = EpProducts
pluginName = searchbar
vendorName = EP
controller = Searchbar
action = index
switchableControllerActions {
Searchbar {
1 = index
}
}
settings =< plugin.tx_epproducts.settings
settings.searchPageUid < plugin.tx_epproducts.settings.defaultSearchPageUid
persistence =< plugin.tx_epproducts.persistence
view =< plugin.tx_epproducts.view
}
lib.searchBarCollapsed < lib.searchBar
lib.searchBarCollapsed.settings.collapsed = 1
@@ -0,0 +1,135 @@
lib.tue_sitemapcsv = COA_INT
lib.tue_sitemapcsv {
5 = TEXT
5 {
value (
"URL";"Latest change";"Doktype";"Title";"Nav Title";"Description"
)
}
10 = COA
10 {
10 = TEXT
10 {
typolink {
forceAbsoluteUrl = 1
parameter.field = uid
returnLast = url
}
wrap = "|";
replacement.10 {
search = "
replace = ""
}
}
20 = CONTENT
20 {
table = tt_content
select {
pidInList.field = uid
orderBy = tstamp DESC
languageField = sys_language_uid
max = 1
}
renderObj = COA
renderObj {
10 = TEXT
10 {
field = tstamp
date = c
postCObject = TEXT
postCObject {
field = tstamp
age = " Minutes| Hours| Days| Years| Minute| Hour| Day| Year"
noTrimWrap = | (vor |)|
}
if {
value.field = tstamp
isLessThan.data = DB:pages:{field:uid}:tstamp
isLessThan.data.insertData = 1
}
}
}
stdWrap {
ifEmpty.cObject < lib.tue_sitemapcsv.10.20.renderObj.10
ifEmpty.cObject.if >
replacement < lib.tue_sitemapcsv.10.10.replacement
wrap < lib.tue_sitemapcsv.10.10.wrap
}
}
30 = CASE
30 {
key.field = doktype
1 = TEXT
1.value = Standard
3 = TEXT
3.value = External URL
4 = TEXT
4.value = Shortcut
6 = TEXT
6.value = Backend User Section
stdWrap {
replacement < lib.tue_sitemapcsv.10.10.replacement
wrap < lib.tue_sitemapcsv.10.10.wrap
}
}
40 = TEXT
40 {
field = title
replacement < lib.tue_sitemapcsv.10.10.replacement
wrap < lib.tue_sitemapcsv.10.10.wrap
}
50 = TEXT
50 {
field = nav_title
replacement < lib.tue_sitemapcsv.10.10.replacement
wrap < lib.tue_sitemapcsv.10.10.wrap
}
60 = TEXT
60 {
field = description
replacement < lib.tue_sitemapcsv.10.10.replacement
wrap < lib.tue_sitemapcsv.10.10.wrap
}
100 = TEXT
100 {
value (
)
}
}
20 = HMENU
20 {
includeNotInMenu = 1
1 = TMENU
1 {
noBlur = 1
expAll = 1
NO {
doNotShowLink = 1
allStdWrap.cObject < lib.tue_sitemapcsv.10
}
}
2 < .1
3 < .1
4 < .1
5 < .1
6 < .1
}
}
[backend.user.isLoggedIn]
sitemapcsv = PAGE
sitemapcsv {
typeNum = 888
config {
disableAllHeaderCode = 1
xhtml_cleaning = 0
admPanel = 0
debug = 0
additionalHeaders = Content-type:text/csv;charset=utf-8|Content-Disposition:attachment; filename="sitemap.csv"
}
10 < lib.tue_sitemapcsv
}
[END]
@@ -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]
@@ -0,0 +1,202 @@
# customsubcategory=100=Social links
# customsubcategory=200=Navigations and page UIDs
# customsubcategory=300=Google related
# customsubcategory=400=Contact data
# customsubcategory=500=Template
# customsubcategory=600=XML Sitemap
# customsubcategory=700=Event dates
# customsubcategory=800=Badges
# customsubcategory=900=MyE&P config
plugin.tx_eptheme {
settings {
# cat=eptheme/200/10; type=string; label=Theme key
themekey = ep
# cat=eptheme/200/100; type=string; label=Top navigation PID
topNavPid =
# cat=eptheme/200/110; type=string; label=Main navigation PID
mainNavPid =
# cat=eptheme/200/115; type=string; label=Mobile navigation PID
mobileNavPid =
# cat=eptheme/200/120; type=string; label=Footer navigation PID
footerNavPid =
# cat=eptheme/200/130; type=string; label=Default homepage UID
defaultHomeUid =
# cat=eptheme/200/131; type=string; label=Main site PID
mainSitePid =
# cat=eptheme/200/135; type=string; label=Link to apply to logo (overrides defaultHomeUid)
logoLink =
# cat=eptheme/200/140; type=string; label=Default page UID for ajax requests
defaultAjaxUid =
# cat=eptheme/200/150; type=string; label=Default contact form page UID
defaultContactFormPageUid =
# cat=eptheme/200/160; type=string; label=Legal notice page UID
legalNoticePageUid =
# cat=eptheme/200/170; type=string; label=Terms and conditions page UID
termsAndConditionsPageUid =
# cat=eptheme/200/180; type=string; label=Data protection page UID
dataProtectionPageUid =
# cat=eptheme/200/185; type=string; label=Image credits page UID
imageCreditsPageUid =
# cat=eptheme/200/190; type=string; label=Cookie policy page UID
cookiePolicyPageUid =
# cat=eptheme/200/200; type=string; label=FAQ page UID
faqPageUid =
# cat=eptheme/200/210; type=string; label=Info page UID
infoPageUid =
# cat=eptheme/200/220; type=string; label=Groups page UID
groupsPageUid =
# cat=eptheme/200/225; type=string; label=Blog detail page UID
blogDetailPageUid =
# cat=eptheme/200/230; type=string; label=Blog tag list page UID
blogTagListPageUid =
# cat=eptheme/200/240; type=string; label=Groups contact form page UID
groupsContactFormPageUid =
# cat=eptheme/200/250; type=string; label=Rating page UID
ratingPageUid =
# cat=eptheme/200/260; type=string; label=Watchlist page UID
watchlistPageUid =
# cat=eptheme/200/270; type=string; label=Skipass info page UID
skipassPageUid =
# cat=eptheme/200/280; type=string; label=English page UID
englishPageUid =
# cat=eptheme/200/285; type=string; label=German page UID
germanPageUid =
# cat=eptheme/200/290; type=string; label=Concepts page UID
conceptsPageUid =
# cat=eptheme/200/300; type=string; label=My E&P page UID
myEpPageUid =
# cat=eptheme/200/310; type=string; label=Booking links PID
bookingLinksPid =
# cat=eptheme/200/330; type=string; label=Groups price popup page UID
groupsPricePopupPageUid =
# cat=eptheme/200/340; type=string; label='Reisen Alert' page UID
travelAlertPageUid =
# cat=eptheme/200/350; type=string; label='Corona Updates' page UID
coronaUpdatesPageUid =
# cat=eptheme/500/100; type=string; label=Map tile URL template (without apiKey)
mapTileUrl = https://api-eu.geoapify.com/v1/tile/osm-bright/{z}/{x}/{y}.png
# cat=eptheme/500/110; type=string; label=Map tile API key (Geoapify), restricted by referrer
mapApiKey =
# cat=eptheme/500/120; type=string; label=Map attribution (Geoapify and OpenStreetMap credits are both required)
mapAttribution = Powered by <a href="https://www.geoapify.com/">Geoapify</a> | &copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors
# cat=eptheme/400/100; type=string; label=Phone number general
phoneNumber = 0221 - 272 276 0
# cat=eptheme/400/110; type=string; label=Phone number WhatsApp
whatsApp = 0221 - 272 276 0
# cat=eptheme/400/100; type=string; label=Phone number general
phoneNumberLink = +492212722760
# cat=eptheme/400/110; type=string; label=Phone number WhatsApp
whatsAppNumberLink = https://wa.me/492212722760
# cat=eptheme/400/120; type=string; label=Business hours days
businessHoursDays = Montag - Freitag
# cat=eptheme/400/130; type=string; label=Business hours time
businessHoursTime = 08:30 bis 18:30
# cat=eptheme/400/140; type=string; label=Contact form email to
contactFormToEmail =
# cat=eptheme/400/150; type=string; label=Contact form name to
contactFormToName =
# cat=eptheme/400/160; type=boolean; label=Enable contact form autoreply
enableContactFormAutoreply = 0
# cat=eptheme/400/170 type=string; label=Contact form autoreply subject
contactFormAutoreplySubject = Ihre Anfrage bei E&P Reisen
# cat=eptheme/100/100; type=string; label=Facebook URL
facebookUrl =
# cat=eptheme/100/120; type=string; label=Instagram URL
instagramUrl =
# cat=eptheme/100/130; type=string; label=YouTube URL
youtubeUrl =
# cat=eptheme/100/135; type=string; label=tiktok URL
tiktokUrl = https://www.tiktok.com/@ep_reisen
# cat=eptheme/100/140; type=string; label=Facebook ViewContent 'product uid'
facebookViewContentProductUid =
# cat=eptheme/100/150; type=string; label=Facebook ViewContent 'name internal'
facebookViewContentNameInternal =
# cat=eptheme; type=string; label=Slider storage PID
sliderStoragePid =
# cat=eptheme; type=string; label=Teammember storage PID
teamMemberStoragePid =
# cat=eptheme; type=string; label=Disrupter storage PID
disrupterStoragePid =
# cat=eptheme/500/100; type=string; label=Teasertext max characters
teaserTextMaxChars = 120
# cat=eptheme/500/110; type=string; label=Default bodyclass
defaultBodyclass = subpage
# cat=eptheme/500/120; type=string; label=Logo image
logoImage = EXT:ep_theme/Resources/Public/images/logo_wide.svg
# cat=eptheme/500/130; type=string; label=Force active topnav uid
forceActiveTopnavUid =
# cat=eptheme/500/140; type=string; label=Booking URL template code
bpnBookingUrlTemplateCode = base
# cat=eptheme/500/150; type=string; label=Search page header image
searchPageHeaderImage =
# cat=eptheme/500/160; type=string; label=Rating widget label
ratingWidgetLabel = Reisebewertung
# cat=eptheme/500/170; type=boolean; label=Hide area/top navigation
hideAreaNavigation = 0
# cat=eptheme/500/170; type=boolean; label=Hide searchbar
hideSearchbar = 0
# cat=eptheme/500/180; type=string; label=Global concept code
globalConceptCode =
# cat=eptheme/800/100; type=boolean; label=Show 'skipass inklusive' badge
showSkipassBadge = 1
# cat=eptheme/800/100; type=string; label=Custom badge storage PID
badgeStoragePid =
# cat=eptheme/600/100; type=string; label=XML sitemap root page UID
xmlSitemapRootPageUid =
# cat=eptheme/600/110; type=string; label=XML sitemap page UIDs to exclude
xmlSitemapExcludeUids =
# cat=eptheme/600/120; type=string; label=CTypes left out of the chatbot content-only page type (quoted, comma-separated)
contentOnlyExcludedCTypes = 'list','form_formframework','menu_subpages','teaser_product','teaser_hotel','teaser_concept','teaser_country','teaser_region','ep_container_teasergroup'
# cat=eptheme/300/100; type=string; label=Cookiefirst Script
cookieFirstScriptUrl = https://consent.cookiefirst.com/sites/ep-reisen.de-fabb1554-8932-4075-85dc-97fa68892918/consent.js
# cat=eptheme/300/110; type=string; label=Google Static Maps Base Url
googleStaticMapsBaseUrl = https://maps.googleapis.com/maps/api/staticmap?key=AIzaSyDDOforD1O_j4xXy2nJybC2yQqbUAw9ClY
# cat=eptheme/300/120; type=string; label=Google Maps Js API Url
googleMapsJsApiUrl = https://maps.googleapis.com/maps/api/js?key=AIzaSyDDOforD1O_j4xXy2nJybC2yQqbUAw9ClY
# cat=eptheme/300/120; type=string; label=Google Maps Js API Url
googleMapsApiKey = AIzaSyDDOforD1O_j4xXy2nJybC2yQqbUAw9ClY
# cat=eptheme/300/130; type=string; label=Canonical base URL/Domain
canonicalBaseUrl = https://www.ep-reisen.de
# cat=eptheme.events/700/100; type=string; label=Event date day from
eventDateDayFrom =
# cat=eptheme.events/700/110; type=string; label=Event date day to
eventDateDayTo =
# cat=eptheme.events/700/120; type=string; label=Event date month
eventDateMonth =
# cat=eptheme.events; type=string; label=Event herounit claim
eventHeroClaim =
# cat=eptheme.events; type=string; label=Event herounit description
eventHeroDescription =
# cat=eptheme.events; type=string; label=Event disturber headline
eventDisturberHeadline = Absolut<br>Unschlagbarer<br>Preis
# cat=eptheme.events; type=string; label=Event disturber list items
eventDisturberListitems = 7 Übernachtungen in Top Apartments;6 Tage Skipass Val Thoerens;Ski & Boarderweek Event-Ticket
# cat=eptheme.events; type=string; label=Event disturber button label
eventDisturberButtonLabel = Jetzt ab 249€ buchen
# cat=eptheme.events; type=string; label=Event disturber button link
eventDisturberButtonLink =
# cat=eptheme.events; type=boolean; label=Force Partner ID selection
forcePartnerIdSelect =
# cat=eptheme.events; type=string; label=Partner ID selection label
partnerIdSelectLabel =
}
}
@import 'EXT:fluid_styled_content/Configuration/TypoScript/constants.typoscript'
@import 'EXT:ep_products/Configuration/TypoScript/constants.typoscript'
@import 'EXT:gridelements/Configuration/TypoScript/constants.typoscript'
@import 'EXT:seo/Configuration/TypoScript/XmlSitemap/constants.typoscript'
@import 'EXT:typo3_encore/Configuration/TypoScript/constants.typoscript'
@import 'EXT:news/Configuration/TypoScript/constants.txt'
@import 'EXT:bw_captcha/Configuration/TypoScript/constants.typoscript'
@@ -0,0 +1,125 @@
@import 'EXT:ep_theme/Configuration/TypoScript/Extensions/*'
@import 'EXT:ep_theme/Configuration/TypoScript/Library/*'
@import 'EXT:ep_theme/Configuration/TypoScript/ContentElements/*'
plugin.tx_eptheme {
settings < lib.contentElement.settings
settings {
themekey = {$plugin.tx_eptheme.settings.themekey}
footerNavPid = {$plugin.tx_eptheme.settings.footerNavPid}
mainNavPid = {$plugin.tx_eptheme.settings.mainNavPid}
mobileNavPid = {$plugin.tx_eptheme.settings.mobileNavPid}
topNavPid = {$plugin.tx_eptheme.settings.topNavPid}
legalNoticePageUid = {$plugin.tx_eptheme.settings.legalNoticePageUid}
termsAndConditionsPageUid = {$plugin.tx_eptheme.settings.termsAndConditionsPageUid}
dataProtectionPageUid = {$plugin.tx_eptheme.settings.dataProtectionPageUid}
imageCreditsPageUid = {$plugin.tx_eptheme.settings.imageCreditsPageUid}
cookiePolicyPageUid = {$plugin.tx_eptheme.settings.cookiePolicyPageUid}
infoPageUid = {$plugin.tx_eptheme.settings.infoPageUid}
groupsPageUid = {$plugin.tx_eptheme.settings.groupsPageUid}
facebookUrl = {$plugin.tx_eptheme.settings.facebookUrl}
youtubeUrl = {$plugin.tx_eptheme.settings.youtubeUrl}
tiktokUrl = {$plugin.tx_eptheme.settings.tiktokUrl}
instagramUrl = {$plugin.tx_eptheme.settings.instagramUrl}
phoneNumber = {$plugin.tx_eptheme.settings.phoneNumber}
whatsApp = {$plugin.tx_eptheme.settings.whatsApp}
phoneNumberLink = {$plugin.tx_eptheme.settings.phoneNumberLink}
whatsAppNumberLink = {$plugin.tx_eptheme.settings.whatsAppNumberLink}
businessHoursDays = {$plugin.tx_eptheme.settings.businessHoursDays}
businessHoursTime = {$plugin.tx_eptheme.settings.businessHoursTime}
teaserTextMaxChars = {$plugin.tx_eptheme.settings.teaserTextMaxChars}
faqPageUid = {$plugin.tx_eptheme.settings.faqPageUid}
defaultHomeUid = {$plugin.tx_eptheme.settings.defaultHomeUid}
mainSitePid = {$plugin.tx_eptheme.settings.mainSitePid}
logoLink = {$plugin.tx_eptheme.settings.logoLink}
defaultAjaxUid = {$plugin.tx_eptheme.settings.defaultAjaxUid}
defaultContactFormPageUid = {$plugin.tx_eptheme.settings.defaultContactFormPageUid}
defaultSearchPageUid = {$plugin.tx_epproducts.settings.defaultSearchPageUid}
defaultDetailPageUid = {$plugin.tx_epproducts.settings.defaultDetailPageUid}
coronaUpdatesPageUid = {$plugin.tx_eptheme.settings.coronaUpdatesPageUid}
logoImage = {$plugin.tx_eptheme.settings.logoImage}
forceActiveTopnavUid = {$plugin.tx_eptheme.settings.forceActiveTopnavUid}
eventDateDayFrom = {$plugin.tx_eptheme.settings.eventDateDayFrom}
eventDateDayTo = {$plugin.tx_eptheme.settings.eventDateDayTo}
eventDateMonth = {$plugin.tx_eptheme.settings.eventDateMonth}
eventHeroClaim = {$plugin.tx_eptheme.settings.eventHeroClaim}
eventHeroDescription = {$plugin.tx_eptheme.settings.eventHeroDescription}
eventDisturberHeadline = {$plugin.tx_eptheme.settings.eventDisturberHeadline}
eventDisturberListitems = {$plugin.tx_eptheme.settings.eventDisturberListitems}
eventDisturberButtonLabel = {$plugin.tx_eptheme.settings.eventDisturberButtonLabel}
eventDisturberButtonLink = {$plugin.tx_eptheme.settings.eventDisturberButtonLink}
cookieFirstScriptUrl = {$plugin.tx_eptheme.settings.cookieFirstScriptUrl}
bpnBookingUrlTemplateCode = {$plugin.tx_eptheme.settings.bpnBookingUrlTemplateCode}
groupsPricePopupPageUid = {$plugin.tx_eptheme.settings.groupsPricePopupPageUid}
googleStaticMapsBaseUrl = {$plugin.tx_eptheme.settings.googleStaticMapsBaseUrl}
googleMapsJsApiUrl = {$plugin.tx_eptheme.settings.googleMapsJsApiUrl}
googleMapsApiKey = {$plugin.tx_eptheme.settings.googleMapsApiKey}
datePickerPresets < plugin.tx_epproducts.settings.datePickerPresets
searchPageHeaderImage = {$plugin.tx_eptheme.settings.searchPageHeaderImage}
ratingWidgetLabel = {$plugin.tx_eptheme.settings.ratingWidgetLabel}
hideAreaNavigation = {$plugin.tx_eptheme.settings.hideAreaNavigation}
hideSearchbar = {$plugin.tx_eptheme.settings.hideSearchbar}
showSkipassBadge = {$plugin.tx_eptheme.settings.showSkipassBadge}
forcePartnerIdSelect = {$plugin.tx_eptheme.settings.forcePartnerIdSelect}
contactFormToEmail = {$plugin.tx_eptheme.settings.contactFormToEmail}
contactFormToName = {$plugin.tx_eptheme.settings.contactFormToName}
enableContactFormAutoreply = {$plugin.tx_eptheme.settings.enableContactFormAutoreply}
contactFormAutoreplySubject = {$plugin.tx_eptheme.settings.contactFormAutoreplySubject}
groupsContactFormPageUid = {$plugin.tx_eptheme.settings.groupsContactFormPageUid}
blogDetailPageUid = {$plugin.tx_eptheme.settings.blogDetailPageUid}
ratingPageUid = {$plugin.tx_eptheme.settings.ratingPageUid}
watchlistPageUid = {$plugin.tx_eptheme.settings.watchlistPageUid}
skipassPageUid = {$plugin.tx_eptheme.settings.skipassPageUid}
englishPageUid = {$plugin.tx_eptheme.settings.englishPageUid}
germanPageUid = {$plugin.tx_eptheme.settings.germanPageUid}
conceptsPageUid = {$plugin.tx_eptheme.settings.conceptsPageUid}
globalConceptCode = {$plugin.tx_eptheme.settings.globalConceptCode}
travelAlertPageUid = {$plugin.tx_eptheme.settings.travelAlertPageUid}
myEpPageUid = {$plugin.tx_eptheme.settings.myEpPageUid}
myEpApiEndpointUrl = {$plugin.tx_eptheme.settings.myEpApiEndpointUrl}
myEpApiToken = {$plugin.tx_eptheme.settings.myEpApiToken}
myEpApiTimeout = {$plugin.tx_eptheme.settings.myEpApiTimeout}
facebookViewContentValues {
productUid = {$plugin.tx_eptheme.settings.facebookViewContentProductUid}
nameInternal = {$plugin.tx_eptheme.settings.facebookViewContentNameInternal}
}
domainsToTrack = bpn.ep-reisen.de,www.ski-boarderweek.de,www.ski-wochenenden.de,www.snowzone.net,www.unichamp.de
}
view {
templateRootPaths.0 = EXT:ep_theme/Resources/Private/Templates
partialRootPaths.0 = EXT:ep_theme/Resources/Private/Partials
layoutRootPaths.0 = EXT:ep_theme/Resources/Private/Layouts
}
}
# Enable section index menus on invisible pages
tt_content.menu_section.dataProcessing.10.includeNotInMenu = 1
@import 'EXT:ep_theme/Configuration/TypoScript/Page/*'
config {
compressJs = 1
compressCss = 1
typolinkCheckRootline = 1
typolinkEnableLinksAcrossDomains = 1
sendCacheHeaders = 1
content_from_pid_allowOutsideDomain = 1
inlineStyle2TempFile = 0
additionalHeaders {
# 10 {
# header = Content-Security-Policy: default-src 'self' 'unsafe-inline'; connect-src 'self' https://my.ep-reisen.de/;
# }
20 {
header = Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
}
30 {
header = X-Frame-Options: sameorigin
}
40 {
header = Referrer-Policy: same-origin
}
50 {
header = Permissions-Policy: microphone=(), camera=()
}
}
}