Academic Persons 

Extension key

academic_persons

Package name

fgtclb/academic-persons

Version

2.3

Language

en

Author

FGTCLB

License

This document is published under the Creative Commons BY 4.0 license.

Rendered

Sun, 26 Apr 2026 17:08:35 +0000


This TYPO3 extension adds a personal database to TYPO3, with requirements that are usually used for colleges, universities or public institutions.

The profile data records can be automatically created and linked in conjunction with the LDAP extension on the basis of FE user data records. The data can be enriched with data via separate HiS-in-One synchronization. Data records can be created, edited and displayed in the front end and in different display modes.


Table of Contents:

What does it do? 

This extension provides record types for academic person profiles using the TYPO3 backend (list module/page layout module) to manage the profiles requiring backend user account(s).

Further, plugins are provided to display the persons in the frontend as a list view and detail view for each person.

The following profile data is available to users after installation:

  • Master data:
    • Salutation / Gender
    • title
    • First name
    • Last name
    • Middle name
    • Website + website link
    • Image
    • URL
  • Contracts:
    • Each person can receive any amount of contract data in order to be displayed in individual roles, functions or organizational units.
    • Position
    • Organizational unit / department - link to own data type
    • Contract start / end
    • Location - e.g. for campus Link to own data type
    • Room information
    • Office hours
  • Address data
  • Email addresses
  • Telephone addresses
  • Linked pages (in combination with the Contact-For-Pages extension)
  • Employment category based on system categories
  • Profile text data:
    • All textual content can be freely designed using the standard text editor.
    • Learning areas/fields of activity
    • Research areas
    • Supervised dissertations
    • Supervised doctoral theses
    • Miscellaneous information
  • Profile timeline entries
    • All timeline entries allow the chronological presentation of content, usually with a start and/or end year, a title, a short description and a link
    • Research projects
    • Academic career
    • Memberships/committee activities
    • Networks and cooperation's
    • Publications
    • Lectures
    • Press/Media Publications

Installation 

This extension can be installed using the TYPO3 extension manager or by composer.

composer install \
    'fgtclb/academic-persons':'^2'
Copied!

Testing 2.x.x extension version in projects (composer mode) 

It is already possible to use and test the 2.x version in composer based instances, which is encouraged and feedback of issues not detected by us (or pull-requests).

Your project should configure minimum-stabilty: dev and prefer-stable to allow requiring each extension but still use stable versions over development versions:

composer config minimum-stability "dev" \
&& composer config "prefer-stable" true
Copied!

and installed with:

composer require \
    'fgtclb/academic-persons':'2.*.*@dev'
Copied!

General configuration 

Extension configuration There are some options for global extension configuration:

types.physicalAddressTypes

types.physicalAddressTypes
type

string

Default

private=Private,business=Business

The available types for physical addresses that can be chosen when adding a physical address to a profile.

types.emailAddressTypes

types.emailAddressTypes
type

string

Default

private=Private,business=Business

The available types for email addresses that can be chosen when adding an email address to a profile.

types.phoneNumberTypes

types.phoneNumberTypes
type

string

Default

private=Private,business=Business

The available types for phone numbers that can be chosen when adding a phone numbers to a profile.

demand.allowedGroupByValues

demand.allowedGroupByValues
type

string

Default

firstNameAlpha=LLL:EXT:academic_persons/Resources/Private/Language/locallang_be.xlf:flexform.el.groupBy.items.first_name,lastNameAlpha=LLL:EXT:academic_persons/Resources/Private/Language/locallang_be.xlf:flexform.el.groupBy.items.last_name

What values are allowed to group person listings?

demand.allowedSortByValues

demand.allowedSortByValues
type

string

Default

firstNameAlpha=LLL:EXT:academic_persons/Resources/Private/Language/locallang_be.xlf:flexform.el.groupBy.items.first_name,lastNameAlpha=LLL:EXT:academic_persons/Resources/Private/Language/locallang_be.xlf:flexform.el.groupBy.items.last_name

What values are allowed to sort person listings?

Overriding templates 

EXT:academic_persons is using Fluid as template engine.

This documentation won't bring you all information about Fluid but only the most important things you need for using it. You can get more information in the section Fluid templates of the Sitepackage tutorial. A complete reference of Fluid ViewHelpers provided by TYPO3 can be found in the ViewHelper Reference

Change the templates using TypoScript constants 

As any Extbase based extension, you can find the templates in the directory Resources/Private/.

If you want to change a template, copy the desired files to the directory where you store the templates.

