Skip to content

[!!!][TASK] 2.0 – Drop legacy layer, require TYPO3 v13/v14 - #53

Open
davidsteeb wants to merge 9 commits into
mainfrom
BEXT-596-cleanup-v13-v14
Open

[!!!][TASK] 2.0 – Drop legacy layer, require TYPO3 v13/v14#53
davidsteeb wants to merge 9 commits into
mainfrom
BEXT-596-cleanup-v13-v14

Conversation

@davidsteeb

@davidsteeb davidsteeb commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

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).

⚠️ Breaking: drops support for TYPO3 v10/v11/v12 and PHP < 8.2.

Removed

  • Classes/Hooks/BackendPreviewRenderer.php (PageLayoutViewDrawItemHookInterface, gone since v12) incl. its SC_OPTIONS registration and public: true in Services.yaml
  • ext_tables.php (only registered the < v12 backend skin)
  • Classes/Listener/BootCompleted.php – registered unused Fontawesome icons (templates use the core icons actions-exclamation-*-alt)
  • Build/phpstan12.neon + phpstan-baseline12.neon, and '12' from the CI matrix

Simplified

  • ext_localconf.php → just the (now unconditional) stylesheet registration
  • ContentPreview: renders via ViewFactoryInterface on both paths (RecordInterface/v14 and array/v13) → StandaloneView (removed in v14) is gone, shared createView() helper
  • DatabaseRowService: removed the pre-v12 manual file-field fallback (!$foundOne)
  • GetDatabaseRecordViewHelper: removed the v12 QueryBuilder::add() branch

Constraints

  • PHP ^8.2, TYPO3 ^13.4 || ^14.3, version 2.0.0 (composer.json + ext_emconf.php)

Quality

  • PHPStan baselines regenerated against real v13.4.31 and v14.3.3: v14 from 12 → 3 entries, v13 also 3 (same set — only the unavoidable v13↔v14 Record-API differences)
  • PHPStan v13 + v14 green, php-cs-fixer green, CI matrix now v13/v14
  • PartialsLegacy kept (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.md added — 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.md added — reporting route, no response time promised (MQ19). Notes that b13:getDatabaseRecord reads whatever table it is pointed at with only a Deleted and Workspace restriction, so a preview template is code.
  • .gitattributes added — 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.
  • Package metadataauthors block added on b13 GmbH, ext_emconf author moved from a person to the company (the creator is credited in the README), category corrected febe.
  • README brought in line with the code: the hook description (that hook is deleted in this PR), requirements (still claimed v10.4 / PHP 7.4), the site set dependency file (config.yaml, not settings.yaml), and the previewRenderer example — textpic has not applied for several majors and fluid_styled_content registers none at all on v13/v14. Credits block switched to the portfolio wording, with utm_source=backendpreviews&utm_medium=readme on the b13.com link.
  • New README section "What Your Template Gets" — v14 assigns a single {record} while v13 assigns the row's fields individually.

One thing worth a second pair of eyes

pi_flexform_transformed and the all<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 a FlexFormFieldValues object), 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, and Media/Image.html partials 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 in ImagesWithCropVariants.html also still names allImages.

Relates BEXT-596, BEXT-729.

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
@davidsteeb
davidsteeb requested review from achimfritz and bmack and removed request for achimfritz June 11, 2026 15:02
@davidsteeb davidsteeb self-assigned this Jun 11, 2026
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
@davidsteeb
davidsteeb requested a review from achimfritz June 11, 2026 15:14

@achimfritz achimfritz left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Comment thread Classes/Service/DatabaseRowService.php Outdated
Comment thread Classes/Service/DatabaseRowService.php

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 simplified ext_localconf.php.
  • Refactored backend preview rendering to use ViewFactoryInterface on both v13 (array record) and v14 (Record API) paths; removed StandaloneView.
  • 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.

Comment thread ext_emconf.php
Comment thread Classes/ViewHelpers/GetDatabaseRecordViewHelper.php Outdated
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
lolli42 force-pushed the BEXT-596-cleanup-v13-v14 branch from 8864674 to 1a1ff00 Compare September 9, 2026 13:32
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants