Commit Graph
61 Commits
Author SHA1 Message Date
frommeandClaude Opus 5.5 d7374c697d fix: blog pagination no longer highlights the link to page 1
The TYPO3 10 paginator styled it bg-button--secondary, which looked like
the current page.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 13:47:06 +02:00
frommeandClaude Opus 5.5 99f9724574 feat: backend users see the TYPO3 13 frontend on staging.ep-reisen.de
Logged in to the staging backend (be_typo_user cookie of that host), the
frontend is no longer redirected to www, so pages can be checked before
they go live. Everyone else still gets the 301; the host sends
X-Robots-Tag: noindex.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 13:24:19 +02:00
frommeandClaude Opus 5.5 b48cbcd430 fix: new content element wizard offers only element types TYPO3 13 has
Occupancy calendar, event price table and deal of the week were not
ported (no visible uses), the newsletter form is retired.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 13:03:38 +02:00
frommeandClaude Opus 5.5 bf171285cd feat: FAQ overview element on TYPO3 13
Restored from a46918d (the FAQ page /skireisen/infos/allgemeine-infos/faqs/);
markup matches TYPO3 10.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 13:03:38 +02:00
frommeandClaude Opus 5.5 0cfd856894 chore: EXT:news default configuration
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 12:56:51 +02:00
frommeandClaude Opus 5.5 0b17a24edd feat: page module previews for teasers, disrupter, disturber, map and lineup
The TYPO3 10 drawItem hooks become one preview renderer registered per
CType in TCA; it renders the old templates from a46918d with the same
variables (f:format.html is not allowed in the backend: f:sanitize.html).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 12:56:22 +02:00
frommeandClaude Opus 5.5 44614a4a75 feat: blog on TYPO3 13 with EXT:news 14
News list, tag list and detail templates restored from a46918d; the
pagination widget is gone in news 14, so the TYPO3 10 paginator markup
now sits on the core sliding window pagination (pagination URLs change).
German labels for news committed. Production needs the news upgrade
wizards (the 5 plugin elements become the split news plugins).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 12:40:06 +02:00
frommeandClaude Opus 5.5 799dc03c75 feat: retire the group price calculator
MyE&P replaced it; TYPO3 only renders the price calendar. The element
stays in the database and renders nothing.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 12:35:28 +02:00
frommeandClaude Opus 5.5 ad4089ae16 feat: lineup element on TYPO3 13
Restored from a46918d, TCA ported to TYPO3 13; markup matches TYPO3 10.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 12:29:07 +02:00
frommeandClaude Opus 5.5 a042eff41d feat: hotel, region, city, country and concept plugins, FAQ, team, maps and price table on TYPO3 13
Controllers, templates and FlexForms restored from a46918d, ported with
Rector/Fractor and by hand (settings and rows missing from older
records read as empty, as PHP 7.4 did). They stay list_type plugins for
now. The pages match TYPO3 10 apart from data that changed since (dates,
prices, edited texts).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 12:27:26 +02:00
frommeandClaude Opus 5.5 53faeccb70 feat: front page, event front page and popup page layouts on TYPO3 13
Restored from a46918d unchanged.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 12:05:01 +02:00
frommeandClaude Opus 5.5 2999abc16c feat: contact, text with image, YouTube/Vimeo video, disrupter and map elements on TYPO3 13
Restored from a46918d, TCA ported to TYPO3 13. Their markup matches
TYPO3 10 on every page that renders. Headers with the default layout
stay hidden, as on TYPO3 10.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 12:05:01 +02:00
frommeandClaude Opus 5.5 49b96df21a feat: retire the newsletter form, newsletter subscription and reseller export
The elements stay in the database and render nothing, so their pages no
longer fail on TYPO3 13.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 11:52:34 +02:00
frommeandClaude Opus 5.5 9668f08b4c chore: X-Ep-Compare header renders failing elements as placeholders in development
Lets the TYPO3 10 comparisons check elements on pages that still hold
content types without a rendering definition.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 11:51:55 +02:00
frommeandClaude Opus 5.5 301e89e60c feat: teasers and the left/event sidebar page layouts on TYPO3 13
Templates restored from a46918d unchanged; TCA and TypoScript were
already there. The teaser markup matches TYPO3 10 on every page that
renders (image titles lose trailing whitespace).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 11:51:55 +02:00
frommeandClaude Opus 5.5 dfed542af1 chore: remove the gridelements migration and the address check table
The grids are migrated in production, and the production database is the
master that is never replaced by a TYPO3 10 dump, so ep:migrate-gridelements
has nothing left to do; its tx_gridelements_* columns are dropped. The
address check forms are gone (pages removed), and so is the table that
stored their submissions: personal data that has not been processed since
2019.

