Education Registration 

Extension key

dv_education_registration

Package name

davitec/dv-education-registration

Version

1.0.3

Language

en

Author

Davitec GmbH

License

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


Online registration for education courses and events with email confirmation workflow, inquiry forms (inhouse/info), admin notifications, and DSGVO-compliant garbage collection.

Table of Contents

Introduction 

Table of Contents

What does it do? 

The extension Education Registration (dv_education_registration) provides online registration for courses and events managed by the companion extension dv_education_courses. Visitors can sign up for scheduled events directly on the website. A double opt-in email confirmation workflow ensures that only verified registrations are stored.

In addition, the extension offers inquiry forms that allow visitors to request inhouse training or general information about a course without committing to a specific event date.

Key features 

  • Online event registration -- participants fill out a form and receive a confirmation email with a unique verification link.
  • Double opt-in confirmation -- the participant must click the link to confirm the registration; unconfirmed records are clearly flagged.
  • Admin notifications -- configurable email address that receives notifications for every new registration and inquiry.
  • Inquiry forms -- two request types are supported: inhouse (request for an on-site training) and info (general information request).
  • DSGVO-compliant garbage collection -- a scheduler task automatically deletes old participant and inquiry records after configurable retention periods (default: 365 days for participants, 180 days for inquiries).
  • Non-cacheable plugins -- both CType plugins are fully non-cacheable, ensuring forms always reflect the current state.

Dependencies 

This extension requires dv_education_courses (composer package davitec/dv-education-courses). It uses the Course and Event models provided by that extension to link registrations and inquiries to the correct course or event.

Supported TYPO3 versions:

  • TYPO3 v12.4 LTS
  • TYPO3 v13.4 LTS

Required PHP version: 8.2 or higher.

Installation 

Install via Composer 

Run the following command in your TYPO3 project root:

composer require davitec/dv-education-registration
Copied!

This automatically installs the required dependency davitec/dv-education-courses if it is not already present.

Activate the extension 

In the TYPO3 backend go to Admin Tools > Extension Manager and activate Education Registration if it is not already active.

For Composer-based installations the extension is activated automatically.

Database update 

After installation, update the database schema:

  • Backend: Admin Tools > Maintenance > Analyze Database Structure and apply all suggested changes.
  • CLI:

    vendor/bin/typo3 extension:setup
    Copied!

Include TypoScript 

Add the static TypoScript template to your site:

  1. Go to Web > Template and select your root page.
  2. Edit the template record and open the Includes tab.
  3. Add Education Registration (dv_education_registration) from the list of available items.

Alternatively, include it directly in your site package:

@import 'EXT:dv_education_registration/Configuration/TypoScript/setup.typoscript'
@import 'EXT:dv_education_registration/Configuration/TypoScript/constants.typoscript'
Copied!

Mail configuration 

The extension uses the TYPO3 mail API (MailMessage). Make sure your TYPO3 instance has a working mail transport configured. At minimum, set the default sender address in config/system/settings.php or config/system/additional.php:

$GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress'] = 'noreply@example.com';
$GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromName'] = 'My Website';

// Example: SMTP transport
$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport'] = 'smtp';
$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_smtp_server'] = 'smtp.example.com:587';
$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_smtp_encrypt'] = 'tls';
$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_smtp_username'] = 'user@example.com';
$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_smtp_password'] = 'secret';
Copied!

Without a properly configured mail transport, confirmation and notification emails will not be sent.

Quick start 

  1. Install the extension via Composer.
  2. Include the TypoScript template.
  3. Set the TypoScript constants (see Configuration): storagePid, adminEmail, confirmationPid, termsPageUid.
  4. Create a page for the registration form and insert the Registration Form content element.
  5. Create a separate page for confirmation and insert the same Registration Form content element (the confirm action uses it).
  6. Verify your mail configuration by submitting a test registration.

Configuration 

TypoScript constants 

All settings are configured as TypoScript constants under plugin.tx_dveducationregistration. Use the Constant Editor in the TYPO3 backend or set them in your site package.

Constant

Type

Default

Description

persistence.storagePid

int

(empty)

UID of the SysFolder where participant and inquiry records are stored.

settings.adminEmail

string

(empty)

Email address that receives admin notifications for new registrations and inquiries.

settings.confirmationPid

int

(empty)

UID of the page that contains the Registration Form plugin used for the confirmation action. The confirmation link in the email points to this page.

settings.termsPageUid

int

(empty)

UID of the page containing the terms and conditions. Used to render a link in the registration form.

Example:

plugin.tx_dveducationregistration {
    persistence.storagePid = 42
    settings {
        adminEmail = admin@example.com
        confirmationPid = 55
        termsPageUid = 60
    }
}
Copied!

Plugins (CType content elements) 

The extension registers two CType plugins. Both are fully non-cacheable (all actions are listed as non-cacheable in ext_localconf.php).

Registration Form 

  • CType: dveducationregistration_registrationform
  • Controller: RegistrationController
  • Actions: new, create, confirm
  • Purpose: Displays the registration form for a specific event and handles the double opt-in confirmation.

Inquiry Form 

  • CType: dveducationregistration_inquiryform
  • Controller: InquiryController
  • Actions: new, create
  • Purpose: Displays the inquiry form for inhouse training or information requests.

FlexForm 

If FlexForm XML files are provided in Configuration/FlexForms/, they allow editors to override TypoScript settings per content element (e.g., selecting a specific event or overriding the admin email). Check the content element's plugin settings tab in the backend for available options.

