Education Persons 

Extension key

dv_education_persons

Package name

davitec/dv-education-persons

Version

1.0.3

Language

en

Author

Davitec GmbH, +Pluswerk Standort Dresden

License

This document is published under the GNU General Public License v2.0


Generic person directory for the education sector. Extends fe_users with academic profile data and sub-entities (vita, publications, research, teaching, links).

Introduction 

On this page

What does it do? 

The Education Persons extension provides a generic person directory tailored for the education and research sector. It extends the TYPO3 fe_users table with academic profile data and introduces several sub-entity types for structured profile information.

The Person model extends AbstractEntity (not FrontendUser, which was removed in TYPO3 v12) and manually maps the relevant fe_users fields (username, firstName, lastName, email, telephone, www, company, title, image). The persistence mapping to the fe_users table is configured via Configuration/Extbase/Persistence/Classes.php.

The extension ships three content element plugins that cover the full lifecycle: listing, detail view, and frontend editing of person records.

Features 

  • Person model based on fe_users -- extends AbstractEntity with manual property mapping to fe_users, no dependency on FrontendUser
  • Record type via tx_extbase_type -- uses the tx_extbase_type column as type selector; the record type value is the FQCN Davitec\DvEducationPersons\Domain\Model\Person
  • Academic profile fields -- title, department, position, teaching area, consultation hours, room, slug, and more
  • Sub-entities for structured data:

    • VitaEntry -- career milestones and education history
    • Publication -- academic publications and papers
    • Research -- research projects and interests
    • Teaching -- courses and teaching activities
    • Link -- external links and social profiles
  • PersonList plugin (CType dveducationpersons_personlist) -- paginated list view with text search, dynamic department filter, A-Z letter navigation, and a reset button when filters are active. Uses POST method; the list action is non-cacheable.
  • PersonDetail plugin (CType dveducationpersons_persondetail) -- full profile display with all sub-entities
  • PersonEdit plugin (CType dveducationpersons_personedit) -- frontend editing for logged-in users; both edit and update actions are non-cacheable. Uses manual form field names (not Extbase object binding) to avoid HMAC hash issues with the fe_users mapping.
  • Dynamic department filter -- department options in the search form are loaded dynamically from existing person records via findDistinctDepartments() (QueryBuilder-based), not from a static list
  • cHash exclusion -- all plugin parameters are excluded from cHash calculation in ext_localconf.php to prevent cHash errors with the search form
  • FlexForm configuration -- per-plugin settings for detail page, list page, items per page, and department whitelist filter
  • TypoScript constants -- global configuration via the TYPO3 constant editor
  • Full German translation included
  • TYPO3 v12 and v13 LTS support

Screenshots 

Installation 

Requirements 

  • PHP 8.2 or higher (up to 8.4)
  • TYPO3 v12.4 LTS or v13.4 LTS
  • The following TYPO3 system extensions must be available:

    • typo3/cms-extbase
    • typo3/cms-fluid
    • typo3/cms-frontend
  • For frontend editing: typo3/cms-felogin (see Frontend login setup (config.storagePid))

Installation via Composer 

This is the recommended way to install the extension.

composer require davitec/dv-education-persons
Copied!

Activate the extension 

After installation, activate the extension in the TYPO3 backend:

  1. Go to Admin Tools > Extensions
  2. Search for Education Persons
  3. Click the activate icon

Alternatively, if you use Composer-based installations with typo3/cms-composer-installers, the extension is activated automatically.

Database update 

After activation, update the database schema:

  1. Go to Admin Tools > Maintenance > Analyze Database Structure
  2. Apply all suggested changes for the dv_education_persons tables

This creates the required database tables for sub-entities:

  • tx_dveducationpersons_domain_model_vitaentry
  • tx_dveducationpersons_domain_model_publication
  • tx_dveducationpersons_domain_model_research
  • tx_dveducationpersons_domain_model_teaching
  • tx_dveducationpersons_domain_model_link

It also extends the fe_users table with additional columns: room, department, position, teaching_area, consultation_hours, mobile, fax, slug, and the IRRE foreign fields for all sub-entities.

Include TypoScript 

The static TypoScript must be included for the extension to work:

  1. Go to the root template of your site
  2. Select Includes
  3. Add Education Persons (dv_education_persons) to the selected static templates

Quick start after installation 

  1. Include the static TypoScript template
  2. Create a sysfolder for person records
  3. Set plugin.tx_dveducationpersons.persistence.storagePid to the sysfolder UID
  4. Create a person directory page and add the PersonList content element
  5. Create a detail page and add the PersonDetail content element
  6. Configure settings.detailPid and settings.listPid (via TypoScript or FlexForm)
  7. Create a Frontend User record in the sysfolder, set record type to Education Person, and fill in the profile fields

Configuration 

TypoScript Constants 

