15 Commits
Author SHA1 Message Date
fromme 518f29b160 chore: install typo3 console extension 2026-10-31 10:39:13 +01:00
fromme e9bda426f2 chore: update project dependencies 2026-10-29 11:28:27 +01:00
frommeandClaude Opus 5.5 63e3ed4a78 feat: the iCal contingent feed for the booking portals is back
/contingents/<hotel>.ical (page type 1710) serves the same events as on
TYPO3 10: every run of BLOCKED or ON_REQUEST days with one status is one
"Unavailable" event. External booking portals import it.

The availability comes from MyE&P contingents/availability, the
bpn-connect snapshot without the price rule of contingents/calendar
(days without a price stay free here, as they did on TYPO3 10).
TYPO3 10 read bpn-connect directly. Compared for SVS, DPW and DGS: the
events are identical; the header differs only by the iCalcreator
version (2.41 instead of 2.39) and its TZUNTIL, both RFC-conform.

When MyE&P cannot answer, the feed returns 503 with Retry-After instead
of an empty calendar, so the portals keep their last import rather than
seeing every day as free. The response is sent past the page cache,
which would drop Content-Disposition, and staticfilecache is off for the
page type.

Requires the MyE&P endpoint on my.ep-reisen.de before deploying; until
then every feed answers 503.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 11:26:14 +01:00
frommeandClaude Opus 5.5 8f667e92ee chore: EXT:felogin removed
Not in use: no login form in the content, and no group grants it.
Its TypoScript and the felogin_login content type are gone with it;
the TypoScript of all other keys and the frontend output are unchanged.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 11:46:36 +01:00
frommeandClaude Opus 5.5 b39f17886f feat: bring back EXT:yoast_seo
Editors need its focus keyword and readability analysis in the page form.
Version 12.1 supports TYPO3 13.4 and keeps the existing tx_yoastseo_* data
of the TYPO3 10 database.

The deploy's extension:setup adds its new pages columns and tables. After
the deploy, run the upgrade wizard yoastDashboardWidgetMigrate (it moves the
yoast "pages without meta description" dashboard widget to the core one).

In the frontend, yoast adds WebSite and BreadcrumbList JSON-LD to every page.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-25 14:47:49 +01:00
frommeandClaude Opus 5.5 283f54c56c feat: EXT:staticfilecache serves cached pages without PHP again, as on TYPO3 10
Every page view goes through TYPO3 13 since the switch; staticfilecache
15.2 writes a gzip copy of each cacheable page, and the TYPO3 10 rewrite
rules in public/.htaccess let Apache deliver it directly (GET, no query
string, no backend login). Pages answer in about 2 ms instead of
0.5-4 s; static and dynamic output are identical for a sample of 22
sitemap URLs.

A flush of the pages cache group (travel data and snow report imports,
"clear frontend caches", deploys) removes the files; a page's own cache
lifetime still applies through the generated per-page .htaccess.

X-SFC-Tags is not passed on: with every record of a page as a tag it
reaches 100+ KB, more than Apache accepts from PHP-FPM, and it would
expose internal record ids. Debug headers stay off for the same reason.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 19:05:21 +02:00
frommeandClaude Opus 5.5 520feb003f feat: scheduler runs the imports and the housekeeping tasks again
typo3/cms-scheduler 13.4 replaces the three direct cron jobs with one
scheduler:run cron job. ep:scheduler-tasks (one-off, idempotent) soft-deletes
the TYPO3 10 tasks TYPO3 13 cannot run (import task classes that are gone, one
groups.swiss task per house with the API keys in the database, the retired
E&P Events log) and adds "Execute console commands" tasks for ep:import-dates,
ep:import-snowreport and ep:groups-swiss with the TYPO3 10 schedules. The core
garbage collection, IP anonymization and file indexing tasks keep working as
they are; tx_epproducts_log is registered for garbage collection again.

The first execution is the next cron match, so adding the tasks never starts
an import or a groups.swiss export right away.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 18:27:50 +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 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
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 34f2d55f2c fix: render product detail pages on TYPO3 13
- ObjectManager replaced by GeneralUtility::makeInstance(), the
  services fetched that way are public
- QueryBuilder::add('orderBy') and the remaining execute() calls,
  detailAction returns a response
- PHP 8 warnings for missing array keys (same values as on PHP 7.4)
- Webcam images are external URLs: plain img tag, f:image only takes
  FAL files
- typo3_encore 7 needs the PKG:ssch/typo3-encore: prefix and
  external = 1 so TYPO3's path check does not drop the entry
- CDN image rewriting as a middleware instead of EXT:replacer, which
  is not PHP 8.5 clean; same pattern, only for page responses
- vhs 8 for the ViewHelpers the templates use
- OpenGraph meta tag manager skips the backend
- myEpUrl with trailing slash as in production

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 14:34:10 +02:00
frommeandClaude Opus 5.5 1b958a6084 chore: set composer platform to production PHP 8.5.11
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 14:13:45 +02:00
frommeandClaude Opus 5.5 a46918de9d 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]>
2026-10-21 14:01:20 +02:00
frommeandClaude Opus 5.5 59afaecea1 chore: add container, encore, redirects and upgrade tooling
Adds b13/container and ssch/typo3-encore as the base for the theme,
typo3/cms-redirects for the existing sys_redirect records and
typo3/cms-lowlevel. Rector and Fractor are configured for the
TYPO3 10 to 13 migration of the packages.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 14:01:13 +02:00
Björn Fromme ae1ae3cb38 chore: initial commit of fresh project 2026-10-21 13:24:40 +02:00