TYPO3 13 only accepts uploads whose extension is in textfile_ext,
mediafile_ext or miscfile_ext (security.system.enforceAllowedFileExtensions),
so the favicon.ico and site.webmanifest of a realfavicongenerator set were
rejected ("Resource consistency check failed"). Both are appended to
miscfile_ext in additional.php, which is deployed with the code;
settings.php, which production leads, stays untouched.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Every deploy replaced settings.php with the committed version, so changes
made in the production backend (extension configuration, install tool) were
lost with the next deploy or rollback. As LocalConfiguration.php on TYPO3 10,
it is now a shared file. typo3:settings:init seeds it once from the live
release; deploy:shared would otherwise seed it from the new release, i.e.
from git, and drop production's settings one last time.
The file is no longer tracked: it holds the encryptionKey and the install
tool password hash, and git has no use for it once production is leading.
Local copies stay in place (ignored).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The fresh TYPO3 13 installation got UTF8filesystem = true from the core's
factory configuration; TYPO3 10 ran with the default false, so uploads
turned umlauts into ASCII (Bärenhütte.jpg -> Baerenhuette.jpg) and no file
in sys_file has a non-ASCII name. With true and no UTF-8 system locale,
escapeshellarg() drops those characters and image processing misses the
file (environment check warning). Back to false: the TYPO3 10 behaviour,
no locale needed, and file URLs and CDN paths stay free of encoded umlauts.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
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]>
Since every page view goes through TYPO3 13, the page cache is on the hot
path; TYPO3 10 kept it in Redis, TYPO3 13 had it in MySQL. Same socket and
options as TYPO3 10, but databases 3-5 instead of 0-2, which may still
hold TYPO3 10 entries in a format TYPO3 13 must not read. DDEV gets the
redis add-on for the same setup locally.
Without a Redis connection the backend logs an alert and misses, so pages
still render (slower); a missing PHP redis extension, however, fails hard.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
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]>
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]>
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]>
- 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]>
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]>
- 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]>
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]>
additional.php is maintained in Git now (taken over from DDEV's
generated file): DDEV settings apply inside DDEV only, and
secrets.php (gitignored, template secrets.example.php) is merged in
everywhere, ignoring empty values. The web container reaches the local
MyE&P project as myep-next.ddev.site, as in EP/website.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- 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]>
- Site configs for the seven live sites from EP/website, Development
base variants on *-ep13.ddev.site (DDEV additional_hostnames)
- Webpack Encore build moved to the root, output in
packages/ep_theme/Resources/Public, public path /_assets/<hash>
- Search UI removed from the kept layouts and partials, as the static
export already does
- Daytrip room selection and the contingent chain removed (contingent
import is not ported; no daytrip product has current contingents)
- f:uri.action is final in v13: Uri\AjaxViewHelper invokes it
- Remaining QueryBuilder::execute() and array logicalAnd() calls,
addRootLineFields, TSFE getData, legacy typo3conf/ext template path
- Rector skips the plugin-to-CType rules; plugins stay list_type
Co-Authored-By: Claude Opus 5.5 <[email protected]>