Breaking: Replaced the profile editing view 

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 for what it does and Important: Profile editing is 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 

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

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

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

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, which stays, and is 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).

All of them are overridable through locallangXMLOverride , 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 

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 

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.

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 

  • 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 

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 

  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 names the files that carry the hooks the JavaScript binds to; changing those breaks the editor rather than the layout.
  2. Replace links to the removed actions with a link to the index action and the profileUid argument, or with the profile overview.
  3. Replace the five removed icon identifiers with the ones of Icon identifiers, and re-point CSS that selected the icons as an <img>.
  4. 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.
  5. Let page type 1733735 and the X-Requested-With header pass through route enhancers and firewalls.
  6. 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.