All constants are available in the TYPO3 constant editor under the category plugin.tx_dveducationpersons.

plugin.tx_dveducationpersons.persistence.storagePid

plugin.tx_dveducationpersons.persistence.storagePid
type

int

Default

(empty)

UID of the page (sysfolder) where person records (fe_users) are stored. This is required for the plugins to find records.

plugin.tx_dveducationpersons.settings.detailPid

plugin.tx_dveducationpersons.settings.detailPid
type

int

Default

(empty)

UID of the page containing the PersonDetail plugin. Used by the list view to generate links to the detail page.

plugin.tx_dveducationpersons.settings.listPid

plugin.tx_dveducationpersons.settings.listPid
type

int

Default

(empty)

UID of the page containing the PersonList plugin. Used by the detail view to generate the back-to-list link.

plugin.tx_dveducationpersons.settings.itemsPerPage

plugin.tx_dveducationpersons.settings.itemsPerPage
type

int

Default

20

Number of person records shown per page in the list view.

FlexForm settings 

Each plugin instance can override the global TypoScript settings via its FlexForm. The FlexForm is available in the plugin content element's Plugin tab.

Field

Description

Detail page

Page containing the PersonDetail plugin. Overrides settings.detailPid.

List page

Page containing the PersonList plugin. Overrides settings.listPid.

Items per page

Number of records per page. Overrides settings.itemsPerPage. Default: 20.

Departments

Comma-separated list of department names to restrict the person list. This is a backend-side whitelist filter applied after the query. If empty, all departments are shown. Note: the frontend department dropdown is populated dynamically from existing records (see Department filter (dynamic)).

Plugins (Content Elements) 

The three plugins are registered as content elements (not as list_type plugins). Their CType values are:

Plugin

CType

PersonList

dveducationpersons_personlist

PersonDetail

dveducationpersons_persondetail

PersonEdit

dveducationpersons_personedit

This means the plugins are available under the Plugins tab in the new content element wizard and do not appear in the generic plugin dropdown.

Caching behaviour 

  • PersonList: the list action is registered as non-cacheable because the search form submits via POST. All tx_dveducationpersons_* parameters are excluded from cHash calculation in ext_localconf.php.
  • PersonDetail: the show action is cacheable.
  • PersonEdit: both edit and update actions are non-cacheable (user-specific content).

fe_users record type (TCA) 

The extension registers a custom record type on the fe_users table.

Type selector 

The column tx_extbase_type is used as the type field for fe_users. The extension adds a new type option with the value Davitec\DvEducationPersons\Domain\Model\Person (the FQCN of the domain model). This is also the recordType configured in Configuration/Extbase/Persistence/Classes.php.

To create a person record in the backend:

  1. Open a sysfolder in the TYPO3 backend
  2. Create a new Frontend User record
  3. Set the Record Type field to Education Person
  4. Fill in the academic profile fields

Backend tabs 

When the record type is set to Education Person, the backend form shows the following tabs:

  • General -- tx_extbase_type, username, password, usergroup, slug
  • Academic Profile -- first_name, last_name, title, name, image, department, position, teaching_area
  • Contact -- email, telephone, mobile, fax, www, room, consultation_hours
  • Vita & Publications -- vita_entries, publications, researches, teachings, person_links (all IRRE inline records)
  • Access -- disable, starttime, endtime

Storage PID 

Person records must be stored in a dedicated sysfolder. Configure the storage PID in one of two ways:

Via TypoScript (recommended for site-wide configuration):

plugin.tx_dveducationpersons.persistence.storagePid = 42
Copied!

Via plugin content element -- set the Record Storage Page in the content element's Behaviour tab.

Frontend login setup (config.storagePid) 

For the PersonEdit plugin to work, the logged-in frontend user must be resolved from the same sysfolder that contains the person records. This requires config.storagePid in your site TypoScript setup:

config.storagePid = 42
Copied!

Replace 42 with the UID of the sysfolder containing your fe_users / person records. Without this setting, TYPO3 cannot match the logged-in fe_user to the Person record.