We suggest that you use a sitepackage extension. Learn how to Create a sitepackage extension.

# TypoScript constants
plugin.tx_academicpersons {
    view {
        templateRootPath = EXT:mysitepackage/Resources/Private/Extensions/myextension/Templates/
        partialRootPath = EXT:mysitepackage/Resources/Private/Extensions/myextension/Partials/
        layoutRootPath = EXT:mysitepackage/Resources/Private/Extensions/myextension/Layouts/
    }
}
Copied!

Known problems 

Please note that this extension is still in development. Changes to existing code may appear in upcoming versions.

If you run into a bug or a feature that would be helpful, please use the issue tracker.

ChangeLog v2 

Every change to the Academic Persons extension is documented here.

Also available 

Feature: Add academic:updateprofiles command 

Description 

EXT:academic_persons provided the academic:createprofiles for quite a long time now to create profile automatically for frontend users taking data from TYPO3 fe_users records. That can be extended by extension or projects to get import data from other sources like LDAP or other external identity providers.

To further improve that handling the academic:updateprofiles is now added in a similar way to handle updates of profile data based on the source using the scheduler, for example to update data imported from external LDAP.

import_identifier varchar(170) DEFAULT '' NOT NULL is added to all extension tables and all domain models got extended to have that property along with setter und getter in place. Existing imported profile data needs to be updated in the project to have the identifier in place and custom create/update profile implementation can use that field to flag it with their data.

Further a skip_sync field is added to tx_academicpersons_domain_model_profile defaulting to false ((INT)0). If this field is set to true/1 the update command excludes these records in a early stage and do not call or dispatch any further methods or events.

Important note 

Custom profile factory implementations needs to be updated due to the extended FGTCLBAcademicPersonsProfileProfileFactoryInterface interface and implement the update handling part.

This is breaking and needs to be addressed on a update.

2.1 Changes 

Table of contents

Breaking Changes 

Features 

Deprecation 

Important 

Breaking: ProfilesController::selectedProfilesAction() no longer dispatches ModifyListProfilesEvent 

Description 

ProfilesController::selectedProfilesAction() dispatched the ModifyListProfilesEvent PSR14 event accidentally due to copy&paste when introducing the new plugin and action for 2.0.x. This event is no longer dispatched for this action, instead the new and correct event ModifySelectedProfilesEvent is now dispatched.

Affected Installations 

EXT:academic_partners installations listening to the ModifyListProfilesEvent event.

Migration 

Adapt any listeners/subscribers accordingly to the correct event.

Breaking: Removed partials 

Description 

Some partials got removed as the templating structure has changed.

Impact 

Those partials include:

  • Resources/Private/Partials/List/AlphabetPagination.html
  • Resources/Private/Partials/List/ListItem.html
  • Resources/Private/Partials/List/Pagination.html
  • Resources/Private/Partials/SelectedContracts/ListItem.html

Affected Installations 

EXT:academic_partners installations overriding those partials.

Migration 

Adapt overrides accordingly to the new templating structure.

Breaking: Replace constructor DI with inject-methods in AbstractProfileFactory 

Description 

Using constructor dependency injection in abstract classes defines the constructor as API, which should be avoided by using the inject-method approach and allows to implement classes using constructor DI without the requirement to deal and align with parent (abstract) class constructor and passing it down.

AbstractProfileFactory used constructor DI and therefore violated the above described design pattern.

Constructor DI arguments are now replaced with inject-methods in the abstract FGTCLBAcademicPersonsProfileAbstractProfileFactory.

See Autowiring other Methods (e.g. Setters and Public Typed Properties)

Impact 

AbstractProfileFactory used constructor DI and therefore violated the above described design pattern.

Constructor DI arguments are now replaced with inject-methods in the abstract FGTCLBAcademicPersonsProfileAbstractProfileFactory.

Affected Installations 

Installations using the abstract and defining own constructor DI arguments.

Migration 

Implementation using the abstract and defining own constructor DI arguments needs to remove the removed parent arguments and avoid calling the parent constructor.

Additionally, the SymfonyContractsServiceAttributeRequired attribute is used for the inject methods to tell symfony DI that these inject methods needs to be called and are mandatory - beside having a visually glue for developers.

Feature: Add academic:createprofiles options --include-pids and --exclude-pids 

Description 

EXT:academic_persons provides a command to create profiles for frontend users, extendable by dispatching events to allow devs customizing the profile creation in projects, for example to base it on special needs like retrieving updated user data from LDAP oder other services.