Caching 

Both plugins are registered as entirely non-cacheable. Every action (new, create, confirm) bypasses the TYPO3 page cache. This ensures that:

  • Form tokens (__trustedProperties, __referrer) are always fresh.
  • Flash messages are displayed correctly after form submission.
  • The confirmation action always reads the current database state.

No additional cache configuration is needed.

Email template customization 

Email subjects and body texts are loaded via LocalizationUtility from the extension's language files at:

EXT:dv_education_registration/Resources/Private/Language/
Copied!

To customize email texts, override the language labels in your site package using TYPO3's standard localization override mechanism in config/system/settings.php:

$GLOBALS['TYPO3_CONF_VARS']['SYS']['locallangXMLOverride']
    ['EXT:dv_education_registration/Resources/Private/Language/locallang.xlf'][]
    = 'EXT:my_site_package/Resources/Private/Language/Overrides/dv_education_registration.xlf';
Copied!

Relevant label keys:

  • email.confirmation.subject -- subject line for the confirmation email
  • email.confirmation.body -- body of the confirmation email (placeholders: %1$s = participant name, %2$s = confirmation URL)
  • email.admin.subject -- subject line for admin registration notification
  • email.inquiry.subject -- subject line for admin inquiry notification

Garbage collection (scheduler task) 

The extension provides a garbage collection task for DSGVO-compliant deletion of old records. Configure it in the TYPO3 Scheduler:

  1. Go to Admin Tools > Scheduler.
  2. Create a new task of type Garbage Collection (provided by this extension).
  3. Configure the retention periods:

    • Participant records: 365 days (default) -- confirmed and unconfirmed registrations older than this are permanently deleted.
    • Inquiry records: 180 days (default) -- inquiry requests older than this are permanently deleted.
  4. Set the task frequency (recommended: daily).

This ensures that personal data is not stored longer than necessary, in compliance with GDPR/DSGVO requirements.

Usage 

Adding the registration form 

The registration form is displayed on an event detail page or any page where visitors should be able to sign up for a specific event.

  1. Edit the page where the form should appear.
  2. Add a new content element of type Registration Form (dveducationregistration_registrationform).
  3. The form receives the eventUid either via a GET parameter (when linked from an event list) or from the TypoScript setting settings.eventUid.

The form collects the following participant data:

  • Salutation, first name, last name
  • Email address, phone number
  • Company name
  • Address, city, zip code
  • Notes (free text)

A checkbox for accepting the terms and conditions is rendered if settings.termsPageUid is set.

Confirmation workflow 

The double opt-in confirmation follows these steps:

  1. User submits the registration form -- the createAction stores a new Participant record with confirmed = false and generates a random 64-character hex hash (confirmationHash).
  2. Confirmation email is sent -- the participant receives an email containing a unique confirmation link. The link points to the page configured in settings.confirmationPid and includes the hash as a parameter.
  3. User clicks the confirmation link -- the confirmAction looks up the participant by hash. If found, it sets confirmed = true and displays a success message.
  4. Invalid or expired hash -- if no matching record is found (e.g., the hash is wrong or the record was already deleted by garbage collection), an error message is shown.

At the same time, an admin notification email is sent to the address configured in settings.adminEmail immediately when the registration is created (step 1), so the admin is informed without waiting for confirmation.

Confirmation page setup 

The confirmation page needs its own Registration Form content element:

  1. Create a dedicated page (e.g., "Registration Confirmation").
  2. Insert the Registration Form content element on this page.
  3. Set the UID of this page as settings.confirmationPid in TypoScript constants.
  4. The confirmation link in the email will direct users to this page with the hash parameter.

Inquiry form setup 

The inquiry form allows visitors to request inhouse training or general information about a course.

  1. Edit the page where the inquiry form should appear (typically the course detail page).
  2. Add a content element of type Inquiry Form (dveducationregistration_inquiryform).

The form collects:

  • Salutation, first name, last name
  • Email address, phone number
  • Company name
  • Request type: info (general information) or inhouse (on-site training request)
  • Course UID (can be passed automatically from the course detail context)
  • Notes (free text)

On submission, an admin notification email is sent to the address configured in settings.adminEmail.

Admin notifications 

Three types of email notifications are sent to the admin:

New registration
Sent immediately when a participant submits the registration form. Contains: participant name, email, company, and event UID.
New inquiry
Sent when a visitor submits the inquiry form. Contains: request type (info/inhouse), name, email, company, and notes.

All emails are sent from the address configured in $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress'].

Typical page structure 

A recommended page tree setup:

Root
+-- Courses (list view from dv_education_courses)
|   +-- Course Detail (detail view from dv_education_courses)
|       +-- Event Registration
|       |   Content: Registration Form plugin
|       +-- Inquiry
|           Content: Inquiry Form plugin
+-- Registration Confirmation
|   Content: Registration Form plugin (handles confirm action)
+-- Terms and Conditions
|   Content: Regular text content with T&C
+-- Storage (SysFolder, not in menu)
    Stores: Participant records, InquiryRequest records
Copied!

Configuration summary for this setup:

  • persistence.storagePid = UID of "Storage" folder
  • settings.adminEmail = admin email address
  • settings.confirmationPid = UID of "Registration Confirmation" page
  • settings.termsPageUid = UID of "Terms and Conditions" page