Introduction
What does it do?
The extension manages a profile record and its two child collections — postal addresses and e-mail addresses — from the website itself, without a backend login and without a full page form.
A visitor who owns a profile sees it rendered as an ordinary page. Once the editing component has loaded, each field gains an Edit affordance that turns it into a control, applies it on its own, and shows the value the server stored. Child records can be added, removed, reordered and hidden, and a profile image can be uploaded and replaced.
Three plugins are placed as content elements:
| Plugin | Renders |
|---|---|
| Profiles: list | Every profile of the configured storage page, each linking to the detail page. |
| Profiles: detail | One profile, with its addresses and e-mail addresses. |
| Profiles: edit | The profile of the logged-in website user, editable. |
A fourth plugin answers the JSON requests the editing surface sends. It is deliberately not placeable as a content element.
What it demonstrates
The extension exists to show that this can be built with the framework as it is, and to record what that costs. The decisions worth knowing about before reading the code:
- Records are written with the Extbase persistence manager rather than with
Data. That is what makes the write path short, and it is why noHandler sys_entry is written and nohistory Datahook runs. The reference index is not affected — Extbase maintains it for every row it writes.Handler - The record a request may write is resolved from the session, never from an identifier the client sent.
- Editing is refused while a workspace is active, and the surface says so before anything is typed.
- The interface degrades: the website renders the whole record, the component replaces it, and a visitor without working JavaScript keeps the rendered version.
Every one of these has a limit attached to it. They are collected in Known limitations.
Core version aware implementations
Code that has to differ between the supported TYPO3 versions lives below
Core13/ and Core14/ in the repository root. Shared code —
interfaces, abstract base classes and everything working on both core
versions — lives in Classes/.
Only the directory matching the running TYPO3 version is registered in the dependency injection container, so a service asking for an interface always receives the implementation matching the current core version.
Compatibility
| Branch | Extension | TYPO3 | PHP |
|---|---|---|---|
| main | 1.x | v13 / v14 | 8.2 - 8.5 |
Contributing
Contributions are welcome. The development setup, the quality gates and the
commit message rules are described in the CONTRIBUTING. file of the
source repository.