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]>
Waiting 150 s at the end of every deploy is impractical. The flush right
after the switch stays; the window in which the previous release can
still fill the page cache is documented in deploy.php.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
E&P Events is retired; www and bare domain go to
www.ep-reisen.de/reisen-fuer-gruppen/gruppenreisen/firmenreisen/ (301).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
An alias of the ski-wochenenden vhost that the static docroot answered
regardless of the host; TYPO3 13 rejected it (trusted hosts pattern).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A vhost on current/public (alvac since today) keeps running the previous
release until PHP's realpath cache expires (120 s by default); pages it
rendered after the first flush stayed in the page cache with old paths.
A second flush 150 s after the switch (also after a rollback) removes them.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Pages cached while the other release was live survived the switch
(seen after the rollback test: alvac served old favicon paths until a
manual cache:flush). The flush task runs in current_path, which is the
new release after a deploy and the previous one after a rollback.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Ported unchanged from TYPO3 10's public/.htaccess, whose rules the static
docroots carry until the vhosts point at TYPO3 13; Force SSL as there.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The vhosts answer 403 for files behind the absolute symlink (tested on
staging); Deployer's shared dirs are relative and work. The task now
also checks that the link resolves.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
/typo3conf/ext/ep_theme|ep_products/Resources/Public/... is rewritten to
the _assets folder Composer publishes them to: the favicons and the
schema.org logo use that path, and so do links from outside. Today the
static docroots carry copies; after the vhost switch it would be 404.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
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]>
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]>
Restored from a46918d (the FAQ page /skireisen/infos/allgemeine-infos/faqs/);
markup matches TYPO3 10.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>