The tables and columns themselves are dropped by hand: extension:setup only
adds and changes.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-23 18:29:29 +02:00
frommeandClaude Opus 5.5 d86efd72e3 fix: ep:migrate-gridelements stops cleanly when the report cannot be written
An unwritable --report path ended in a TypeError from fputcsv() after the
counts were printed. The command now says so and exits with an error before
anything is migrated. Page titles in the report include hidden pages
(Connection::select() applied the frontend restrictions).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-23 18:07:05 +02:00
frommeandClaude Opus 5.5 119364dcaa fix: reference index update no longer fails on the job application forms
referenceindex:update stopped at tt_content with "The Prototype
applicationform was not found": the backend and the CLI (form editor,
FlexForm of the form plugin, reference index) read module.tx_form, and the
form setup was only registered for the frontend (plugin.tx_form). TYPO3 10
set module.tx_form in the site TypoScript; TYPO3 13 reads it only from
global TypoScript, so ext_localconf.php registers FormSetup.yaml there.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-23 17:47:57 +02:00
frommeandClaude Opus 5.5 4172ed978d feat: gridelements grids become container elements
TYPO3 13 does not know gridelements_pi1, so grids rendered nothing: the
inquiry form on /haus-christiler/ was missing. The five grid layouts are
container CTypes now (ep_container_halves, _thirds, _columns_quarters,
_half_and_two_quarters, _two_quarters_and_half; colPos 201-243) with the
TYPO3 10 templates ported. TwoQuartersAndHalf had no setup and output the
wrong columns; it renders its own columns now. As before, no container
inside these columns and the column rules of the old TSconfig apply.

ep:migrate-gridelements converts the data in place (plain SQL, idempotent,
--dry-run and --report): grids get their container CType, children in a
valid column move into it. Children in a column their layout lacks and
leftovers whose parent is no grid any more were invisible in TYPO3 10 and
are soft deleted. TYPO3 10 did not apply defaultHeaderType inside grids,
so text/textmedia/textpic children with header layout "default" get
"hidden" to keep their headers invisible.

Checked against TYPO3 10 on the 101 pages with grids that TYPO3 13 renders:
the container markup is identical; remaining differences are inside not
yet ported child elements.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-23 17:41:40 +02:00
frommeandClaude Opus 5.5 ea2eda5ee1 fix: palettes in record forms use the full width in the backend
TYPO3 13 lays out palette rows with more than four fields in sixth-width
columns and breaks the line after every second field, so the product form's
top palette showed up as a narrow column. Line breaks keep every row at four
fields or fewer (product, hotel, city).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-22 16:53:11 +02:00
frommeandClaude Opus 5.5 20225ad9e3 fix: /reiseinformationen/ without a travel info answers 404 instead of 500
The page holds only the travel info plugin, whose default action required
a travel info: opened without a slug or code it failed with "Required
argument travelInfo is not set" (TYPO3 10 did the same). The argument is
optional now and its absence gives the same 404 as an unknown slug or travel
code (notFound(), shared with travelCodeAction).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-22 15:47:19 +02:00
frommeandClaude Opus 5.5 ebc9925304 fix: office tip labels no longer warn when the author was deleted
21 of 53 office tips still point to team members who have left (deleted
records), so the backend label read 'name' from null: "Trying to access
array offset on null" in production. TYPO3 10 on PHP 7.4 printed an empty
name silently. The label is now the tip's text, with the author in brackets
only when the team member still exists; a tip record that cannot be found
(e.g. a new one) gives an empty title instead of a warning.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-22 15:46:04 +02:00
frommeandClaude Opus 5.5 48e049671e feat: search bar on TYPO3 13, loaded into the static pages, searching by GET
The search bar in the page header is back (SearchbarController, lib.searchBar
and lib.searchBarCollapsed), in the Subpage, SubpageSidebarRight and Detail
layouts as on TYPO3 10; product pages get the collapsed bar and its toggle
button in the main navigation again.