Until now, all frontend users without profiles on any pid has been fetched, which does not respect use-cases where frontend users for dedicated logins are required and profile creation is not wanted, needed or suitable.

This change adds following new options to the provided command vendor/bin/typo3 academic:createprofiles:

  • --include-pids: comma-separated list of storage pid's from which frontend users should be fetched (only).
  • --exclude-pids: comma-separated list of storage pid's from which frontend users should be ignored (skipped).

Important note 

While both options can be used together it is important to know that --exclude-pids takes higher priorities and are ignored even if pid is also included in include-pids.

Feature: Allow modifying default and settings pageTitleFormat for detail view 

Description 

It's possible to set a pageTitleFormat in the plugin settings for plugins using the ProfileController::detailAction(), which is used in ProfileTitleProvider to set the HTML page title for the person profile pages.

This change extends the existing ModifyDetailProfileEvent, which is dispatched in the ProfileController::detailAction(), to make the default and the setting pageTitleFormat changeable using an PSR-14 event listener.

This gives developers the ability to implement a wide range of use-cases in projects, for example adding a prefix to the format based on the site configuration or similar.

New ModifyDetailProfileEvent methods:

  • getDefaultPageTitleFormat(): string
  • setDefaultPageTitleFormat(string $defaultPageTitleFormat): void
  • getSettingsPageTitleFormat(): string
  • setSettingsPageTitleFormat(string $settingsPageTitleFormat): void
  • getPageTitleFormatToUse(): string

The getPageTitleFormatToUse(): string is a calculated function to get the aggregated format to use, which allows checking the result in event listeners and determine the format finally used as detail view page title.

The original default pageTitleFormat is ProfileTitleProvider::DETAIL_PAGE_TITLE_FORMAT.

Feature: Dispatch PSR-14 event ModifySelectedContractsEvent in ProfilesController::selectedContractsAction() 

Description 

ProfileController::selectedContractsAction() dispatches now the new PSR-14 ModifySelectedContractsEvent.

The event provides following methods:

  • getContracts(): QueryResultInterface return current result set.
  • setContracts(QueryResultInterface $contracts): void to allow setting a custom resultset.
  • getView(): FluidViewInterface|CoreViewInterface return the current view to allow assigning custom values to the view.
  • getPluginControllerActionContext(): PluginControllerActionContextInterface to provide more context information

Feature: Dispatch PSR-14 event ModifySelectedProfilesEvent in ProfilesController::selectedProfilesAction() 

Description 

ProfileController::selectedProfilesAction() dispatches now the new PSR-14 ModifySelectedProfilesEvent instead of erroneous copied listAction event ModifyListProfilesEvent, which is no longer dispatched. That should not be that of an issue for most implementations.

The event provides following methods:

  • getProfiles(): QueryResultInterface return current result set.
  • setProfiles(QueryResultInterface $profiles): void to allow setting a custom resultset.
  • getView(): FluidViewInterface|CoreViewInterface return the current view to allow assigning custom values to the view.
  • getPluginControllerActionContext(): PluginControllerActionContextInterface to provide more context information

Feature: Introduce localized pageTitleFormat placeholder (LLL:EXT:) 

Description 

It's a valid use-case to use a pageTitleFormat for the person profile detail page view as HTML page title including localized text as placeholders and could be implemented using the PSR-14 event ModifyProfileTitlePlaceholderReplacementEvent dispatched in the ProfileTitleProvider.

Localization is a generic feature and it's most likely that it's use-full for a broader audience this change adds now support for localization placeholder in the format:

%%LLL:EXT:<extension-key>/Resources/.../locallang.xlf:identifier%%

Note that no context fallback detection is made like within fluid templates or extbase context areas and a valid relative path for the default language file within a extension needs to be provided.

Functional tests are added to cover the new feature basically and provide some examples, using a dedicated test fixture extension.

Feature: Introduce PluginControllerActionContext suitable 

Description 

A new readonly DTO object PluginControllerActionContext is introduced and is attached to dispatched PSR-14 events in ProfileController actions.

Impact 

Following main getters are provided:

  • getApplicationType(): ApplicationType to return the TYPO3 application type

for the current request. `getExtbaseRequestParameters(): ?ExtbaseRequestParameters` to retrieve extbase attribute from request as a simple accessor. getRequest(): ServerRequestInterface to return the current request. `getSettings(): array` to retrieve raw plugin settings (TypoScript, FlexForm). getSite(): ?Site to retrieve resolved site configuration. * getLanguage(): ?SiteLanguage to retrieve resolves site language.