Additionally, you need a working felogin setup:

  1. Install and activate the felogin system extension (typo3/cms-felogin)
  2. Create a page for the login form
  3. Add the Login Form (felogin) content element to that page
  4. Configure the felogin plugin to redirect to the page containing the PersonEdit plugin after successful login
  5. Protect the edit page with a frontend user group (via the page's Access tab)

Template overrides 

To customize the Fluid templates, copy the original templates and configure alternative template paths via TypoScript:

plugin.tx_dveducationpersons {
  view {
    templateRootPaths.10 = EXT:my_sitepackage/Resources/Private/Templates/DvEducationPersons/
    partialRootPaths.10 = EXT:my_sitepackage/Resources/Private/Partials/DvEducationPersons/
    layoutRootPaths.10 = EXT:my_sitepackage/Resources/Private/Layouts/DvEducationPersons/
  }
}
Copied!

Usage 

The extension provides three plugins that are registered as content elements (CType-based, not list_type).

Adding plugins to pages 

All plugins are available as content elements in the TYPO3 backend:

  1. Open a page in the Page module
  2. Click + Content
  3. Select the Plugins tab
  4. Choose one of the available plugins

PersonList 

CType: dveducationpersons_personlist

Displays a paginated list of person records with search, department filtering, and A-Z letter navigation.

  • Controller action: PersonController->list (non-cacheable)
  • HTTP method: The search form submits via POST
  • FlexForm settings: Detail page, Items per page, Departments whitelist
  • Place this plugin on your person directory page
  • Configure the Detail page in the FlexForm to link each person to their full profile

PersonDetail 

CType: dveducationpersons_persondetail

Displays the full profile of a single person, including all sub-entities (vita, publications, research, teaching, links).

  • Controller action: PersonController->show (cacheable)
  • FlexForm settings: List page (for the back link)
  • Place this plugin on a separate detail page
  • Configure the List page in the FlexForm for the back-to-list link
  • The person record is passed via URL parameter from the list view

PersonEdit 

CType: dveducationpersons_personedit

Allows logged-in frontend users to edit their own person profile.

  • Controller actions: PersonEditController->edit, PersonEditController->update (both non-cacheable)
  • Place this plugin on a page protected by a frontend user group
  • The logged-in user's own fe_users record is loaded automatically via the TYPO3 Context API
  • The controller includes initializeUpdateAction() which configures property mapping for the allowed fields
  • The edit form uses manual form field names (e.g. person[department]) instead of Extbase object binding to avoid HMAC hash generation issues with the fe_users table mapping

Creating person records 

  1. Create a sysfolder in the page tree to store person records
  2. Open the sysfolder and click + Create new record
  3. Select Frontend User
  4. Set the Record Type to Education Person (this sets the tx_extbase_type field to Davitec\DvEducationPersons\Domain\Model\Person)
  5. Fill in the base fields (username, password, usergroup) and the academic profile fields (first name, last name, title, department, position, etc.)
  6. Save the record
  7. Make sure the sysfolder is configured as the storage PID (see Configuration)

Department filter (dynamic) 

The department dropdown in the PersonList search form is populated dynamically from existing person records. The PersonRepository->findDistinctDepartments() method uses a QueryBuilder query to:

  1. Select distinct non-empty department values from fe_users
  2. Filter by tx_extbase_type = 'Davitec\DvEducationPersons\Domain\Model\Person'
  3. Exclude deleted and disabled records
  4. Sort alphabetically

This means there is no static list of departments to maintain. When a new department value is entered on a person record, it automatically appears in the frontend dropdown. When the last person of a department is removed or disabled, the department disappears from the filter.

The FlexForm Departments setting works differently: it is a backend-side whitelist (comma-separated department names) that restricts which persons are displayed after the query. It does not affect the dropdown options.

Search and filter behaviour 

The PersonList plugin supports three filter modes that are mutually prioritized:

  1. Search term -- free text search across first name, last name, position, department, and teaching area (highest priority)
  2. Department -- filter by a specific department from the dropdown
  3. Letter -- A-Z navigation filtering by last name initial

The search form submits via POST. All tx_dveducationpersons_* parameters are excluded from cHash calculation (configured in ext_localconf.php) to prevent cHash validation errors.

Reset button 

A Reset link appears next to the submit button when any filter is active (search term, department, or letter). Clicking it navigates to the list page URL without any filter parameters, restoring the unfiltered list.

Adding sub-entities 

Sub-entities are managed as inline (IRRE) records within the person record. Open a person record and use the Vita & Publications tab to add:

VitaEntry 

Career milestones and education history entries. Each entry typically includes a date range and description.

Publication 

Academic publications, papers, and articles. Add bibliographic data for each publication.

Research 

Research projects and areas of interest. Describe ongoing or completed research activities.

Teaching 

Courses, seminars, and teaching activities. Document the person's teaching portfolio.

Frontend editing 

The PersonEdit plugin enables self-service profile editing for logged-in frontend users.

Setup:

  1. Ensure config.storagePid points to the fe_users storage folder (see Frontend login setup (config.storagePid))
  2. Install and configure the felogin system extension with redirect to the edit page
  3. Create a page for profile editing
  4. Protect the page with a frontend user group (via Access tab)
  5. Add the PersonEdit plugin to the page
  6. Ensure the frontend user has a person record of type Education Person (matching tx_extbase_type)

When a user accesses the page, the edit form is pre-filled with their current profile data. The editable fields are: department, position, room, telephone, mobile, fax, www, teaching area, and consultation hours. Read-only fields (username, name, email) are not exposed in the form.

After submitting, the update action validates that the submitted person UID matches the logged-in user (ownership check) before persisting the changes.