- The bar takes no arguments, so it is the same on every page of a site and
  cacheable. Page types 1706/1707 (/searchbar, /searchbar-collapsed on the
  ep-reisen root, also under /en/) render it alone for the static pages,
  which replace their exported bar with it via htmx. The suffixes have no
  leading slash: on the root page the route path has none, so "/searchbar"
  would never match (as /form and /snowreport do not there either).
- The form sends dateFrom, dateTo, pax, destinationType, destinationUid and
  priceRange by GET to the search page instead of POSTing to processSearch:
  no signed fields and no redirect, and URLs of about 100 characters instead
  of about 870. SearchController reads them (SEARCHBAR_PARAMETERS, excluded
  from the cHash; the results are not cached) and drops anything but a real
  Y-m-d date, which made DateUtility::formatDateRange() throw.
  processSearch is removed.
- The date range label is empty without arguments, so the template no longer
  needs ep:dateRange.

Compared with TYPO3 10: the bar's markup matches apart from the form (open,
collapsed, /en/); seven searches by GET load the same filter settings and
hit counts as the TYPO3 10 POST.

The static pages get the island from the exporter in EP/website, see
.ddev/plans/static-export-searchbar-island.patch (local only).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-22 15:43:24 +02:00
frommeandClaude Opus 5.5 b5637ba86e fix: hotels without a category no longer break product teasers
29 hotels have category 0, which has no label. The product teasers looked
the label up unguarded, an "Undefined array key 0" warning: a 500 in DDEV
(warnings are exceptions there), a logged warning in production. The
teaser and the hotel serializer now use null for an unknown category, as
SearchResultService and HotelDataService already do; TYPO3 10 ended up
with null as well.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-22 15:15:04 +02:00
frommeandClaude Opus 5.5 ca2fdc1e13 feat: snow reports on TYPO3 13, with a page type for the static pages
The snow report list ("Schneehöhen" plugin) is ported from TYPO3 10:
SnowreportController, SnowreportRepository::getSnowreportsForRegions(),
the plugin registration with its flexform (regions) and the template,
which now formats dates with d.m.Y.

Page type 1705 (/<page>/snowreport) renders only the snow report plugins
of a page, like /form for forms. The static pages of the hybrid setup can
load it to replace the snow reports frozen at export time; each list
carries id="snowreport-<content uid>" for hx-select, since TYPO3 10 gives
the plugin no element of its own. ep:import-snowreport already flushes
the page cache after each import. The suffix is in the PageType enhancer
of every site with snow reports.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

feat: the snow report box includes the spacing of its content element

id="snowreport-<content uid>" moves from the list to a wrapper around
ep:container. The static pages of the hybrid setup no longer export the
snow reports at all, only an empty placeholder that loads the whole box,
spacing included, from /<page>/snowreport, so a page never shows
outdated snow depths.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-22 14:19:53 +02:00
frommeandClaude Opus 5.5 62f3bee230 fix: forms on pages TYPO3 13 renders itself can be submitted
The .form-island wrapper existed only in the form page type (/form), so
on pages TYPO3 13 renders completely (e.g. the EP ambassador page) the
form's hx-target="closest .form-island" found nothing and submitting did
nothing. The island with its loading overlay now comes from the form
plugin's template (Render.html), on full pages and in /form alike; the
page type renders just the plugin again.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-22 12:45:32 +02:00
frommeandClaude Opus 5.5 f925c7f2d6 chore: commit the German language packs instead of fetching them on deploy
TYPO3's base distribution keeps var/labels in Git (!/var/labels in
.gitignore): the release build takes them from git archive, so deploys
no longer depend on the translation server. Update them with
"vendor/bin/typo3 language:update de" and commit the result.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-22 12:13:01 +02:00
frommeandClaude Opus 5.5 925e24397b feat: forms on TYPO3 13, loaded into the static pages with htmx
The static export replaced every EXT:form form with a contact notice. The
forms are back, rendered by TYPO3 13 and embedded in the static pages:

- Page type 1704 (/<page>/form) renders only the form plugin of a page,
  inside a .form-island element. Every form posts to that URL
  (renderingOptions.additionalParams), because on www the page URL is a
  static file that never reaches TYPO3. htmx swaps the island in place:
  validation errors, multi-step pages and confirmations. A redirect to an
  htmx request becomes HX-Redirect (HtmxRedirectMiddleware), so Redirect
  finishers send the browser to the thank-you page.
- While a request runs, an overlay with a spinner (as in MyE&P) covers
  the form. Styled inside the island: the static pages load the CSS of
  the TYPO3 10 export.
- The bw_captcha image comes from /<page>/captcha for the same reason.
  Both suffixes are in the PageType enhancer of every site with forms
  (semesterende gets one with default '' to keep its URLs).
- Ported from TYPO3 10: form setup, templates and partials, the MyE&P
  address finisher, the job application finisher with the MyE&P Team
  API client (epTeamApi* in secrets.php), the page URL/referrer finisher
  with ReferrerMiddleware (?ref=), the e-mail layout without the system
  footer, bw_captcha 5 and form_element_linked_checkbox 6. The address
  check forms are dropped.
- German language packs (EXT:form messages): availableLanguages = de,
  fetched on every deploy (typo3:language:update).
- The checkbox partials passed null to VHS' substring, which PHP 8.5
  reports as deprecated.
- DDEV no longer turns deprecations into exceptions, matching
  production: EXT:form's RenderFormValueViewHelper uses null as an array
  offset for empty optional fields (core bug, also in 13.4.37).

The static pages get their placeholders from the exporter in EP/website,
see .ddev/plans/static-export-form-islands.patch (local only).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-22 12:10:43 +02:00
fromme 59e4a2d49b chore: code cleanup 2026-10-22 11:10:37 +02:00
frommeandClaude Opus 5.5 bdc1bf4b9f fix: redirect the staging frontend to www.ep-reisen.de
staging.ep-reisen.de rendered every page through TYPO3 13 with its own
canonical URL, so search engines saw a full duplicate of the site. The
frontend now answers 301 to the same URL on www, which keeps serving its
mix of static export and TYPO3 13. The backend (/typo3) and the files it
loads (/_assets, /typo3temp, /fileadmin) as well as /.well-known stay on
staging. www never reads this .htaccess: its stub includes the release's
index.php directly.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-22 11:07:08 +02:00
frommeandClaude Opus 5.5 4d4baa1124 feat: port the snow report import (ep:import-snowreport)
Replaces the TYPO3 10 scheduler task, which stopped with PHP 7.4. Product
pages rendered by TYPO3 13 show the snow report of their region, so its data
has to be kept current here. Plain DBAL instead of Extbase persistence;
records are matched by vendor_uid and updated in place, so the regions keep
their snow report. Importing the feed TYPO3 10 imported last leaves every
column unchanged. The feed is kept in var/transient (shared) instead of
fileadmin, which still belongs to the TYPO3 10 installation.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 21:31:20 +02:00
frommeandClaude Opus 5.5 42e02095ce feat: restore the disturber content element, port the groups.swiss export
The 404 page (and other pages TYPO3 13 renders) contain disturber elements,
which logged 'no rendering definition' on every 404. The CType is back with
its TypoScript, templates and FlexForm; the TCA uses the TYPO3 13 API.

