---
title: "Breaking: Replaced the profile editing view"
manual: "Academic Profiles Edit"
version: "main"
source: "Changelog/3.0/Breaking-ReplacedProfileEditingPlugin.rst"
rendered: "2026-09-30T20:17:10+00:00"
---

# Breaking: Replaced the profile editing view {#breaking-replaced-profile-editing-plugin}

> [!NOTE]
> **See also**
>
> The [upgrade chapter of academic_persons](https://docs.typo3.org/p/fgtclb/academic-persons/main/en-us/Upgrade/Index.html)
> is the order in which the 3.0 changes have to be applied.

## Description {#description}

The **Profile editing** content element used to be a set of Extbase
forms: one page per record, a form submission per change, a redirect after
every save. It is replaced by a single view that edits the profile in place
and writes through JSON endpoints of the same plugin - see
[Profile editing](../../ProfileEditing/Index.html#profile-editing) for what it does and
[Important: Profile editing is replaced in place](Important-ProfileEditingReplacedInPlace.html#important-profile-editing-replaced-in-place) for why nothing has to be
migrated in the page tree.

The plugin identity is unchanged: the content type stays
`academicpersonsedit_profileediting`, the plugin stays
`AcademicPersonsEdit` / `ProfileEditing`, the request namespace stays
`tx_academicpersonsedit_profileediting`, the site sets keep their names and
the default action stays `list`. Everything below the plugin is new.

### Removed controllers and actions {#removed-controllers-and-actions}

Five of the six controllers are removed. `ProfileController` is the only one
the plugin registers, and its action list is new:

| Removed | Replacement |
| --- | --- |
| `ContractController`, `ProfileInformationController`, `PhysicalAddressController`, `EmailAddressController`, `PhoneNumberController`, each with `list`, `show`, `new`, `create`, `edit`, `update`, `confirmDelete`, `delete`, `sort` and partly `toggleVisibility` | The `documentForm`/`createDocument`/`updateDocument`/ `deleteDocument`/`sortDocument`/`toggleDocumentVisibility` and `contractContactForm`/`createContractContact`/ `updateContractContact`/`deleteContractContact`/ `sortContractContact`/`toggleContractContactVisibility` JSON actions of `ProfileController` |
| `ProfileController::showAction()`, `editAction()`, `editImageAction()`, `addImageAction()`, `removeImageAction()`, `toggleSkipSyncAction()` | `indexAction()` for the view, and the `update`, `uploadImage`, `deleteImage` and `updateSkipSync` actions |
| `AbstractActionController`, `\Property\TypeConverter\AbstractFormDataConverter`, `\Service\UserSessionService`, `\Exception\AccessDeniedException` | `\Service\ProfileUpdateRequestService`, `\Domain\Parser\ProfileUpdatePayloadParser` and `\Service\ProfileUpdateValidationService` |
| `\Domain\Validator\AddressFormDataValidator`, `ContractFormDataValidator`, `EmailFormDataValidator`, `PhoneNumberFormDataValidator`, `ProfileInformationFormDataValidator` | The validation set of the section a record belongs to, resolved from the settings graph - see [Profile editor and validation](../../Configuration/Settings/Index.html#configuration-editor-settings) |
| `\Domain\Model\Dto\ProfileFormData::createFromProfile()`, deprecated since 2.3 and announced for removal in 3.0 | `\Domain\Factory\ProfileFormDataFactory::createFromProfile()` |

An installation that links to one of the removed actions - a
`f:link.action` in an override, a hand written URL, a bookmark - gets a
**500**, not a fallback view. Extbase throws
`InvalidControllerNameException` (1313855173) for a removed controller and
`InvalidActionNameException` (1313855175) for a removed action; the
fallback to the default action only happens where
`config.tx_extbase.mvc.callDefaultActionIfActionCantBeResolved` is
set, and this extension does not set it.

### Removed templates, layouts and partials {#removed-templates-layouts-and-partials}

Every Fluid file of the form flow is removed. An override of one of them is
dead: the file is no longer rendered, and the project keeps a copy of a view
that no longer exists.

-   `Resources/Private/Layouts/ProfileEdit.html`
-   `Resources/Private/Templates/Profile/Edit.html`,
    `Profile/EditImage.html`, `Profile/Show.html`
-   `Resources/Private/Templates/Contract/{Edit,New,Show}.html` and the
    same three files for `EmailAddress/`, `PhoneNumber/`,
    `PhysicalAddress/` and `ProfileInformation/`
-   `Resources/Private/Partials/Profile/Buttons/{DeleteCancel,SaveExitCancel}.html`
-   `Resources/Private/Partials/Profile/Forms/{Checkbox,DateTime,Errors,FieldWrapper,Select,Textarea,Textfield}.html`
-   `Resources/Private/Partials/Profile/List/{Contracts,EmailAddresses,PhoneNumbers,PhysicalAddresses,ProfileInformation}.html`
-   `Resources/Private/Partials/Profile/Properties/{Contract,EmailAddress,PhoneNumber,PhysicalAddress,Profile,ProfileInformation}.html`
-   `Resources/Private/Partials/Profile/Show/{Image,Personal}.html`

The plugin renders without a Fluid layout since, so the TypoScript constant
`plugin.tx_academicpersonsedit.view.layoutRootPath` and the
`view.layoutRootPaths` block it filled are removed as well. A site
package that still sets the constant sets something nothing reads.

`Resources/Private/Templates/Profile/List.html` is kept and rewritten,
and `Resources/Private/Templates/Profile/Index.html` with the
thirty-one partials below `Partials/Profile/` is the new tree: four of
them - `Header.html`, `StatusToast.html`,
`ButtonTemplates.html` and `Prototypes.html` \- directly in that
directory and the rest in `{Documents,Field,Image,Profile}/`.
[Overriding templates](../../Templates/Override/Index.html#templates-override) describes what may be overridden.

The JavaScript module of the removed form flow goes with it:
`Resources/Public/JavaScript/frontend/rich-text.js`, addressed by the bare
specifier `@fgtclb/academic-persons-edit/frontend/rich-text.js`, configured
CKEditor 4 for `Templates/Profile/Edit.html` and is deleted. A site package
that still loads that specifier loads nothing. Rich text is CKEditor 5 from
`EXT:rte_ckeditor` now, created by the editing view itself - see
[Profile editing](../../ProfileEditing/Index.html#profile-editing).

### Removed icons {#removed-icons}

The ten icon files 2.4 shipped for the form flow are deleted:

`add-image-icon.svg`, `add-item-icon.svg`, `back-icon.svg`,
`cancel-icon.svg`, `delete-icon.svg`, `edit-icon.svg`,
`save-icon.svg`, `sort-icon.svg`, `sort-vertical-icon.svg`,
`view-icon.svg`.

Five of the ten identifiers they were registered under go with them:
`academic-persons-edit-add-image`, `-add-item`, `-cancel`, `-sort` and
`-to-top`. The other five - `academic-persons-edit-edit`, `-view`,
`-delete`, `-save` and `-back` \- stay and now resolve to the new artwork.

They also resolve through a different icon provider:
`\FGTCLB\AcademicBase\Imaging\IconProvider\CurrentColorSvgIconProvider`
inlines the `<svg>` where TYPO3's own `SvgIconProvider` emitted an
`<img>`. A site package styling the editor's icons through a rule such as
`.t3js-icon img` therefore stops matching, and styles the `<svg>` instead;
the *Feature: Icon provider for icons that follow the text colour* entry of
`EXT:academic_base` describes the provider.

Thirteen action icons are registered, under the identifiers listed in
[Icon identifiers](../../ProfileEditing/Index.html#profile-editing-icons); the extension icon `persons_edit_icon` is the
fourteenth entry of `Configuration/Icons.php` and is unchanged. They are
Bootstrap Icons (MIT) drawn in `currentColor` and rendered inline, so they
take the colour of the control they sit in - see
[Feature: The profile editing icon set](Feature-ProfileEditingIconSet.html#feature-profile-editing-icon-set).

### Removed labels {#removed-labels}

`Resources/Private/Language/locallang.xlf` goes from 208 to 145
trans-units: **144 are removed and 81 are new**. 64 survive, all of them
byte-identical. The
German `de.locallang.xlf` follows one to one. That is not a list worth
printing - the authoritative one is the diff of the file for this release -
but the shape of it is:

-   Everything the removed Extbase form flow needed goes with it: every
    `*.create.success` / `*.update.success` / `*.delete.success` /
    `*.sort.success` message, every `*.placeholder`, every
    `list.no*Found` entry except `list.noProfilesFound`, which the profile
    overview still renders, the `actions.hide` / `show` / `translate`
    / `saveAndExit`
    / `setToTop` / `setToBottom` / `replace` actions, `back`,
    `list.hidden.badge`, `list.contract.position`, the `profile.*`
    section headings and every `*FormData.*.error.*` unit.
-   `contract.published.label` was a stale duplicate of
    `contract.publish.label` and is removed. `contract.publish.label` went
    later with the switch it labelled, see
    [Breaking: The contract form has no "Publish" switch](Breaking-ContractPublishSwitchRemoved.html#breaking-contract-publish-switch-removed).
    `emailAddress.emailAddress.label` is replaced by the shorter
    `emailAddress.email.label`, which is new in this release.
-   The year fields of a timeline entry keep their labels
    `profileInformation.year.label`, `profileInformation.yearStart.label`
    and `profileInformation.yearEnd.label`; their `*.placeholder`
    companions are removed with the form flow that rendered them.
-   The new view brings its own vocabulary under the `profileEditing.*`
    prefix - status messages, empty states, the image editor, the document
    section labels and the controls of full form editing
    ([Feature: Full form editing applies as one form](Feature-FullFormEditingAppliesAsOneForm.html#feature-full-form-editing-applies-as-one-form)).

All of them are overridable through `locallangXMLOverride` on TYPO3 v13,
`resourceOverrides` on TYPO3 v14, or `_LOCAL_LANG`, so an
installation that translated or reworded one of the 149 removed units loses
that override silently: the key is simply not read any more. Compare the
overrides against the shipped file after the update.

### Removed extension configuration {#removed-extension-configuration}

`profile.autoCreateProfiles` and `profile.createProfileForUserGroups` are
removed from `ext_conf_template.txt`. Neither is read by any code path of
this extension. Their stored values are not lost by the removal - the extension
configuration merges the current values over the template and prunes nothing -
and they are still the source the
`academicPersons_MigrateProfileAutoCreateExtensionsConfiguration` upgrade
wizard of `EXT:academic_persons` reads to carry both settings over.
`profile.allowedLanguages` is unchanged.

### New page type {#new-page-type}

The JSON endpoints are reached through a `PAGE` object named
`academicPersonsProfileEditingAjax` with `typeNum = 1733735`,
delivered by the site set `fgtclb/academic-persons-edit-profile-editing` and
by the static template. A project with a `PageType` route enhancer, a web
application firewall or a reverse proxy in front of TYPO3 has to let that page
type and the `X-Requested-With` header through - see
[The page type of the JSON endpoints](../../ProfileEditing/Index.html#profile-editing-page-type).

**There was no such page type in 2.4**, where the editor was an Extbase form
flow, so a site package that copied the TypoScript of this extension into its
own instead of including the site set or the static template has the editor and
not the page type. Every save is then answered with the site's error page where
the browser expects JSON, and the editor can do nothing about it. The editor
therefore looks the page type up while it renders: when no `PAGE` object of
this site carries `typeNum = 1733735`, it writes an error naming
the cause to the TYPO3 log and tells the visitor that the profile cannot be
saved, instead of letting them find out on their first change. The object is
matched by its `typeNum`, not by its name, so a project that
declares it under a name of its own is recognised.

## Impact {#impact}

-   Overrides of any removed Fluid file stop having an effect. The editing
    view renders from the shipped templates.
-   Links to the removed actions are a 500 rather than a fallback view.
-   Templates and PHP code referring to the five removed icon identifiers,
    labels or controller classes fail: an unknown icon identifier renders
    TYPO3's `default-not-found` placeholder, an unknown label renders its
    own key, and an unknown class is a fatal error.
-   A form posting `profileInformationFormData[year]`,
    `contractFormData[...]`, `addressFormData[...]`,
    `emailFormData[...]` or `phoneNumberFormData[...]` to one of the
    removed actions is not processed. The editor posts JSON, under the
    property names `year`, `yearStart` and `yearEnd`.
-   The two removed extension configuration options disappear from the
    Settings module. A stored value is ignored.

## Affected Installations {#affected-installations}

All installations using the **Profile editing** content element of
`EXT:academic_persons_edit`, and in particular every installation that
overrides one of its Fluid files or links to one of its actions.

## Migration {#migration}

1.  Remove the overrides of the deleted Fluid files, and re-apply the project
    specific changes on top of the new template tree where they are still
    wanted. [Overriding templates](../../Templates/Override/Index.html#templates-override) names the files that carry the hooks the
    JavaScript binds to; changing those breaks the editor rather than the
    layout.
1.  Replace links to the removed actions with a link to the `index` action
    and the `profileUid` argument, or with the profile overview.
1.  Replace the five removed icon identifiers with the ones of
    [Icon identifiers](../../ProfileEditing/Index.html#profile-editing-icons), and re-point CSS that selected the icons as
    an `<img>`.
1.  Confirm that the site actually delivers page type `1733735`. Include the
    site set `fgtclb/academic-persons-edit-profile-editing` or the static
    template of this extension; a site package that maintains a copy of the
    extension's TypoScript adds the `academicPersonsProfileEditingAjax`
    `PAGE` object to that copy. The editor reports a missing page
    type in the TYPO3 log and on the page itself, but it reports it, it cannot
    repair it.
1.  Let page type `1733735` and the `X-Requested-With` header pass through
    route enhancers and firewalls.
1.  Drop `profile.autoCreateProfiles` and
    `profile.createProfileForUserGroups` from the deployment configuration -
    but only after the
    `academicPersons_MigrateProfileAutoCreateExtensionsConfiguration` upgrade
    wizard has run, because that wizard reads them.
