[!!!][TASK] 2.0 – Drop legacy layer, require TYPO3 v13/v14 - #53
Open
davidsteeb wants to merge 9 commits into
Open
[!!!][TASK] 2.0 – Drop legacy layer, require TYPO3 v13/v14#53davidsteeb wants to merge 9 commits into
davidsteeb wants to merge 9 commits into
Conversation
BREAKING: drops support for TYPO3 v10, v11 and v12 (and PHP < 8.2). - Remove legacy PageLayoutView hook (BackendPreviewRenderer) and its registration; v12+ always uses the previewRenderer. - Remove ext_tables.php (only registered the < v12 backend skin). - Reduce ext_localconf.php to the (now unconditional) stylesheet entry. - Remove BootCompleted listener (registered unused Fontawesome icons). - ContentPreview: render previews via ViewFactoryInterface on both the RecordInterface (v14) and the array (v13) path, dropping StandaloneView. - DatabaseRowService: drop the pre-v12 manual file-field fallback. - GetDatabaseRecordViewHelper: drop the v12 QueryBuilder::add() branch. - CI/PHPStan: drop the v12 matrix entry, config and baseline; regenerate the v14 baseline (12 -> 3 entries). - Bump constraints: PHP ^8.2, TYPO3 ^13.4 || ^14.3, version 2.0.0. Relates: BEXT-596
Relates: BEXT-596
davidsteeb
requested review from
achimfritz and
bmack
and removed request for
achimfritz
June 11, 2026 15:02
The previous regeneration ran against a broken local v13 vendor state (mixed v13/v14), producing v14-style entries. Restore the actual v13 errors reported by CI (instanceof-always-false + checkRecordEditAccess), which differ from the v14 baseline. Relates: BEXT-596
achimfritz
approved these changes
Jun 12, 2026
There was a problem hiding this comment.
Pull request overview
This PR prepares the extension’s 2.0 release by removing the legacy TYPO3 v10/v11/v12 compatibility layer and raising the minimum requirements to TYPO3 v13/v14 with PHP 8.2+, simplifying backend preview rendering to rely on the modern ViewFactory-based approach.
Changes:
- Dropped legacy registration/hook paths (
ext_tables.php, legacy hook class, unused boot listener) and simplifiedext_localconf.php. - Refactored backend preview rendering to use
ViewFactoryInterfaceon both v13 (array record) and v14 (Record API) paths; removedStandaloneView. - Updated version/constraints and CI/PHPStan configs to target TYPO3 13/14 only.
Reviewed changes
Copilot reviewed 18 out of 18 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| ext_tables.php | Removed legacy (< v12) backend skin registration. |
| ext_localconf.php | Simplified to unconditional backend stylesheet registration. |
| ext_emconf.php | Bumped extension version and raised TYPO3 dependency range. |
| Configuration/Services.yaml | Removed DI entries for dropped legacy hook/listener classes. |
| composer.json | Bumped version and raised PHP/TYPO3 requirements. |
| Classes/ViewHelpers/GetDatabaseRecordViewHelper.php | Simplified ordering logic for UID list ordering. |
| Classes/Service/DatabaseRowService.php | Removed pre-v12 file-field fallback logic; simplified file field resolving. |
| Classes/Listener/BootCompleted.php | Removed unused icon registration listener. |
| Classes/Hooks/BackendPreviewRenderer.php | Removed deprecated hook-based renderer. |
| Classes/Backend/Preview/StandardContentPreviewRenderer.php | Updated legacy render call to pass PageLayoutContext. |
| Classes/Backend/Preview/ContentPreview.php | Refactored to shared createView() + unified ViewFactory rendering path; removed StandaloneView. |
| Build/phpstan13.neon | Removed excludes related to removed legacy hook file. |
| Build/phpstan12.neon | Removed TYPO3 12 PHPStan config. |
| Build/phpstan.neon | Removed excludes related to removed legacy hook file. |
| Build/phpstan-baseline13.neon | Cleaned baseline entries tied to removed code paths. |
| Build/phpstan-baseline12.neon | Removed TYPO3 12 baseline. |
| Build/phpstan-baseline.neon | Cleaned baseline entries tied to removed code paths. |
| .github/workflows/ci.yml | Removed TYPO3 12 from CI matrix and related steps. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
extendRow() runs on v13 only, so the "-visible" counts it added are dropped: v14 has no equivalent, and neither the extension's own partials nor a consumer template reads them. With the minimum at v13.4 the getMajorVersion() < 13 branch in getAdditionalDataForView() cannot be reached either, so the condition is just the missing context now. ORDER BY FIELD() is MySQL and MariaDB only. The record order is built as a CASE expression instead, which holds on PostgreSQL and SQLite as well. The uids come from intExplode() and are integers, so inlining them is safe. Pre-existing, this cleanup only moved the line. Relates: BEXT-596
lolli42
force-pushed
the
BEXT-596-cleanup-v13-v14
branch
from
September 9, 2026 13:32
8864674 to
1a1ff00
Compare
lolli42
approved these changes
Sep 9, 2026
Fix the stale hook description, the requirements, the site set file name and the textpic previewRenderer example, and document which template variables v13 and v14 each provide. Credits block switched to the portfolio wording with utm_source/utm_medium on the b13.com link. Related: BEXT-596
Build/ and .github/ were shipped in the release archive. Verified with git archive: 66 entries now, none of them developer tooling. .ddev/, .claude/ and .internal/ are listed up front so the first internal file placed there does not go out with the package. Related: BEXT-729
The authors block was missing entirely and ext_emconf named a person. Machine-readable metadata points at the company that answers; the extension's creator is credited in the README. Category corrected from fe to be, which is what this extension is. Related: BEXT-729
CHANGELOG.md follows Keep a Changelog with the 2.0 entries under Unreleased, to be renamed when the release is tagged. SECURITY.md names the reporting route without promising a response time, and records that b13:getDatabaseRecord reads any table without a permission check. The README section on template variables was wrong about v14: the record object resolves relations and flexform itself, so pi_flexform_transformed and all<Fieldname> have no v14 counterpart by design, not by omission. Related: BEXT-729
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Cleanup release 2.0: raise the minimum to TYPO3 v13.4 / v14 and PHP 8.2, and remove the v10/v11/v12 compatibility layer. The ViewHelpers stay (no core replacement).
Removed
Classes/Hooks/BackendPreviewRenderer.php(PageLayoutViewDrawItemHookInterface, gone since v12) incl. its SC_OPTIONS registration andpublic: truein Services.yamlext_tables.php(only registered the < v12 backend skin)Classes/Listener/BootCompleted.php– registered unused Fontawesome icons (templates use the core iconsactions-exclamation-*-alt)Build/phpstan12.neon+phpstan-baseline12.neon, and'12'from the CI matrixSimplified
ext_localconf.php→ just the (now unconditional) stylesheet registrationContentPreview: renders viaViewFactoryInterfaceon both paths (RecordInterface/v14 and array/v13) →StandaloneView(removed in v14) is gone, sharedcreateView()helperDatabaseRowService: removed the pre-v12 manual file-field fallback (!$foundOne)GetDatabaseRecordViewHelper: removed the v12QueryBuilder::add()branchConstraints
^8.2, TYPO3^13.4 || ^14.3, version2.0.0(composer.json + ext_emconf.php)Quality
PartialsLegacykept (still used on v13 via[typo3.version < 14]in page.tsconfig)Docs and repo standard
Pulled into this release so 2.0 can be tagged as a complete package
(BEXT-729).
CHANGELOG.mdadded — Keep a Changelog 1.1.0 + SemVer, 2.0 entries under[Unreleased]. The heading gets renamed to## [2.0.0] — <date>in the release commit, leaving a fresh empty[Unreleased].SECURITY.mdadded — reporting route, no response time promised (MQ19). Notes thatb13:getDatabaseRecordreads whatever table it is pointed at with only a Deleted and Workspace restriction, so a preview template is code..gitattributesadded —Build/and.github/were being shipped. Verified at the archive (git archive HEAD | tar -t): 66 entries, no developer tooling..ddev/,.claude/,.internal/listed up front.authorsblock added on b13 GmbH,ext_emconfauthor moved from a person to the company (the creator is credited in the README),categorycorrectedfe→be.config.yaml, notsettings.yaml), and thepreviewRendererexample —textpichas not applied for several majors andfluid_styled_contentregisters none at all on v13/v14. Credits block switched to the portfolio wording, withutm_source=backendpreviews&utm_medium=readmeon the b13.com link.{record}while v13 assigns the row's fields individually.One thing worth a second pair of eyes
pi_flexform_transformedand theall<Fieldname>file references exist only on the v13 render path. That is not a gap: per Breaking-92434 the v14 record resolves relations and flexform itself ({record.image.uid},{record.pi_flexform}as aFlexFormFieldValuesobject), and the core documents{pi_flexform_transformed}as superseded. So this is documented rather than reimplemented.What could not be verified without a real v14 installation: the shipped
Images.html,ImagesWithCropVariants.html, andMedia/Image.htmlpartials expect{image.uid},{image.type}, and{image.properties.hidden}— whether the resolved objects from{record.<field>}have that same shape is untested. The usage comment inImagesWithCropVariants.htmlalso still namesallImages.Relates BEXT-596, BEXT-729.