Following getters dispatches to ExtbaseRequestParameters methods and returning null in case the request attribute is not set in the request:

  • getActionName(): ?string
  • getControllerName(): ?string
  • getControllerObjectName(): ?string
  • getControllerExtensionKey(): ?string
  • getControllerExtensionName(): ?string
  • getPluginName(): ?string

Feature: Introduce PSR-14 ModifyProfileTitlePlaceholderReplacementEvent in ProfileTitleProvider 

Description 

With recent changes a series of features has been implemented to make the HTML title tag for person profile pages more flexible, with a placeholder based FlexForm options and also allowing to influence the default and the setting pageTitleFormat.

The used ProfileTitleProvider already looks into the format string and provides the ability to replace placeholders, which matches getters in the profile.

To provide even more flexibility, this change introduces a new PSR-14 Event ModifyProfileTitlePlaceholderReplacementEvent, which is dispatched for each placeholder enriched with quite a handfull of use-full context information.

Following methods are available on the event:

  • getPluginControllerActionContext(): PluginControllerActionContextInterface containing the request along with easy access methods to site, siteLanguage and extbase plugin information and the plugin settings.
  • getProfile(): Profile the current person profile to display.
  • getPlaceholder() the original/raw placeholder identifier.
  • getReplacement() the value to replace the placeholder with, which may differ already if a earlier event listener changed the value using setReplacement().
  • setReplacement(string $replacement): void to set the value used to replace the placeholder.

This event allows project to implement custom placeholders and the replacement without using old-school xclassing technique.

Feature: pageTitleFormat FlexForm option for person detail view 

Description 

It's now possible to define the format used to generate the HTML PageTitle for the detail view of persons in the frontend, using the TYPO3 PageTitle API.

The default format used based on Profile extbase model data is:

%%TITLE%% %%FIRST_NAME%% %%MIDDLE_NAME%% %%LAST_NAME%%

To allow easier customization in project, a new FlexForm option pageTitleFormat has been added to listanddetail plugin and as single new option for the detail plugin, which uses TCA type=input combined with a ValuePicker to allow picking from a list of pre-defined formats while still making it possible to define own custom format directly on plugin usage.

The mapping from placeholder to extbase model is based on transforming the placeholder to camelcase using first character after separators and prefix it with get, and if the getter exists it is called to retrieve the value.

For example:

which calls Profile->getFirstName() to retrieve the replacement value from the detail view profile.

The whole process contains some behaviour, which needs to be kept in mind:

  • Leading and trailing spaces are trimmed from each value(placeholder).
  • Multiple spaces are removed from the whole format string.
  • Leading and trailing spaces are trimmed from the whole format pattern, after placeholder resolving has been processed.

Example for allowed characters as placeholder identifier:

Note that most of them has no handling for matching person profile getters, but are use-full for advanced replacement using the experimental PSR-14 event.

Important: Basic bootstrap styling 

Description 

The default templating now supports basic bootstrap styling and is semantically optimized to also not lack any major accessibility.

Breaking: Migrated extbase plugins from list_type to CType 

Description 

TYPO3 v13 deprecated the tt_content sub-type feature, only used for CType=list sub-typing also known as list_type and mostly used based on old times for extbase based plugins. It has been possible since the very beginning to register Extbase Plugins directly as CType instead of CType=list sub-type, which has now done.

Technically this is a breaking change, and instances upgrading from 1.x version of the plugin needs to update corresponding tt_content records in the database and eventually adopt addition, adjustments or overrides requiring to use the correct CType.

Impact 

The change relates to following plugins:

  • academicpersons_detail
  • academicpersons_list
  • academicpersons_listanddetail
  • academicpersons_selectedcontracts
  • academicpersons_selectedprofiles

Affected Installations 

All installations using the above listed plugins prior V2.0.

Migration 

A TYPO3 UpgradeWizard academicPersons_pluginUpgradeWizard is provided to migrate plugins from CType=list to dedicated CTypes matching the new registration.

Feature: Add demand DTO to ModifyListProfilesEvent 

Description 

PSR-14 Event FGTCLBAcademicPersonsEventModifyListProfilesEvent got following new methods:

  • getProfileDemand(): ProfileDemand
  • setProfileDemand(ProfileDemand $profileDemand): void

This gives event listeners the ability to redo a query with the same or further enriched demand object to replace the retrieved profiles result already existing in the event and/or enrich data in the view.