PHPackages                             sbuerk/modern-extbase-frontend-edit - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. sbuerk/modern-extbase-frontend-edit

ActiveTypo3-cms-extension

sbuerk/modern-extbase-frontend-edit
===================================

TYPO3 CMS extension modern\_extbase\_frontend\_edit.

1.0.0(today)01↑2900%GPL-2.0-or-laterPHPPHP ^8.2 || ^8.3 || ^8.4 || ^8.5CI passing

Since Aug 14Pushed todayCompare

[ Source](https://github.com/sbuerk/modern-extbase-frontend-edit)[ Packagist](https://packagist.org/packages/sbuerk/modern-extbase-frontend-edit)[ Docs](https://github.com/sbuerk/modern-extbase-frontend-edit)[ RSS](/packages/sbuerk-modern-extbase-frontend-edit/feed)WikiDiscussions main Synced today

READMEChangelog (1)Dependencies (16)Versions (2)Used By (0)

  ![Stefan Buerk — hack0r](Resources/Public/Icons/Logo/lockup-light.svg)TYPO3 extension `modern_extbase_frontend_edit`
==============================================

[](#typo3-extension-modern_extbase_frontend_edit)

Caution

**This is a proof of concept, not a product.** It exists to answer one question — *can Extbase entities with relations be managed from the frontend with a modern, accessible, progressively enhanced interface?* — and to be read while answering it.

**Do not copy it into a production extension, whole or in parts.** Several decisions in it are deliberate trade-offs that are wrong outside this context, and they are documented as such rather than fixed. Read [what it deliberately does not do](#what-it-deliberately-does-not-do) before reusing anything.

Editing a profile record and its child collections directly on the page: every field, every address, every e-mail address and the profile image, saved over AJAX without a page reload, from a [lit](https://lit.dev) web component that enhances markup the server already rendered.

- **Package name**: `sbuerk/modern-extbase-frontend-edit`
- **Extension key**: `modern_extbase_frontend_edit`
- **Repository**:
- **License**: GPL-2.0-or-later

What it demonstrates
--------------------

[](#what-it-demonstrates)

Question it answersHowCan a visitor edit an Extbase aggregate and its relations in the frontend?Three plugins — a list, a detail view and an edit surface — over one `Profile` record with two inline child collections and a FAL image.Without a full page form?Per field and whole record saves against JSON endpoints, plus add, remove, reorder and hide for each child collection.Without breaking when JavaScript does not load?The server renders the whole record inside the custom element. The component replaces it once it upgrades; until then, and forever without it, the plain view stands.Who is allowed to write?The record is owned by a frontend user. Every endpoint resolves the profile from the session, never from a uid the client supplied.How does it persist?Extbase `PersistenceManager` with a DTO to model mapping service, deliberately **not** `DataHandler`.What stops a forged request?A TYPO3 request token, verified on every write, plus validation driven by rule sets shared between the endpoints and the surface.Does it run on both current core versions?v13 and v14 from one code base, with version differences split into separate classes rather than conditionals.What it deliberately does not do
--------------------------------

[](#what-it-deliberately-does-not-do)

These are the reasons it must not be copied without reading. Each is a decision, not an oversight, and each is documented where it is made:

- **Writes bypass `DataHandler`.** That means no `sys_history` entry and no `DataHandler` hook. The reference index is *not* affected — Extbase maintains it for every row it writes. For a proof of concept about Extbase persistence the trade is the point; for a production extension it is usually a defect.
- **Editing is refused while a workspace is active**, and the surface says so before the visitor types rather than after. Versioning a record is `DataHandler`'s job, so workspace editing is out of scope.
- **Only default language records are edited.** No translation is created.
- **Last write wins.** There is no optimistic locking and no rate limiting.
- **One image, no cropping, no metadata editing.**

Compatibility
-------------

[](#compatibility)

BranchExtensionTYPO3PHPmain1.xv13 / v148.2 - 8.5Installation
------------

[](#installation)

```
composer require sbuerk/modern-extbase-frontend-edit
```

As long as no stable version has been released, require the development version of the main branch explicitly:

```
composer require sbuerk/modern-extbase-frontend-edit:^1.0@dev
```

This additionally requires `minimum-stability: "dev"` together with `prefer-stable: true` in the root `composer.json` file.

Installing it is not enough to see anything: the extension needs a storage page, the plugins placed on pages, and a frontend user owning a profile record. The [installation chapter](Documentation/Installation/Index.rst) has the full list.

Documentation
-------------

[](#documentation)

ForWhereUsers and integrators[`Documentation/`](Documentation), rendered to docs.typo3.orgDevelopers and maintainers[`docs/`](docs/Index.md)Contributors, entry point[`CONTRIBUTING.md`](CONTRIBUTING.md)AI coding agents[`AGENTS.md`](AGENTS.md)```
# Render once, as CI does. Must pass without errors.
Build/Scripts/runTests.sh -s renderDocumentation

# Serve it while writing, re-rendering on every save, on port 1337.
Build/Scripts/runTests.sh -s watchDocumentation
```

The rendered output is written to the git-ignored `Documentation-GENERATED-temp/`directory.

Development
-----------

[](#development)

All tests and quality tools run in containers through the [`Build/Scripts/runTests.sh`](Build/Scripts/runTests.sh) wrapper. The only requirement on the host is a container runtime — **podman** (preferred) or **docker**.

```
# Install dependencies for TYPO3 v13 on PHP 8.2 (default matrix).
Build/Scripts/runTests.sh -t 13 -p 8.2 -s composerUpdate

# Quality gates.
Build/Scripts/runTests.sh -s cgl -n
Build/Scripts/runTests.sh -s phpstan
Build/Scripts/runTests.sh -s lintPhp

# Tests.
Build/Scripts/runTests.sh -s unit
Build/Scripts/runTests.sh -s functional -d sqlite
Build/Scripts/runTests.sh -s acceptance

# All available options.
Build/Scripts/runTests.sh -h
```

Everything has to pass for **both** TYPO3 v13 and v14, each after the matching `composerUpdate` — see [Dual core setup](docs/development/dual-core-setup.md).

→ [`CONTRIBUTING.md`](CONTRIBUTING.md) for the contribution workflow · [`docs/`](docs/Index.md) for the full developer documentation

License
-------

[](#license)

This extension is published under the [GPL-2.0-or-later](LICENSE) license.

###  Health Score

42

—

FairBetter than 88% of packages

Maintenance100

Actively maintained with recent releases

Popularity2

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity50

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 98.5% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

0d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/1453466?v=4)[Stefan Bürk](/maintainers/sbuerk)[@sbuerk](https://github.com/sbuerk)

---

Top Contributors

[![sbuerk](https://avatars.githubusercontent.com/u/1453466?v=4)](https://github.com/sbuerk "sbuerk (67 commits)")[![github-actions[bot]](https://avatars.githubusercontent.com/in/15368?v=4)](https://github.com/github-actions[bot] "github-actions[bot] (1 commits)")

---

Tags

typo3typo3-cms-extension

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/sbuerk-modern-extbase-frontend-edit/health.svg)

```
[![Health](https://phpackages.com/badges/sbuerk-modern-extbase-frontend-edit/health.svg)](https://phpackages.com/packages/sbuerk-modern-extbase-frontend-edit)
```

###  Alternatives

[friendsoftypo3/content-blocks

TYPO3 CMS Content Blocks - Content Types API | Define reusable components via YAML

103574.3k68](/packages/friendsoftypo3-content-blocks)[pagemachine/typo3-formlog

Form log for TYPO3

23243.0k8](/packages/pagemachine-typo3-formlog)[eliashaeussler/typo3-warming

Warming - Warms up Frontend caches based on an XML sitemap. Cache warmup can be triggered via TYPO3 backend or using a console command. Supports multiple languages and custom crawler implementations.

22272.4k](/packages/eliashaeussler-typo3-warming)[eliashaeussler/typo3-form-consent

Extension for TYPO3 CMS that adds double opt-in functionality to EXT:form

15100.9k](/packages/eliashaeussler-typo3-form-consent)[yoast-seo-for-typo3/yoast_seo

Yoast SEO for TYPO3

571.8M9](/packages/yoast-seo-for-typo3-yoast-seo)[friendsoftypo3/visual-editor

TYPO3 CMS Visual Editor - Brings a modern WYSIWYG editing experience to TYPO3 CMS.

6010.0k3](/packages/friendsoftypo3-visual-editor)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
