Education Courses 

Extension key

dv_education_courses

Package name

davitec/dv-education-courses

Version

1.0.3

Language

en

Author

Davitec GmbH

Email

info@davitec.de

License

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


Generic course catalog for the education sector. Manages courses, events, locations, and contact persons with a three-level hierarchy (Course → Event → SingleEvent), search and filter capabilities, and flexible plugin-based frontend rendering.


Table of Contents

Introduction 

What does it do? 

The Education Courses extension provides a generic course catalog system for the education sector. It was originally extracted from the EIPOS course management system and designed to be reusable across different TYPO3 projects.

The extension manages the complete lifecycle of educational offerings: from defining course templates with descriptions, objectives, and target groups, to scheduling concrete events with dates, pricing, and locations, down to individual session dates within multi-day events.

It provides four frontend plugins for listing and displaying courses and events, including full-text search and type-based filtering.

Features 

Domain models 

The extension ships with six domain models that cover the full course catalog domain:

  • Course -- The main entity. Holds title, description, content, objectives, target groups, admission requirements, images, and a slug for URL generation.
  • Event -- A concrete scheduled instance of a course with start/end dates, duration, price, location reference, booked-up and on-request flags, and an event code.
  • SingleEvent -- An individual date entry within a multi-day event, providing fine-grained scheduling (title, start date, end date).
  • Type -- Categorises courses (e.g. workshop, seminar, certificate program) with title, description, and slug.
  • Location -- Physical venue with name, street, zipcode, and city. Provides a computed full address string.
  • ContactPerson -- Contact details (salutation, title, first name, last name, phone, email) linked to courses via MM relation.

Three-level hierarchy 

The data model follows a clear three-level hierarchy:

Course
  |-- Event (IRRE, cascade delete)
  |     |-- SingleEvent (IRRE, cascade delete)
  |
  |-- ContactPerson (MM relation)
  |-- SimilarCourses (MM self-relation)
Copied!
  • CourseEvent: One course can have multiple scheduled events (inline relation with cascade delete).
  • EventSingleEvent: Each event can contain multiple single-day entries for multi-day schedules (inline relation with cascade delete).
  • CourseContactPerson: Many-to-many relation allowing shared contact persons across courses.
  • CourseSimilarCourses: Self-referencing many-to-many relation for cross-linking related courses.

Frontend plugins 

Four content element plugins are registered:

  • CourseList -- Lists courses with text search and type filter. The list action is non-cacheable to support POST-based search.
  • CourseDetail -- Displays a single course with all its details, events, contact persons, and similar courses.
  • EventList -- Lists upcoming events with filtering. The list action is non-cacheable.
  • EventDetail -- Displays a single event with its schedule (single events), location, and pricing.

Search and filter 

The course list plugin provides:

  • Text search via a search term input field
  • Type filter to narrow results by course type
  • Reset button to clear all filters
  • Pagination with configurable items per page

Slug management 

Automatic slug generation is provided for the following entities:

  • Courses (slug field)
  • Events (slug field)
  • Types (slug field)

Slugs enable human-readable URLs when used with TYPO3's route enhancer configuration.

Compatibility 

  • TYPO3: v12.4 LTS and v13.4 LTS
  • PHP: 8.2, 8.3, 8.4

Installation 

Requirements 

  • TYPO3 v12.4 LTS or v13.4 LTS
  • PHP 8.2 or higher
  • Composer-based TYPO3 installation

Composer installation 

Install the extension via Composer:

composer require davitec/dv-education-courses
Copied!

Activate the extension 

After installing the package, activate the extension in the TYPO3 backend:

  1. Go to Admin Tools > Extensions.
  2. Search for dv_education_courses.
  3. Click the activate icon if the extension is not yet active.

Alternatively, activate via CLI:

vendor/bin/typo3 extension:setup
Copied!

Database update 

The extension adds several database tables. Update the database schema:

Via backend:

  1. Go to Admin Tools > Maintenance > Analyze Database Structure.
  2. Apply all suggested changes for tables starting with tx_dveducationcourses_.

Via CLI:

vendor/bin/typo3 database:updateschema
Copied!

Include TypoScript 

The extension's TypoScript must be included in your site's template:

  1. Go to Web > Template and select your root page.
  2. Open the Includes tab (or Info/Modify in older versions).
  3. Add Education Courses (dv_education_courses) to the list of included static templates.

Alternatively, include it manually in your site package:

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

Quick start guide 

After installation, follow these steps to get a working course catalog:

  1. Create a storage folder

    Create a new SysFolder in the page tree (e.g. "Course Data") that will hold all course, event, type, location, and contact person records.

  2. Set the storage PID

    Configure the TypoScript constant to point to your storage folder:

    plugin.tx_dveducationcourses.persistence.storagePid = 42
    Copied!

    Replace 42 with the UID of your storage folder.

  3. Create pages for the plugins

    Create the following pages in your page tree:

    • A page for the course list
    • A page for the course detail view
    • A page for the event list (optional)
    • A page for the event detail view (optional)
  4. Configure page PIDs

    Set the TypoScript constants for the detail and list page UIDs:

    plugin.tx_dveducationcourses.settings.detailPid = 10
    plugin.tx_dveducationcourses.settings.listPid = 9
    plugin.tx_dveducationcourses.settings.eventDetailPid = 12
    plugin.tx_dveducationcourses.settings.courseDetailPid = 10
    Copied!
  5. Add plugins to pages

    • On the course list page, add the Course List content element.
    • On the course detail page, add the Course Detail content element.
    • Repeat for event list and event detail if needed.
  6. Create initial data

    In your storage folder, create:

    • At least one Type record (e.g. "Seminar", "Workshop").
    • At least one Course record with a type assigned.
    • At least one Event record as an inline child of the course.
  7. Clear caches and test

    Flush all caches and visit your course list page in the frontend.

Configuration 

TypoScript constants 

All settings are configured under plugin.tx_dveducationcourses. The following constants are available:

Constant

Type

Default

Description

persistence.storagePid

int

(empty)

UID of the SysFolder containing course records.

settings.detailPid

int

(empty)

UID of the page containing the Course Detail plugin.

settings.listPid

int

(empty)

UID of the page containing the Course List plugin.

settings.eventDetailPid

int

(empty)

UID of the page containing the Event Detail plugin.

settings.courseDetailPid

int

(empty)

UID of the page containing the Course Detail plugin (used in event views to link back to the parent course).

settings.itemsPerPage

int

20

Number of items shown per page in list views.

Example configuration:

plugin.tx_dveducationcourses {
    persistence.storagePid = 42
    settings {
        detailPid = 10
        listPid = 9
        eventDetailPid = 12
        courseDetailPid = 10
        itemsPerPage = 15
    }
}
Copied!

FlexForm settings 

The Course List plugin provides a FlexForm with plugin-level overrides for the following settings. These values take precedence over the TypoScript constants when set:

Setting

Description

Default

settings.detailPid

Course detail page -- overrides the TypoScript constant for this specific plugin instance. Page picker (group type).

(from TypoScript)

settings.listPid

Course list page -- overrides the TypoScript constant for this specific plugin instance. Page picker (group type).

(from TypoScript)

settings.itemsPerPage

Number of items per page for pagination in this plugin instance.

20

To access the FlexForm, edit the Course List content element and switch to the Plugin tab.

Plugins (CType) 

The extension registers four content element plugins (CType). All plugins use the Extbase PLUGIN_TYPE_CONTENT_ELEMENT registration.

CType

Plugin key

Controller / Action

Cacheable

dveducationcourses_courselist

CourseList

CourseController::list

No (non-cacheable for POST search)

dveducationcourses_coursedetail

CourseDetail

CourseController::show

Yes

dveducationcourses_eventlist

EventList

EventController::list

No (non-cacheable for filtering)

dveducationcourses_eventdetail

EventDetail

EventController::show

Yes

Caching behaviour 

The extension configures cHash exclusions in ext_localconf.php for all plugin parameters. This ensures that search terms, filter values, and detail record UIDs do not generate unnecessary cHash values that would pollute the page cache.

The excluded parameters cover all four plugins:

  • tx_dveducationcourses_courselist[searchTerm]
  • tx_dveducationcourses_courselist[type]
  • tx_dveducationcourses_coursedetail[course]
  • tx_dveducationcourses_eventdetail[event]
  • All associated __referrer and __trustedProperties parameters

The CourseList and EventList plugins are registered as non-cacheable because they handle POST-based search and filter requests. The CourseDetail and EventDetail plugins are fully cacheable.

Template overrides 

The extension uses standard Extbase/Fluid template paths. To override templates in your site package, add higher-priority template paths via TypoScript:

plugin.tx_dveducationcourses {
    view {
        templateRootPaths.10 = EXT:your_site_package/Resources/Private/Extensions/DvEducationCourses/Templates/
        partialRootPaths.10 = EXT:your_site_package/Resources/Private/Extensions/DvEducationCourses/Partials/
        layoutRootPaths.10 = EXT:your_site_package/Resources/Private/Extensions/DvEducationCourses/Layouts/
    }
}
Copied!

The default template paths (priority 0) are:

  • EXT:dv_education_courses/Resources/Private/Templates/
  • EXT:dv_education_courses/Resources/Private/Partials/
  • EXT:dv_education_courses/Resources/Private/Layouts/

Usage 

Managing course types 

Course types categorise your courses (e.g. "Workshop", "Seminar", "Certificate Program"). They are used for filtering in the course list.

  1. Navigate to your storage folder in Web > List.
  2. Click the Create new record button.
  3. Select Type under the Education Courses section.
  4. Fill in the fields:

    • Title -- The display name of the type (e.g. "Seminar").
    • Description -- Optional description of this course category.
    • Slug -- Auto-generated from the title. Used for URL generation.
  5. Save the record.

Create at least one type before creating courses. Types enable visitors to filter the course list by category.

Creating courses 

A course represents an educational offering (e.g. "Project Management Fundamentals"). It is the top-level entity in the hierarchy.

  1. Navigate to your storage folder in Web > List.
  2. Click Create new record and select Course.
  3. Fill in the General tab:

    • Title -- The course name.
    • Slug -- Auto-generated from the title for URL routing.
    • Type -- Select a previously created type.
    • Description -- Short summary shown in list views.
    • Content -- Full course description (RTE field).
  4. Fill in the Details tab:

    • Objectives -- Learning objectives of the course.
    • Target Groups -- Who should attend this course.
    • Admission Requirements -- Prerequisites for enrolment.
  5. Add Images via the file reference relation.
  6. Save the record.

Adding contact persons 

Contact persons are shared records that can be linked to multiple courses via an MM relation.

  1. Create ContactPerson records in your storage folder:

    • Salutation -- e.g. "Frau", "Herr".
    • Title -- Academic title (e.g. "Dr.", "Prof.").
    • First Name and Last Name.
    • Phone and Email.
  2. To link a contact person to a course, edit the course record and add the contact person in the Contact Persons relation field.

A single contact person can be assigned to multiple courses. Changes to the contact person record are reflected everywhere it is used.

Adding events 

Events are concrete scheduled instances of a course. They are stored as inline (IRRE) children of the course record.

  1. Edit a course record.
  2. In the Events section, click Create new.
  3. Fill in the event fields:

    • Title -- Name of this specific event instance (e.g. "Spring 2026").
    • Event Code -- Internal identifier or booking code.
    • Description -- Additional details specific to this event.
    • Start Date and End Date -- The overall event period.
    • Duration -- Text field for display purposes (e.g. "3 days", "40 hours").
    • Price -- Numeric value in EUR. Displayed as formatted currency (e.g. "1.250,00 EUR").
    • Location -- Select a previously created location record.
    • Booked Up -- Check if this event is fully booked. Displayed as a flag in the frontend.
    • On Request -- Check if pricing is only available on request. When enabled, the price is hidden in the frontend.
    • Slug -- Auto-generated from the title.
  4. Save the course (events are saved with the parent course).

Adding single events 

Single events represent individual session dates within a multi-day event. They are stored as inline (IRRE) children of the event record.

  1. Edit an event (within a course record).
  2. In the Single Events section, click Create new.
  3. Fill in:

    • Title -- Name of this session (e.g. "Day 1: Introduction").
    • Start Date -- Date and time this session begins.
    • End Date -- Date and time this session ends.
  4. Repeat for each session day.

Single events are displayed in the event detail view, providing visitors with a detailed schedule of multi-day events.

Managing locations 

Locations are standalone records representing physical venues.

  1. Create a Location record in your storage folder:

    • Name -- Venue name (e.g. "Conference Center Dresden").
    • Street -- Street address.
    • Zipcode -- Postal code.
    • City -- City name.
  2. The location is then available for selection in event records.

The model provides a computed fullAddress property that combines street, zipcode, and city into a single display string.

Linking similar courses 

Courses can be cross-linked via the similar courses MM relation. This is useful for "You might also be interested in" sections on the course detail page.

  1. Edit a course record.
  2. In the Similar Courses relation field, add one or more other courses.
  3. Save.

In addition to manual linking, the CourseService provides automatic suggestions based on matching course types. If a course has fewer manual similar-course links than desired, the service fills up with other courses of the same type.

Course list: search and filter 

The CourseList plugin renders a list of courses with search and filter capabilities.

Frontend features:

  • Search field -- Visitors can enter a text search term. The search is performed on course titles and descriptions.
  • Type filter -- A dropdown or selection of course types to filter results.
  • Reset button -- Clears all active filters and shows the full list.
  • Pagination -- Results are paginated according to the itemsPerPage setting (default: 20).

How search works:

The list action accepts searchTerm and type parameters via POST. Since the action is non-cacheable, each search request is processed fresh. The cHash exclusion configuration ensures no cHash errors occur.

Configuration per instance:

Each CourseList plugin instance can override the detail page PID, list page PID, and items per page via the FlexForm (see Configuration).

Event listing 

The EventList plugin displays events. It shows upcoming events and currently running events based on the start and end dates.

The event model provides two computed properties:

  • isUpcoming -- Returns true if the event's start date is in the future.
  • isRunning -- Returns true if the current date is between the event's start and end dates.

These properties can be used in Fluid templates to visually distinguish between upcoming and running events.

Course and event detail views 

The CourseDetail plugin renders all information about a single course:

  • Title, description, content
  • Objectives, target groups, admission requirements
  • Images
  • List of events with dates, prices, and locations
  • Contact persons with phone and email
  • Similar courses

The EventDetail plugin renders a single event:

  • Title, event code, description
  • Start/end dates, duration
  • Price (formatted with currency symbol, or hidden for on-request events)
  • Location with full address
  • Schedule of single events (for multi-day events)