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.
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:
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:
Course types categorise your courses (e.g. "Workshop", "Seminar", "Certificate
Program"). They are used for filtering in the course list.
Navigate to your storage folder in Web > List.
Click the Create new record button.
Select Type under the Education Courses section.
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.
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.
Navigate to your storage folder in Web > List.
Click Create new record and select Course.
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).
Fill in the Details tab:
Objectives -- Learning objectives of the course.
Target Groups -- Who should attend this course.
Admission Requirements -- Prerequisites for enrolment.
Add Images via the file reference relation.
Save the record.
Adding contact persons
Contact persons are shared records that can be linked to multiple courses via an
MM relation.
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.
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.
Edit a course record.
In the Events section, click Create new.
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.
Save the course (events are saved with the parent course).
Note
Deleting a course will automatically delete all its events (cascade delete).
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.
Edit an event (within a course record).
In the Single Events section, click Create new.
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.
Repeat for each session day.
Single events are displayed in the event detail view, providing visitors with a
detailed schedule of multi-day events.
Note
Deleting an event will automatically delete all its single events
(cascade delete).
Managing locations
Locations are standalone records representing physical venues.
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.
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.
Edit a course record.
In the Similar Courses relation field, add one or more other courses.
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)
Reference to the headline
Copy and freely share the link
This link target has no permanent anchor assigned.The link below can be used, but is prone to change if the page gets moved.