ep:groups-swiss replaces the TYPO3 10 scheduler tasks, which stopped with
PHP 7.4. It reads the calendar from MyE&P (contingents/calendar, synced from
bpn-connect) instead of bpn-connect directly, so it needs no new credentials,
and publishes all houses from groupsSwissHouses in secrets.php (or one house
given as arguments, as the scheduler tasks did). The ranges match the TYPO3 10
algorithm on 2000 random calendars; --dry-run shows them without sending.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 21:25:26 +02:00
frommeandClaude Opus 5.5 cdf04823b0 fix: no warnings when a hotel has no 4-person price in the event price table
The hotels of an event price table are sorted by their 4-person room price
(rooms are keyed by pax). Hotels without one raised 'Undefined array key 4' /
'array offset on null' on every request; they now compare as '' like PHP 7.4
read the missing offset, so the order is unchanged.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 21:20:09 +02:00
frommeandClaude Opus 5.5 bb1901fed6 fix: build theme assets before composer install
Composer publishes an extension's Resources/Public as public/_assets/<hash>
only if the directory exists when it runs. The theme's is created by the
asset build, so it has to run first; otherwise the release has no
_assets link for ep_theme and the theme CSS/JS answer 404. The build now
checks the link.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 19:18:47 +02:00
frommeandClaude Opus 5.5 4a9777c56a fix: deploy from the host, build inside DDEV
dep runs on the host with its SSH keys; the build (composer install,
npm ci, npm run build) runs through ddev exec, so Composer and Node are
the project's versions. Inside DDEV the commands run directly.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 19:10:03 +02:00
frommeandClaude Opus 5.5 64aa43c5af fix: define the TYPO3 deploy tasks in deploy.php
The recipe's task names differ between Deployer versions; with a
globally installed dep the deploy failed with 'Task
typo3:extension:setup not found'.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 18:55:30 +02:00
frommeandClaude Opus 5.5 178a5e6c14 feat: first deploy sets up the shared paths and the secrets template
typo3:secrets:init uploads secrets.example.php into shared/ when no
secrets.php exists (never overwrites one); typo3:secrets:check stops
the deploy before extension:setup while the database connection is
still missing. So the first "dep deploy prod" creates the structure and
stops before anything goes live.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 18:52:41 +02:00
frommeandClaude Opus 5.5 f6307d7552 fix: hybrid deploy without OPcache tool, tolerant of missing secrets
- No cachetool: its web adapter needs PHP below www.ep-reisen.de/typo3temp,
  which is the static docroot in the hybrid setup (blocked, and not the
  release's typo3temp). Not needed: the exporter's front controller stubs
  resolve the "current" symlink with readlink() on every request.
- additional.php only merges secrets.php when it returns an array:
  Deployer creates an empty shared file on the first deploy.
- public/.htaccess sets TYPO3_CONTEXT=Production/Staging for
  staging.ep-reisen.de, the smoke-test vhost.
- dep host:check: read-only checks of the host before the first deploy.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 18:08:17 +02:00
frommeandClaude Opus 5.5 67c32802dc feat: travel info on TYPO3 13
/reiseinformationen/{path segment} and /reiseinformationen/{travel code}
(travel info records combined with live travel data and pickup planning
from MyE&P). All of them answer 404 in production since the static
switch: the export never found these URLs.

Compared with TYPO3 10 (482 travel info pages, 40 travel codes, 20
fallbacks through the base code, unknown code): identical apart from
the content of the 404 page. The page without parameter fails on both,
as intended.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 17:34:37 +02:00
frommeandClaude Opus 5.5 fc98dc7d37 fix: optional table options default to what PHP 7.4 read
DateService reads options that callers only sometimes pass (paCode,
filterSettings, date, nonBookableDateUids, showBookingButton). Missing
keys were null on PHP 7.4; in_array() on null returned a falsy value,
so nonBookableDateUids defaults to an empty list. Fixes the event
price table (500).

All 216 distinct AJAX fragment URLs referenced from the TYPO3 10 pages
(date and price tables, event price tables, concept popups, filter
panel) were compared with TYPO3 10 on the same data: identical, apart
from daytripRooms, which fails on both.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 17:28:11 +02:00
frommeandClaude Opus 5.5 00034c99ae feat: watchlist on TYPO3 13
Watchlist page (/merkliste/) and its list action, which renders the
hotel/product pairs a visitor stored in sessionStorage. The "remember"
buttons on teasers and detail pages had nowhere to show their list
since the static switch.

Compared with TYPO3 10 (page, empty and invalid input, unknown and
1 to 25 real pairs): identical.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 17:28:10 +02:00
frommeandClaude Opus 5.5 214b4b6b86 chore: Deployer configuration for the production host
Built locally from the committed state (git archive, composer install
--no-dev, theme build) and synced with rsync, so the host needs neither
Composer nor Node. Shared: secrets.php, logs, locks, typo3temp/assets
and the MyE&P import baseline. fileadmin links to the production
fileadmin of the TYPO3 10 release, which the CDN origin serves.
extension:setup before the switch, OPcache and TYPO3 caches after it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 16:23:41 +02:00
frommeandClaude Opus 5.5 96a9c7217d chore: production-safe settings, development values only in DDEV
settings.php now holds production values (no debug, no devIPmask,
displayErrors off, warnings logged instead of thrown, deprecation log
off, sendmail, trustedHostsPattern for the production domains,
FE.compressionLevel 0 as the CDN compresses). The development values
moved into the DDEV block of additional.php. secrets.example.php gets
the production database connection.

Composer platform: PHP 8.5.12 (the version Hetzner rolls out).
Deployer 8 as dev dependency for the deployment.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 16:22:17 +02:00
frommeandClaude Opus 5.5 18d84d65b0 fix: import no longer writes fileadmin/products_import.info
The marker was display-only for the TYPO3 10 backend module, which is
not ported. Locally fileadmin is hardlinked from the TYPO3 10 project,
so writing it also changed that project's copy.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 15:47:51 +02:00
frommeandClaude Opus 5.5 72465053cd feat: product search on TYPO3 13
Search page (searchresult plugin), AJAX results and filter panel, the
mobile filter overlay, search links ("Alle anzeigen", menu icon) and
the /reiseauswahl/{name} landing redirects are back. The search bar in
the page header stays out (SearchbarController not ported); on detail
pages the menu icon links to the search page instead of toggling it.

- Extbase requests are immutable: withArgument() instead of
  setArgument()
- StaticSearchParamsMiddleware runs after site resolution and before
  page resolution (the old position is a cycle in v13); FilterService
  copes with the missing TypoScript there, as TYPO3 10 did
- Search and filter forms are sent URL-encoded instead of multipart, so
  production can keep rejecting multipart requests
- ski-wochenenden: websiteTitle from the old sys_template sitetitle

Compared with TYPO3 10 on the same data (249 cases: search pages with
all 41 preset filters, landing redirects, AJAX results and filter
panel, GET and POST): 186 identical, 63 with the same results in a
different order (PHP 8 sorts stably, ties came out in arbitrary order
on PHP 7.4). Processed image names differ by their configuration hash.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 15:47:15 +02:00
frommeandClaude Opus 5.5 18757781bb fix: content feed matches TYPO3 10 for news and sites
- News records: EXT:news is not installed, so the default restrictions
  lack its TCA; deleted, hidden, starttime and endtime are applied by
  hand (TYPO3 13 listed 37 deleted or hidden news in the manifest)
- Site config ski-wochenenden is back: the content feed lists it
  (contentFeedSites); DDEV host skiwe-ep13.ddev.site

Compared with the TYPO3 10 project on the same database (912 cases):
240 identical, 665 differ only because TYPO3 13 leaves out hidden
file references in image lists, 7 only in the order of MM relations
with equal sorting values.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 15:29:32 +02:00
frommeandClaude Opus 5.5 a912e0c614 fix: local MyE&P runs as myep.ddev.site
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 15:22:03 +02:00
frommeandClaude Opus 5.5 bc2a914b67 feat: ep:import-dates command on TYPO3 13
- Registered with #[AsCommand]; Configuration/Commands.php is no
  longer read
- Storage page of the imported records from the extension
  configuration (importStoragePid, 11 as in all site templates):
  frontend TypoScript is not available on the CLI in TYPO3 13
- The reseller and travel info page cache flush is gone with those
  plugins; the import still clears the page cache

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 15:19:13 +02:00
frommeandClaude Opus 5.5 5227da2381 fix: content feed manifest language codes on TYPO3 13
SiteLanguage::getTwoLetterIsoCode() is gone; the locale provides the
language code.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 15:17:57 +02:00
frommeandClaude Opus 5.5 c1b4979583 feat: price calendar and price table for group houses
Ports AjaxCalendarController::priceCalendarAction and priceTableAction
(MyE&P price config and price table), used on the /gruppe/gruppenhaus-*
pages and example trips. Page cache tags and "do not cache" on API
errors go through the frontend.cache.collector and
frontend.cache.instruction request attributes instead of TSFE.

Left out: priceConfig (no caller) and range (daytrip calendar via
bpn-connect, out of scope), so bpn-connect needs no credentials.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 15:11:12 +02:00