Seminar Manager (seminars) 

Extension Key

seminars

Language

en, de

Copyright

2005-2024, Oliver Klee, typo3-coding@oliverklee.de

Maintainer

Oliver Klee, typo3-coding@oliverklee.de

License

CC BY-SA 3.0

Rendered

Sat, 20 Dec 2025 17:54:33 +0000

The content of this document is related to TYPO3 - a GNU/GPL CMS/Framework available from www.typo3.org

Introduction 

If you like this extension, please submit a rating for it in the TER.

Compatibility with TYPO3 12LTS/12.4 

A TYPO3-12LTS-compatible version of this extension is available via an early-acces program.

Staying informed about the extension 

If you would like to stay informed about this extension (including compatibility with newer TYPO3 versions), you can subscribe to the author's newsletter.

What does it do? 

This extension allows you to create and manage a list of seminars, workshops, lectures, theater performances and other events as an overview or as detailed descriptions. In addition, it allows front-end users to register for these events.

Particularly, you can manage speakers, seminar sites and organizers and use them for the seminars. You can get an overview of how many people have registered for which seminar.

Key features 

  • event topic records for events that occur more than once
  • searchable front-end plug-in with list view and detailed single view of upcoming events
  • selector widget to filter the list of events in the list view
  • online registration and unregistration for front-end users, including automatic confirmation email and live update of available seats
  • early bird prices are possible
  • categories and target groups for events
  • dependencies between topics, e.g. users need to be registered for “communication” and “speaking” before they can register for “facilitation”
  • “my events” list for logged-in front-end users, showing for which events they have signed up
  • front-end list of registrations for an event (visible to participants and editors)
  • back-end module for managing event and registrations
  • front-end editing of event records
  • publishing workflow for events entered in the front end
  • files can be attached to each event
  • CSV export of events and registrations of an event
  • the front-end output is mostly valid XHTML
  • visual design is done using only CSS
  • mostly accessible front-end output, works with the sb\_accessiblecontent extension (for version 0.8.0, the extension's accessibility will be thoroughly checked for accordance with W3C WAI, section 508 and BITV guidelines)
  • currently full German, English, Dutch, Danish, Italian, French and Russian localization, including a switch between formal and informal language (e.g.,“Sie”/”Du” in German)
  • the front-end plug-in can be configured via TypoScript and Flexforms
  • automatic configuration check that quickly leads to a working configuration
  • the code follows the TYPO3 coding guidelines
  • the extension is actively developed
  • is tested with Firefox, Safari and IE7 and 8 (if you need IE6 compatibility, this might require additional work on our side)

Screenshots 

|img-1| Illustration 1: This is a front-end list a seminars. Note the color-coded number of vacancies in the last column.

|img-2| Illustration 2: This is the top of a front-end detailed view for a seminar.

|img-3| Illustration 3: This is the “my events” list for a logged-in front-end user.

|img-4| Illustration 4: This is the “my editor events” list where FE users that have been granted access may view the list of registrations for an event (this is useful e.g., for the organizers or the speakers).

|img-5| Illustration 5: This is the automatic configuration check (here: on the details page) having something to complain about.

Seeing this extension in action 

Give it a try! 

If you would like to test the extension yourself, there is a DDEV-based TYPO3 distribution with this extension installed and some test records ready to go.

References 

If you would like your site to be listed here, please drop the extension author a short email.

Credits 

Thanks go to the following persons for contributing code, bug fixes or localizations or for doing code reviews:

  • Alexander Maringer
  • Andreas Balzer (German translation of the manual)
  • Andre Dittmar (list view hook)
  • Benjamin Schulte
  • Bernd Schönbach
  • Christian Hennecke (proofreading of the manual)
  • Christoph Taubmann
  • David Lenherr (German tutorial)
  • Donatas Elvikis
  • FrançoisSuter (FR localization)
  • Frank Schepers (NL localization)
  • Franz Ripfel
  • Irina Kuznecova (RU localization)
  • John Boyd-Rainey
  • Jörn Dost
  • Kees van der Hall (NL localization)
  • Klaus Brinch (DK localization)
  • Lars Dyhr (DK localization)
  • Maik Müller
  • Mario Rimann
  • Martin Rebetez (FR localization)
  • Mathias Uhl
  • Matthias Krappitz
  • Mauro Lorenzutti (IT localization)
  • Moritz Mark
  • Nickolas A. Shadrin (RU localization)
  • Nico Deblauwe (Dutch manual)
  • Niels Pardon
  • Oliver Hader (TCEmain hook)
  • Philipp Kitzberger
  • Ralph Brugger
  • Roman Benz
  • Saskia Metzler
  • Sebastian Wittig (icons)
  • Simon Harhues
  • Sinian Zhang
  • Stefan Galinski
  • Thomas Pforte

Sponsorship 

Development of this extension has been funded by the following organizations and persons:

Installing the extension 

It is highly recommended to have your TYPO3 installation in composer mode. Without Composer mode, some functionality of the extension will not be available (e.g., inlining CSS in emails, and the CSV export (starting with seminars 5.2.0)).

If you want visitors to be able to register for your events without a FE login, using the onetimeaccount extension is recommended for this purpose.

Upgrading from seminars 4.x to 5.x 

Upgrading in multiple steps 

As this extension follow semantic versioning, seminars 5.0 has all the breaking changes. So it is recommended you do the upgrade in the following order.

Also, clearing all caches after each step is recommended.

1. Drop removed content elements 

Some content elements have been removed in seminars 5.0.

  1. If you are using the event countdown, delete those content elements.
  2. If you are using the event headline plugin, delete those content elements.
  3. Upgrade to seminars 4.4

Upgrade to seminars 4.4 and run the upgrade wizards (just to be sure).

3. Set new configuration values 

If you would like to use the informal salutation mode in the frontend, set plugin.tx_seminars.settings.salutation = informal in the TypoScript constants (or conveniently in the constants editor).

If you are using a different currency than Euro (or you would like to tweak the currency format), edit plugin.tx_seminars.settings.currency in the TypoScript constants (or conveniently in the constants editor).

4. Switch to the rewritten FE editor 

Starting with seminars 4.2, using the new FE editor is recommended. (The legacy FE editor was removed in seminars 5.0.)

  1. On the FE editor page, switch the seminars plugin to a general plugin and set the type to "Front-end editor for events". Configure it to your needs using the settings in the FlexForms.
  2. Switch to the rewritten registration form

Starting with seminars 4.3, using the new registration form is recommended. (The legacy registration form was removed in seminars 5.0.)

  1. If you are using the "onetimeaccount" extension on the login page, switch the plugin type to "One-time FE account creator without autologin". (This step is optional, but recommended.)
  2. On the registration page, switch the seminars plugin to a general plugin and set the type to "Registration form for events". Configure it to your needs using the settings in the FlexForms.
  3. Delete the thank-you page that was be display after someone has registered for an event. (This is now part of the registration form plugin.)
  4. Switch to the rewritten backend module

Starting with seminars 4.4, using the new backend module form is recommended. (The legacy backend module form was removed in seminars 5.0.)

Edit your backend user or user group permissions, grant the users/groups permissions for the new backend module, and drop their permissions for the old backend module.

7. Update the configuration 

  1. Enable the automatic configuration check in the extension settings.
  2. Click through all your seminars-related content elements, watch for configuration check warnings, and fix them.
  3. Disable the automatic configuration check in the extension settings again.
  4. Upgrade to seminars 5.x

  1. Upgrade to seminars 5.x.
  2. Uninstall the mkforms and rn_base extensions (if you are not using Composer mode).
  3. Apply all DB updates.
  4. Run the upgrade wizards.
  5. Enable the slug fields for your editors

Enable the seminars "URL segment" (slug) field for your editors. (Otherwise, you might get exceptions in the frontend if an event does not have a slug and your are using nice URLs for the single view.)

Regarding flexforms and TS setup 

After having installed this extension (and the required extensions) via the extension manager, a few more steps are necessary to get the extension up and running:

IMPORTANT: All non-empty changes at the flexforms of the plug-in overwrite the settings of the corresponding TS setup. Empty data in the flexforms don't overwrite non-empty data from the TS setup, so if you want to overwrite non-empty values with empty values, you can enter a space or a comma (depending on the field).

Setting up a login page 

Some of this extension's features require a FE user to be logged in, for example the event registration, the event management in the FE or access to the attendee lists. If you are not using any of these feature, you can skip this chapter.

Selecting which login plugins to use 

There are two possible scenarios for the login page:

  1. You have (recurring) visitors that log in to your site in order to register for events, to unregister again, or to manage events. In this case, you will need regular login form using the felogin extension that comes with the TYPO3 Core. Make sure to enable the "Redirect defined by GET/POST parameters" in the login plugin settings.
  2. You want people to register for your events, but you do not want bother them with having to create an account. In this case, you will need the onetimeaccount extension.

If you want to cover both scenarios, you can also use both plugins (on the same page.)

Allowing users to create an account with a double-opt-in process before they can log in is not, supported, though. (In that case, the redirect parameter to the registration page in the link to the login page will get lost.)

Selecting which onetimeaccount plugin to use 

The onetimeaccount extension comes with two plugins:

One-time FE account creator with autologin 

Do not use this version anymore. (It was needed for the legacy seminars registration form that got removed in seminars 5.0.

One-time FE account creator without autologin 

Use this version with the the rewritten seminars registration form that was introduced in seminars 4.3.0.

Set up the plug-in 

Include the Seminars static template in your site template under “Include static (from extensions).”.

Then configure the plug-in in your TS template setup or the plug-in flexforms. The properties are listed in the reference.

Please note than when using flexforms, you need to set the corresponding values at all relevant instances of the plug-in: It doesn't do to specify the fields for the online registration in the seminar list front-end plug-in—you need to set these fields in the online registration front-end plug-in.

You can use this TypoScript setup template for setting all required values for a basic setup:

plugin.tx_seminars {
  # PID of the sysfolder where event registrations (attendances) will be stored
  attendancesPID =
}

# localizations for strings in emails and some FE parts go here (the example is for German)
plugin.tx_seminars._LOCAL_LANG.de {
}

plugin.tx_seminars_pi1 {
  # PID of the sysfolder that contains all the event records (e.g., the starting point)
  pages =

  # PID of the FE page that contains the event list
  listPID =

  # PID of the FE page that contains the single view
  detailPID =

  # PID of the FE page that contains the "my events" list
  myEventsPID =

  # PID of the FE page that contains the seminar registration plug-in
  registerPID =

  # PID of the FE page that contains the login form or onetimeaccount
  loginPID =
}

# localizations for FE-only parts go here (the example is for German)
plugin.tx_seminars_pi1._LOCAL_LANG.de {
}

# here you can change stuff like the number of items per page etc.
plugin.tx_seminars_pi1.listView {
}
Copied!

Note that the notification email to the organizer and the list view show the headings even for empty fields, while the single view and the notification email to the participant remove the headings for some seminar properties (not all, just where it makes sense).

Creating system folders 

In addition to the website\_users\_folder , you need to create some system folders for storing records needed by this extension.

If you don’t have many events and you can keep the overview even if the event dates and the registrations are on one page each, you can create a minimal SysFolder structure like this:

|img-6| Illustration 6: SysFolder structure for minimum requirements

If you have only one page with one list view for the events, you can have all current event records in one system folder:

|img-7| Illustration 7: All current events in one folder

If it is okay for to have the registrations for all organizers arrive in one system folder or if you have only one organizer, you only need one folder for the registrations:

|img-8| Illustration 8: Registrations for all organizers in one folder

The following system folder structure is proposed for a full-blown installation with lots of events and different organizers that manage their registrations independently:|img-9| Illustration 9: Full blown installation

If you create these folders outside of the site root page with the template, you still need to create a template for them and “include static (from extensions)” in that template, or else the back-end module will not be able to use the extension's default configuration (e.g., the date and time format, so that date won't get displayed in the back-end module).

Setting access rights 

The user groups who should be able to manage seminars should have:

  • the module Web > Events in their module list
  • write access to the following tables (may be split into several groups): Seminars, Speakers, Registrations, Seminar Sites, Organizers, Payment Methods
  • allowed excludefields: Seminars: hide, Seminars: start, Seminars: stop ( only set this for users who really need it and know the difference between start/stop for FE display and start/stop of the seminar hours )
  • other needed excludefields from the event records
  • the corresponding system folders in their DB mounts

If you want to enter registrations manually for participants who don't have a front-end user account yet, or if you want to be able to edit the front-end user data, you need to set the following access rights as well:

  • write access to the following tables (may be split into several groups): front-end users, addresses
  • allowed excludefields: front-end user: name, address, phone email, zip code, city, inactive; address: mobile
  • the front-end users system folder in their DB mounts

Adding front-end pages 

If your site does not use the online registration feature, you have to explicitly disable that feature.

Your page structure can then look like this:

|img-10| Illustration 10: Page structure for a setup without online registration

Usually, you’ll want to use this extension with the online registration feature. For this, the minimal page structure will look like this:

|img-11| Illustration 11: Page structure for a minimal setup with online registration

For a full-blown registration with several list views, two archive pages, the “my events page” (where a user can see the events to which they have signed up), registrations lists for participants and s and front-end editing, the page structure would look like this (usually, you only need some of these pages):

|img-12| Illustration 12: Page structure for a full-blown setup

  1. If you want users to be able register manually, then build up a front- end user system for your site. Remember which group corresponds to “confirmed front-end users.”
  2. Add a page (which we called “ *Events (list view)* ” in the illustrations) that will contain the list view.
  3. Add a page (“ *Details (not in menu)* ”) that will contain the detail view.
  4. Add a “Seminar Manager”-plug-in content element to both of these pages (from step 2 and 3) and set the corresponding types to “Event List”/”Event single view”. Set the content element's ”Starting Point” to the SysFolder that contains (or will contain) the seminar records (what we called “ *Event Data ” in Illustrations 1-4). The element on “ **Events (list view)* ” will show the seminar list and the detailed seminar view will be shown on “ Details (not in menu).”** Usually, this content element doesn't have any access restrictions.If you would like to show only the seminars from certain organizers, put the seminar records for the organizers on separate pages, and add only the corresponding pages as starting pages for the plug-in.
  5. Add a page (which we called “ *Registration (not in menu)* ” in the illustrations) that will be the registration page. Important: The Seminar Manager creates links to this page (for example from the list- and detailed view and as a redirect parameter after login) – this will fail if this page is access restricted. Don't hide this page and don't apply user restrictions to the page itself! A good way is to mark the page as “hide in menu,” but the page must be accessible for all visitors, independent of their login status (logged in or not).
  6. New registration form that got introduced in seminars 4.3: Add a plug-in content element and set the type to "Registration form for events". Configure it to your needs using the settings in the FlexForms.
  7. Add another page that will contain the “my events” list (if you want to use that feature). Set the page access to “show at any login.”
  8. Add a “Seminar Manager”-plug-in content element to that page and set the type to “My Events.” Set the content element's start pages to the page or pages that contain (or will contain) the seminar records. This element then works like the “Event List” content type, but it will only show those events to which the currently logged-in front-end user has signed up. If you want this list to show all events instead of current and upcoming, set “Only show events from this time-frame” to “all events” (you'll probably want to do this).

Enabling unregistration 

To enable users to unregister themselves from events (using the “my events” page), you need two things:

  1. Unregistration deadline: You either can set individual unregistration deadlines in the events for which unregistration should be possible, or you can set a global deadline for all events using plugin.tx_seminars.unregistrationDeadlineDaysBeforeBeginDate.
  2. Waiting list: By default, unregistration is only possible if an event is full and has some people on its waiting list. If you want to enable unregistration if the waiting list is empty (or if there is no waiting list), you can use plugin.tx_seminars.allowUnregistrationWithEmptyWaitingList = 1.

Setting up a list of categories 

The category list shows all categories for which there are events in the selected system folders and in the selected time-frame. If your events are not assigned to any categories, the category list will be empty.

The category names are linked to the list view, filtered by that category (in other words: only events from the selected category are displayed).

This tutorial assumes that you already have set up a list view of your events.

  1. Add a front-end page.
  2. Add a “Seminar Manager”-plug-in content element to this page and set the type to “Category List.”
  3. Select the page that contains the list view (this page will be used for creating the links).
  4. Optional: Select the system folders (and recursion depth) that contain the events for which you would like to list the categories. If you select nothing, events from all system folders will be taken into account.
  5. Optional: Select the time-frame from which you the events should be selected. If you select nothing, current and upcoming event will be taken into account.
  6. Save and close.

Setting up the front-end registration lists 

This feature allows front-end users who have signed up for an event to see who has signed up for that event as well, e.g., for forming car pools or for coordination before the event takes place. In addition, this allows so-called editors (e.g., speakers or organizers of that event) to see that list as well. Both features are disabled by default. When using this feature, make sure that this complies with your privacy policy!

Both lists are set up separately. Even if you useboth lists, they need to be set up separately.

You can enter a list of FE user field names that will be displayed in the registration lists using the TS setup variable plugin.tx_seminars_pi1.showFeUserFieldsInRegistrationsList. The default is to only display the attendees' names.

Setting up the front-end registration lists for attendees 

Please note that there is no fine-grained access rights system: Either you allow all attendees to view the registration lists for all events for which they have signed up, or you don't.

  1. If there is no “my events” page yet, create one. This page will show all events for which a FE user has signed up.

    1. Add a new page.
    2. Set the page access to “show at any login.”
    3. Add a new content element “General Plugin.”
    4. Set the element's plug-in type to “Seminar Manager,” set it to display the “my events” list and set the element's starting point to your SysFolder(s) with the event records. You'll probably want to also set the time-frame for this list to “all events” instead of the default value “current and upcoming events.”
  2. Now add a second page for the registration lists (preferably a sub page of the “my events” page), set it to not appear in the menu and set the page access to “show at any login.”

    1. Add a new content element “General Plugin.”
    2. Set the element's plug-in type to “Seminar Manager” and set it to display the “list of registrations (for attendees).”
  3. Now return to the page with the “my events” list and edit that content element again.

    1. Under “Page that contains the list of registrations (for attendees):”, select the page you've just created.
  4. If you would like the registration lists to be linked from the normal list view, edit the seminar list and also select the page with the registrations list under “Page that contains the list of registrations (for attendees):”.

Setting up the front-end registration lists for managers 

Please note that this feature has a rather fine-grained access right system: For each event, you can specify which FE users should be allowed to view the registration lists of that particular event.

  1. Create a “editors” FE-user group.
  2. Edit the events for which some FE users should be allowed to view the registration lists. Add those FE users in the section“Front-end users that are allowed to see the list of registrations” of the corresponding event records. For example, you could allow the speakers or the organizers to see the registrations list. In addition, add the corresponding FE users to the FE user group “editors.”
  3. Set up a “my editable events” page. This page will list exactly those events for which that particular FE user is set as an editor.

    1. Add a new page.
    2. Set the page access to “editors.”
    3. Add a new content element “General Plugin.”
    4. Set the element's plug-in type to “Seminar Manager,” set it to display the “my editable events” list and set the element's starting point to your SysFolder(s) with the event records. You'll probably want to also set the time-frame for this list to “all events” instead of the default value “current and upcoming events.”
  4. Now add a second page for the registration lists (preferably a sub page of the “my events” page), set it to not appear in the menu and set the page access to “editors.”

    1. Add a new content element “General Plugin.”
    2. Set the element's plug-in type to “Seminar Manager” and set it to display the “list of registrations (for editors).”
  5. Now return to the page with the “my events” list and edit that content element again.

    1. Under “Page that contains the list of registrations (for editors):”, select the page you've just created.
  6. If you would like the registration lists to be linked from the normal list view, edit the seminar list and also select the page with the registrations list under “Page that contains the list of registrations (for editors):”. Please note that in case a FE user is both an attendee and an editor for an event, the link to the registration list for editors will take precedence.

Setting up the Scheduler task 

This extension offers a Scheduler Task to trigger actions. It can be configured to send reminders to the events' organizers

  • if a confirmed event is about to begin, or
  • if the speakers' cancelation deadline of a neither confirmed nor canceled event has just passed.

The reminders are emails with a localized text and the list of registrations appended as CSV.

To setup the CLI, do the following:

  1. Set up the Scheduler as described in the manual of the Scheduler extension.
  2. Choose/create a FE page where to do some TS setup configuration for the Scheduler task and configure the following:
  • Set the option “ sendCancelationDeadlineReminder ” to 1 to enable the cancellation deadline reminder.
  • For the option “ sendEventTakesPlaceReminderDaysBeforeBeginDate ”, set the number of days before an upcoming event, when to send a reminder to the organizers. Setting zero will disable this reminder about an event taking place.
  • In order to customize the appended CSV, the options “ filenameForRegistrationsCsv ”, “ fieldsFromFeUserForEmailCsv ”, “ fieldsFromAttendanceForEmailCsv ” and “ showAttendancesOnRegistrationQueueInEmailCsv ” are relevant. Please consider the corresponding section about CSV-File Attachmentfor more details.
  1. Add a seminars Scheduler task and provide UID of the page with the configuration.

CSV-File Attachment 

The mails send via Scheduler can contain a CSV file with the registrations to the event the mail is sent for. To customize the contents of the CSV file use the following options:

  • fieldsFromAttendanceForEmailCsv ” and “ fieldsFromFeUserForEmailCsv ” customize the fields which are exported in the CSV file. Please note that the CSV files always contains the columns for the data from the registration records first and then data from the corresponding FE user record.
  • filenameForRegistrationsCsv ” determines the name of the attached CSV file.
  • showAttendancesOnRegistrationQueueInEmailCsv ” determines whether registrations on the waiting list, should also be exported via CSV.

Daily digest of new registrations  

The Scheduler task also can send a (usually daily) digest of new registration. This functionality can be enabled and configured via TypoScript setup in the namespace plugin.tx_seminars.registrationDigestEmail.

The emails will use the language that has been set as default language for the Scheduler back-end user.

Testing the configuration 

This extension has an automatic configuration checking feature which will check pretty much all configuration settings of this extension for sanity. If it has found anything that needs to be fixed, it will display a big red box with a message. This message will contain information about the following things:

  • what that particular setting is about,
  • which values are allowed, and
  • which values are incorrect.

To make sure that your configuration is correct, please log in as a front-end user and visit all of your pages that contain the Seminar Manager plugin-in. In the back end, please visit the back-end module.

The configuration check slightly decreases the performance of this extension. When your configuration is finished and approved by the checking feature, you can disable the feature in the extension manager.

Note: This feature still is pretty new and edgy. If you think that a particular warning message isn't correct (or you think that a a particular check is missing), please take a minute and file a bug in the bug tracker.

Changing the HTML template 

This extension uses a couple of different HTML templates:

template path
template path
contents
contents
TS setup variable
TS setup variable
template path
Resources/Private/Templates/Mail/e-mail.html
contents
automatic emails
TS setup variable
plugin.tx_seminars.templateFile ( not in flexforms)
template path
pi1/seminars_pi1.tmpl
contents
most front-end output
TS setup variable
plugin.tx_seminars \_pi1 .templateFile (also in flexforms)
template path
Resources/Private/Templates/FrontEnd/EventEditor.html
contents
event editing form
TS setup variable
plugin.tx_seminars \_pi1 .eventEditorTemplateFile

Note: Do not change the HTML templates directly in the extension directory as then your changes will be overwritten when you upgrade the extension to a new version. Make a copy and modify the copy instead:

  1. Copy the corresponding template file to a convenient directory, e.g.,to fileadmin/template/.
  2. Set the corresponding TS setup variable to the path of your new template. For the pi1 templates, you can also use the flexforms of the plug-in for setting the location.
  3. Change the template to your liking.

Configuring prices 

Configuring the currency 

If you are using a different currency than Euro (or you would like to tweak the currency format), edit plugin.tx_seminars.settings.currency in the TypoScript constants (or conveniently in the constants editor).

More price configuration options 

You can set up to four different prices for each event: a “standard price” and a “special” price, e.g., for students and people in full employment (each of them can also be saved as an early bird price). In addition. In the registration form, the user can select the price to pay.

Events for free: In the single view, the standard price always gets displayed (even if it is 0.00), while the special price only gets displayed if it is not 0.00. This means that if you need to enter a price that is 0.00 (e.g., as a special discount), you need to enter this as the standard price and enter the non-zero price as the special price even if the non-free price technically is the standard price.

The early bird prices will only have an effect if you also define an early bird deadline (until when these prices are valid). If no early bird price is set or the deadline has already passed by, these prices won't be visible in the front end.

If you have only one price per seminar, you can configure the list view to not display the special price column (look in the reference for details). In addition, you might want to set some of the following options to just display “price” instead of “standard price”:

  • For the front-end view:

    • plugin.tx_seminars_pi1.generalPriceInList
    • plugin.tx_seminars_pi1.generalPriceInSingle
  • For the emails to the attendees:

    • plugin.tx_seminars.generalPriceInMail

If you have two prices for some or all seminars, you can change the default labels “regular price” and “special price,” e.g., to “Adults” and “Children.” You can change them using these variables:

  • For the front-end list view and detail view:

    • plugin.tx_seminars_pi1._LOCAL_LANG. language .label_price_regular / price_regular_early / / price_special / price_special_early
  • For the emails to the attendees and the drop-down box in the registration form:

    • plugin.tx_seminars._LOCAL_LANG. language .label_price_regular / price_regular_early / price_special / price_special_early

Replace “ language ” with your two-letter language code if you use a language other than English, e.g., “de” for German. Use “default” as language code for English.

Localization 

Changing the salutation mode (formal to informal) 

If you would like to use the informal salutation mode in the frontend, set plugin.tx_seminars.settings.salutation = informal in the TypoScript constants (or conveniently in the constants editor).

Changing the localized strings 

You can change most of the localized strings that are used on the front end and for the emails. (The localized strings for the back end cannot be changed.)

When you want to change some strings, please don't change locallang.xlf directly as these changes would get overwritten on the next update. Instead, do it like this:

  1. Find out the language code of the language for which you'd like to change a string. The language code for English is “default” and the language code for German is “de.” All other languages have two-letter codes as well.
  2. Find out whether the string which you'd like to change is in locallang.xlf or FrontEnd/locallang.xlf.
  3. Find out the array key for that corresponding string.
  4. In your TS setup, set the following (replacing language with your language code and key with the corresponding array key):
  • plugin.tx_seminars._LOCAL_LANG. language.key (for strings from locallang.xlf) or
  • plugin.tx_seminars_pi1._LOCAL_LANG. language.key (for strings from FrontEnd/locallang.xlf)

Configuring CSS 

The extension provides its own basic set of CSS styles (which work best with a white background and if you're already using a CSS-based design and css_styled_content). These stylesheets usually get included automatically. However, if you have set disableAllHeaderCode = 1 and want to use the provided stylesheet , you need to include the stylesheet typo3conf/ext/seminars/pi1/seminars\_pi1.css manually into your page header.

Classes for table rows 

The TR elements of the list view already have a few classes automatically set:

  • listrow-odd for every other row, starting with the second row
  • tx-seminars-pi1-canceled for canceled events
  • tx-seminars-pi1-owner if the logged-in FE user had entered this event record

Configuring the colored square for the number of vacancies 

In the list view, the color of the squares in the vacancies column is configured using CSS. The table cell for the vacancies has three CSS classes:

  • tx-seminars-pi1-vacancies
  • tx-seminars-pi1-vacancies-x with x being replaced by the exact number of vacancies (which may be 0)
  • tx-seminars-pi1-vacancies-available if there is at least one vacancy
  • tx-seminars-pi1-vacancies-cancelled if the event has been cancelled
  • tx-seminars-pi1-deadline-over if the registration deadline for that event has passed

The square itself also has a CSS class:

  • tx-seminars-pi1-square

This allows you to configure the color of the square in detail, depending on the number of vacancies. The default style sheet uses:

  • green for more at least three vacancies
  • yellow for one or two vacancies
  • red for “no vacancies” and for canceled seminars

The corresponding part of the default CSS file looks like this. You can do this likewise in your own style sheet:

.tx-seminars-pi1-vacancies-available .tx-seminars-pi1-square {

background-color: #00a500;

color: inherit;

}

.tx-seminars-pi1-vacancies-2 .tx-seminars-pi1-square, .tx-seminars- pi1-vacancies-1 .tx-seminars-pi1-square {

background-color: #ffff3c;

color: inherit;

}

.tx-seminars-pi1-vacancies-0 .tx-seminars-pi1-square, .tx-seminars- pi1-cancelled .tx-seminars-pi1-square {

background-color: #c30000;

color: inherit;

}

Setting up the “multiple seats” feature 

In the default configuration, this extension allows each user to register only one seat per event. This can be changed if you need users to register more than one seat per registration (e.g., when you use this extension for a theater, or you would like companies to register all their attendees in one go).

Please note that this doesn't enable users to register multiple times—it just allows them to enter the number of seats for their registration.

This is what needs to be changed:

  1. For the back-end user group managing the registrations, enable the excludefield Attendances: number of seats . If you would like the attendee to also enter the names of the other attendees, please also add Names of the attendees.
  2. Enable the seats field for the notification email to the organizers by adding seats to plugin.tx\_seminars.showAttendanceFieldsInNotificationMail . If you would like the attendee to also enter the names of the other attendess, please also add attendees\_names .

If the field seats is not filled in (i.e., the registration is for 0 seats), the registration is counted as 1 seat.

Please note the the number of seats currently is not included in the automated email to the user. This will be implemented in a later version of this extension.

Setting up front-end editing 

Only do this if you really trust your users to only enter serious events and no fun or test records.

Setting up the front-end editing with the new plugin 

  1. If you have not done so already, create a front-end user group for your editors.
  2. If you have not done so already, create a folder for the front-end-created events. (You can also use the general events folder if you do not want to store the front-end-created events separately.)
  3. Create a front-end page and limit access to the front-end user group you created in step 1. This is very important.
  4. On the page you've just created, create a plugin and set its type to Front-end editor for events.
  5. In the plugin flexform, set the the folder for in which the front-end-created events should be stored.
  6. That's it - you're done!

Setting up the default managers feature 

You can assign managers (front-end users) to each single event. These editors are allowed to see all registrations for the events where he/she is manually added as an editor.

If you want to allow a group of editors to see the registrations of all events, you can add all those editors to a group. Just add the UID of that group to the TS configuration plugin.tx\_seminars\_pi1.defaultEventVipsFeGroupID .

After clearing the cache, all members of that group will see all events on their “my editor events” page, and will be able to see the registrations list of all those events.

You can also set the group's uid in the flexform configuration or the plugin. But you will need to set it for each plug-in(on every page). It's easier to set it via TypoScript setup on a global page.

Preselection in the list view URL 

If you are linking to the list view from other pages, you can preselect stuff in the URL (by using the variables from the list view filter form):

&tx_seminars_pi1[place][]=1
&tx_seminars_pi1[event_type][]=3
&tx_seminars_pi1[category]=1
&tx_seminars_pi1[country][]=DE etc. (the uppercase ISO 3166 alpha2 code)
&tx_seminars_pi1[city][]=Berlin
&tx_seminars_pi1[language][]=EN (the uppercase ISO 639 alpha2 code)
Copied!

This also works with combinations of these:

&tx_seminars_pi1[event_type][]=3&tx_seminars_pi1[place][]=3
&tx_seminars_pi1[place][]=1&tx_seminars_pi1[category]=1
Copied!

You can not only preselect categories, but also specify search phrases directly in the URL. To do so, just add this to the URL of the page that contains the seminars list view:

&tx_seminars_pi1[sword]=searchphrase
Copied!

If you want to use whitespaces make sure you replace them with %20, e.g.:

&tx_seminars_pi1[sword]=I%20am%20searching%20something
Copied!

It's not necessary to have a search field on the list view activated. So you can specify search phrases in the URL to filter your results without offering the opportunity to specify other search phrases.

If you want to specify search phrases for a page by default without specifying parameters in the URL, just enter this to your Typoscript Setup:

plugin.tx_seminars_pi1._DEFAULT_PI_VARS.sword = searchphrase
Copied!

If anyone opens this page, only trainings that match your search will be displayed.

SEO 

Routing configuration 

Nice URLs for the single view 

First run the upgrade wizards to generate the slugs for all event records. (You can change them later to suit your needs.)

Then add this to your site configuration file:

routeEnhancers:
  EventSingleView:
    type: Plugin
    limitToPages:
      - 17
    routePath: '/{slug}'
    namespace: 'tx_seminars_pi1'
    _arguments:
      slug: showUid
    requirements:
      slug: '[a-z0-9/\-]+'
    aspects:
      slug:
        type: PersistedAliasMapper
        tableName: 'tx_seminars_seminars'
        routeFieldName: 'slug'
Copied!

If you already have route enhancers configured, add the EventSingleView enhancer next to your other router enhancers.

The limitToPages setting is optional, but required for better performance. The given page UID(s) should be the page(s) on which the seminars single view content element is located.

Nice URLs for the registration form 

Add this to your site configuration file:

routeEnhancers:
  EventRegistration:
    type: Extbase
    limitToPages:
      - 18
    extension: Seminars
    plugin: EventRegistration
    defaultController: 'EventRegistration::checkPrerequisites'
    routes:
      - routePath: '/check/{event}'
        _controller: 'EventRegistration::checkPrerequisites'
        _arguments:
          event: event
      - routePath: '/new/{event}'
        _controller: 'EventRegistration::new'
        _arguments:
          event: event
    aspects:
      event:
        type: PersistedAliasMapper
        tableName: 'tx_seminars_seminars'
        routeFieldName: 'uid'
      registration:
        type: PersistedAliasMapper
        tableName: 'tx_seminars_attendances'
        routeFieldName: 'uid'
Copied!

If you already have route enhancers configured, add the EventRegistration enhancer next to your other router enhancers.

The limitToPages setting is optional, but required for better performance. The given page UID(s) should be the page(s) on which the registration form content element is located.

Automatic page titles for the single view 

Add this to your TypoScript setup:

config.pageTitleProviders {
  eventTitle {
    provider = OliverKlee\Seminars\Seo\SingleViewPageTitleProvider
    before = record
  }
}
Copied!

Exclude the single view page without an event URL from getting indexed 

  1. Edit the page properties of your single view page(s).
  2. Navigate to the "SEO" tab.
  3. Disable "Index this page".
  4. Then add this code to your TypoScript setup:
# Re-enable indexing for event single view pages, but not for the (empty)
# detail page without any event UID parameter
[traverse(request.getQueryParams(), 'tx_seminars_pi1/showUid') > 0]
  page.meta {
    robots = index,follow
    robots.replace = 1
  }
[global]
Copied!

PSR-14 event to change the generated slug for an event 

You can use the PSR-14 event \OliverKlee\Seminars\Seo\Event\AfterSlugGeneratedEvent to change the slug for an event before it gets written to the database.

List of available record types 

a
|img-13|
b
single event
c
This is the default event record type when you create an event record. You can change the record type to “topic” or “date.”
a
|img-14|
b
topic for multiple events
c
This event record type represents a topic for a series of events. It contains the basic data, for example the title and the description. After you have created a topic record, you can start entering date records for it.
a
|img-15|
b
date
c
This event record type represents a date for a series of events (a topic).
a
|img-16|
b
registration
c
These records get created when someone signs up for an event (or for the waiting list). Technically, they are the connection between an event and a person (represented by a front-end user).
a
|img-17|
b
organizer
c
These records contain the sender for the thank-you email sent to the attendees upon registration. In addition, registration notifications are sent to this email address.
a
|img-18|
b
payment method
c
Payment methods are available for selection in the event registration.
a
|img-19|
b
speaker
c
Speakers get listed in the list view and the single view, but they don’t receive any emails.
a
|img-20|
b
target group
c

Target groups of events are merely displayed, but don’t limit the registration in any way.

Examples: Adults, teenagers, single parents, sociologists.

a
|img-21|
b
time slow
c
Time slots are created within event records. They are used to represent a scenario like an event taking place on Friday from 14-18 o’clock and on Saturday from 10-14 o’clock.
a
|img-22|
b
place
c
Places (event sites) are displayed in the list view and the single view.
a
|img-23|
b
skill
c
These records are skills which can be associated with the speakers. Currently, the skills are not displayed in the front-end yet (missing feature).
a
|img-24|
b
lodging option
c
Lodging options are available for selection on the registration page.
a
|img-25|
b
food option
c
Food options are available for selection on the registration page.
a
|img-26|
b
event type
c
Each event can be associated with exactly one event type, for example workshop, evening class, talk or discussion group. The event type is displayed in the list view and the single view.
a
|img-27|
b
checkbox for the registration page
c
These are options available on the registration page.
a
|img-28|
b
category
c
Each event can be associated with several categories, for example theory seminars or examination preparation courses.

The back-end module “Events” 

This module provides easy-to-use access on event records, organizers, speakers and registrations.

Important: Only the records of the currently selected sysfolder get displayed. This means that you need to select different sysfolders if your records are located in several sysfolders (for examples you registrations might be places somewhere different than your event records).

Records that are created via this back-end module are saved in the currently selected sysfolder, too.

Tab: Events 

|img-29| Abbildung 13: Tab "Events" in the back-end module “Events”

Column/GUI element
Column/GUI element
Meaning
Meaning
Column/GUI element
|img-30| Create new record
Meaning
creates a new event record in the selected sysfolder
Column/GUI element
|img-31| download as CSV
Meaning
downloads all events as CSV file which can be opened e.g. in Excel
Column/GUI element
|img-13| |img-15| |img-14|
Meaning

Record type:

a
|img-13|
b
Single event
a
|img-14|
b
Topic for multiple events
a
|img-15|
b
Date (for a topic)
Column/GUI element
accreditation number
Meaning
manually assigned number for an event (can also be empty)
Column/GUI element
title
Meaning
the event’s title
Column/GUI element
date
Meaning
the event’s date
Column/GUI element
|img-32|
Meaning
edit an event
Column/GUI element
|img-33|
Meaning
delete an event
Column/GUI element
|img-34|
Meaning
temporarily hide an event
Column/GUI element
act.
Meaning
|img-35| the current number of registrations; the CSV button creates the registration as a CSV download which can be opened e.g. in Excel
Column/GUI element
queue
Meaning
the number of registrations on the waiting list (if the event has a waiting list)
Column/GUI element
min.
Meaning
how many registrations are needed for the event to take place
Column/GUI element
max.
Meaning
how many seats there are for this event in total
Column/GUI element
enough
Meaning
whether the event has enough registrations to take place
Column/GUI element
full
Meaning
whether the event is fully-booked
Column/GUI element
status
Meaning
canceled, confirmed or planned (neutral)
Column/GUI element
Button “cancel”
Meaning
cancels the event and send and email to all registered participants (using an email form)
Column/GUI element
Button “confirm”
Meaning
marks the event as confirmed and send and email to all registered participants (using an email form)

Canceling an event 

If an event needs to be canceled, you can cancel it by clicking on the “Cancel” button. This also sends an email to all registered participants:

|img-36| Abbildung 14: canceling an event

In the email form, there already is a default text which you can edit before sending the email. The placeholder %s will automatically be replaced with the participant’s name.

A canceled event still will be visible in front end, but is clearly recognizable as canceled (so that you don’t get tons of “Where can I find information about the event on the web site?” request after canceling it ;-) ). Registration for canceled events is not possible.

Marking an event as confirmed 

When you feel sure that an event is certain to take place (if enough participants have signed up and you’ve got the speakers’ okay), you can mark an event as confirmed by using the “Confirm” button. This also sends an email to the registered participants:

|img-37| Abbildung 15: marking an event as confirmed

Signing up for a confirmed event still is possible (as long as there are any vacancies); only the text in the confirmation email is a bit different.

Tab: Registrations 

|img-38| Abbildung 16: Tab "Registrations" in the back-end module “Events”

In this tab, all registration records of the currently selected sysfolder are displayed (i.e., of all events).

The first list Regular registrations contains those registrations that are not on the waiting list.

Tab: Speakers 

|img-39| Abbildung 17: Tab "Speakers" in the back-end module “Events”

In this tab, all speaker records of the currently selected sysfolder are displayed (i.e., of all events).

Tab: Organizers 

In this tab, all organizer records of the currently selected sysfolder are displayed (i.e., of all events).

Managing registrations 

Registration for an event is possible until the registration deadline. If the event has no such deadline, registration is possible until the start of the event.

When a logged-in front-end user registers for a seminar, the following happens:

  1. It is checked whether it still is possible to register for that seminar and the user still hasn't registered for that seminar yet. Note: If you need to allow the same front-end user to register for the same event multiple times, you can allow this in the event record.
  2. In addition, the user can select a price, food options and other options. The total price then is calculated from the selected price and the number of seats.
  3. An attendance record is entered into the database (into the page configured via plugin.tx\_seminars.attendancesPID or, if the first organizer for that event has a system folder for registrations configured, in that page), making the connection between this front- end user and the corresponding seminar. The statistics for that seminar are immediately updated in the back end and front end, preventing overbooked seminars.
  4. A thank-you email is sent to the front-end user using the first organizer of that seminar record as From: address and that organizer's email footer. The thank-you email also has a disclaimer if the event is planned and not confirmed yet. The disclaimer, says that the user will be informed if this event will be confirmed.
  5. A notification email is sent to that seminar's organizers (all of them, not just the first), using the attendee's email address as From: address.
  6. Additional notification emails are sent if the event reaches the minimum limit of registrations to be held, or if the event gets fully booked. These notifications go to all organizers of this event, the first organizer's email address is used as sender.These mails will only be sent, if they are activated in the TypoScript setup. By default, the mails will be sent.
  7. The user will be redirected to the thank-you page.
  8. The booked event will be visible on the “my events” page.

From the “my events” page the user has the possibility to unregister from an event. When a user unregisters the corresponding attendances record will be marked as hidden.

Displaying the seminar and registration statistics and details 

In the **back-end module “Events”, you can

  • list and edit events
  • export events as CSV
  • display the registrations for an event
  • export the registrations for an event as CSV
  • send an email to the attendees of an event

CSV export of events 

At the top in the event list in the back-end module Events , you’ll find a button labelled "Download as CSV file" that will save the data of all events on the current page as CSV.

CSV export of registrations 

At the top in the registration list for an event in the back-end module Events, you’ll find a button labelled "Download as CSV file" that will save the data of all registrations of the selected event as CSV, also including data from the registered FE user. Please note that the CSV file contains the columns for the data from the registration records first and then data from the corresponding FE user record.

The columns used for the export of registrations is determined by the two configuration variables fieldsFromFeUserForCsv and fieldsFromAttendanceForCsv. If you want to export the registrations on the waiting queue, you have to set showAttendancesOnRegistrationQueueInCSV to true.

The CSV export can be configured via TS Setup in plugin.tx_seminars for the page where the event records are located. Please see the reference for details.

CSV export of registrations is only available if:

  • the event has at least one registration, and
  • the logged-in BE user has read access to the events table and the registrations table, and
  • the logged-in BE user has read access to all pages where the registrations for that particular event are stored

Changing registrations 

You can edit registration records using Web > List as well as the back-end module Events.

Unregistering from an event 

Front-end users can unregister themselves from an event using the “my events” view if they are logged in and all of the following conditions are met:

  1. The event has an unregistration deadline set (or a global unregistration deadline has been set), and the deadline has not passed yet.
  2. There are registrations on the waiting list, or the extension is configured to allow unregistration even if the waiting list is empty.

Entering payments 

You can also use this extension to record payments from participants for their seminar. If you have received a payment (be in in cash, bank transfer, credit card or whatever), edit the corresponding registration record and fill in the following fields:

  • Has paid: Note that this field will go away soon. Instead, if someone has paid will be deducted by whether a payment date has been entered. So make sure to set a payment date for all attendances that have been paid.
  • Date of payment (if this field is set, an attendance is considered as paid, so always enter the date when you enter a payment)
  • Method of payment (optional, use it if you like to track this)

Tracking who has attended a seminar and who hasn't 

If you want to record who has attended a seminar and who hasn't (e.g., for certificates), you can edit the corresponding registration record and fill in this field:

  • Has attended

Linking to single seminar records 

If you would like to link to the detailed description for a seminar (from other seminar descriptions or from any other page), you can use this format:

<URL of seminar listing page>?tx_seminars_pi1[showUid]=<UID of the seminar>

For example, if the URL of the seminar listing page is http://www.casebo.de/casebo-workshops.html and you would like to the seminar with the UID 27, the complete URL to that seminar would be this:

http://www.casebo.de/casebo- workshops.html?tx_seminars_pi1[showUid]=27

(In the links from the list view, the URLs contain an addition ampersand after the question mark, but that can be ignored.)

Setup common for front-end plug-in and back-end module in plugin.tx_seminars 

You can configure the plug-in using your TS template setup in the form plugin.tx_seminars. property = value. The values in this table can only be configured using your TypoScript setup, but not via flexforms.

Property
Property:
Data type
Data type:
Description
Description:
Default
Default:
Property
enableRegistration
Data type
boolean
Description
Set this to 0 if you don't use the registration feature for this site and would like to disable the configuration check for this.
Default
1
Property
templateFile
Data type
string
Description
File name of the HTML template for email
Default
EXT:seminars/Resources/Private/Templates/Mail/e-mail.html
Property
salutation
Data type
string
Description
switch whether to use formal/informal language for some shared code (in emails, some labels and some error messages).Allowed values are:formal | informal
Default
formal
Property
hideFieldsInThankYouMail
Data type
string
Description

comma-separated list of section names that shouldn't be displayed in the thank-you email to the user

allowed values are in: hello, title, uid, ticket_id, price, seats, to tal_price,attendees_names,lodgings,accommodation,foods,food,checkbox es, kids, accreditation_number, credit_points, date, time, place, room,paymentmethod, billing_address,interests,url, footer,planned_disclaimer,unregistration_notice

Default
credit_points,billing_address,kids,planned_disclaimer
Property
cssFileForAttendeeMail
Copied!
Data type
string
Description
the CSS file for the HTML email to the attendees
Default
EXT:seminars/Resources/Private/CSS/thankYouMail.css
Property
generalPriceInMail
Data type
boolean
Description
whether to use the label “Price” for the standard price (instead of “standard price”) in email to the participant

Default

Property
hideFieldsInNotificationMail
Data type
string
Description

Comma-separated list of section names from the registration that shouldn't be displayed in the notification email to the organizers. These fields are the big blocks in that email, and some are further divided.

Allowed values are in:

  • summary: the attendee's name, the event title and the event date
  • seminardata: date from the seminar record, configurable via showSeminarFieldsInNotificationMail
  • feuserdata: data from the front-end user record, configurable via showFeUserFieldsInNotificationMail
  • attendancedata: data from the attendance record, configurable via showAttendanceFieldsInNotificationMail

Default

Property
showSeminarFieldsInNotificationMail
Data type
string
Description
comma-separated list of field names from seminars that should be mentioned in the notification email to the organizers (in the “seminardata” section)allowed values are in: uid, event_type, title, subtitle, titleanddate, date, time, accreditation_number, credit_points, room, place, speakers, price_regular, price_regular_early, price_special, price_special_early, attendees,allows_multiple_registrations,attendees_min, attendees_max, vacancies, enough_attendees, is_full, notes
Default
title,uid,event_type,date,place,price_regular,price_regular_early, price_special,price_special_early,attendees,vacancies,enough_atten dees,is_full
Property
showFeUserFieldsInNotificationMail
Data type
string
Description
comma-separated list of field names from fe_users that should be mentioned in the notification email to the organizers (in the “feuserdata” section)allowed values are all column names from fe_users.
Default
username,name,email,address,zip,city,telephone
Property
showAttendanceFieldsInNotificationMail
Data type
string
Description
comma-separated list of field names from attendances that should be mentioned in the notification email to the organizers (in the “attendancedata” section)allowed values are in: uid, interests, expectations, background_knowledge, lodgings, accommodation, foods, food, known_from, notes, checkboxes, price, seats, total_price, attendees_names, kids, method_of_payment, gender, name, address, zip, city, country, telephone, email
Default
uid,price,seats,total_price,method_of_payment,gender,name,address,z ip,city,country,telephone,email,interests,expectations,background_kno wledge,known_from,notes
Property
sendAdditionalNotificationEmails
Data type
boolean
Description
Whether to send the additional notification emails to the organizers or not. Additional notification mails are sent if for example an event gets full.
Default
1 (= active)
Property
sendNotification
Data type
boolean
Description
Whether to send a notification to the organizers if a user has registered.
Default
1 (= active)
Property
sendNotificationOnUnregistration
Data type
boolean
Description
Whether to send a notification to the organizers if a user has unregistered.
Default
1 (= active)
Property
sendNotificationOnRegistrationForQueue
Data type
boolean
Description
Whether to send a notification to the organizers if someone registered for the queue.
Default
1 (= active)
Property
sendNotificationOnQueueUpdate
Data type
boolean
Description
Whether to send a notification to the organizers if the queue has been updated.
Default
1 (= active)
Property
sendConfirmation
Data type
boolean
Description
Whether to send a confirmation to the user after the user has registered.
Default
1 (= active)
Property
sendConfirmationOnUnregistration
Data type
boolean
Description
Whether to send a confirmation to the user if the user has unregistered.
Default
1 (= active)
Property
sendConfirmationOnRegistrationForQueue
Data type
boolean
Description
Whether to send a confirmation to the user if the user has registered for the queue.
Default
1 (= active)
Property
sendConfirmationOnQueueUpdate
Data type
boolean
Description
Whether to send a confirmation to the user if the queue has been updated.
Default
1 (= active)
Property
addRegistrationCsvToOrganizerReminderMail
Data type
boolean
Description
Whether to add the CSV file of the registrations when sending the reminder email to the organizers.
Default
0 (=inactive)
Property
timeFormat
Data type
string
Description
the time format (in strftime format), @deprecated #2342 will be removed in seminars 6.0
Default
%H:%M
Property
dateFormatYMD
Data type
string
Description
the strftime format code for the full date (change this to your local date format), @deprecated #2342 will be removed in seminars 6.0
Default
%d.%m.%Y
Property
currency
Data type
string
Description
ISO 4217 alpha 3 code of the currency to be used, must be valid
Default
EUR
Property
unregistrationDeadlineDaysBeforeBeginDate
Data type
integer
Description
Number of days before the start of an event until unregistration is possible. (If you want to disable this feature just leave the value empty.)

Default

Property
allowRegistrationForStartedEvents
Data type
boolean
Description
whether registration should be possible even if an event has already started
Default
0
Property
allowRegistrationForEventsWithoutDate
Data type
Boolean
Description
Whether registration for events without a date is possible
Default
0
Property
allowUnregistrationWithEmptyWaitingList
Data type
Boolean
Description
Whether unregistration is possible even when there are no registrations on the waiting list yet.
Default
0
Property
showVacanciesThreshold
Data type
integer
Description

If there are at least this many vacancies, “enough” (localized) is displayed instead of the exact number.

Set this to a number higher than the highest number of vacancies if you want the exact number to be always displayed.

Default
10
Property
filenameForRegistrationsCsv
Data type
string
Description
the filename proposed for CSV export of registration lists
Default
registrations.csv
Property
fieldsFromEventsForCsv
Data type
string
Description
comma-separated list of field names from tx_seminars_seminars that will be used for CSV exportAllowed values are in:uid, tstamp, crdate, title, subtitle, teaser, description, event_type, accreditation_number, credit_points, date, time, deadline_registration, deadline_early_bird, place, room, lodgings, foods, speakers, partners, tutors, leaders, price_regular, price_regular_early, price_special, price_special_early, additional_information, payment_methods, organizers, attendees_min, attendees_max, attendees, vacancies, enough_attendees, is_full, cancelled
Default
uid,title,subtitle,description,event_type,date,time,place,room,speake rs,price_regular,attendees,attendees_max,vacancies,is_full
Property
fieldsFromFeUserForCsv
Data type
string
Description
comma-separated list of field names from fe_users that will be used for CSV export
Default
name,company,address,zip,city,country,telephone,email
Property
fieldsFromAttendanceForCsv
Data type
string
Description
comma-separated list of field names from tx_seminars_attendances that will be used for CSV export
Default
uid,price,total_price,method_of_payment,interests,expectations,back ground_knowledge,known_from,notes
Property
showAttendancesOnRegistrationQueueInCSV
Data type
boolean
Description
wether to show attendances on the registration queue in the CSV export or not
Default
0
Property
fieldsFromFeUserForEmailCsv
Data type
string
Description
comma-separated list of field names from fe_users that will be used for CLI CSV export
Default
name,company,address,zip,city,country,telephone,email
Property
fieldsFromAttendanceForEmailCsv
Data type
string
Description
comma-separated list of field names from tx_seminars_attendances that will be used for CLI CSV export
Default
uid,price,total_price,method_of_payment,interests,expectations,back ground_knowledge,known_from,notes
Property
showAttendancesOnRegistrationQueueInEmailCsv
Data type
boolean
Description
whether to show attendances on the registration queue in the CLI CSV export or not
Default
0
Eigenschaft
addExcelSpecificSeparatorLineToCsv
Datentyp
boolean
Beschreibung
whether to add the Excel-specific "sep=;" line to the CSV
Standardwert
0
Property
sendCancelationDeadlineReminder
Data type
boolean
Description
whether to send a cancellation deadline reminder to the organizers
Default
0
Property
sendEventTakesPlaceReminderDaysBeforeBeginDate
Data type
integer
Description
how many days before an events' begin date the organizers should be reminded about this event via email, zero disables the reminder
Default
0
Property
attendancesPID
Data type
page_id
Description
PID of the sysfolder where event registrations (attendances) will be stored
Default
None

[tsref:plugin.tx_seminars]

Setup for the Seminar Manager front-end plug-in in plugin.tx_seminars_pi1 

You can configure the plug-in using flexforms of the front-end plug-in (for most values) or your TS template setup in the form plugin.tx_seminars_pi1. property = value.

If your want to set a value for all instances of the plug-in in one place, use the TS template setup. If you use flexforms, make sure to set the values at all relevant instances of the plug-in: It doesn't do to specify the fields for the online registration in the seminar list front-end plug-in—you need to set these fields in the online registration front-end plug-in.

Note: If you set any non-empty value in the flexforms, this will override the corresponding value from TS Setup.

Property
Property:
Data type
Data type:
Description
Description:
Default
Default:
Property
enableRegistration
Data type
boolean
Description
Set this to 0 if you don't use the registration feature for this site and would like to disable the configuration check for this.
Default
1
Property
what_to_display
Data type
string
Description
The kind of front-end plug-in to display. Allowed values are in: seminar\_list, single\_view, topic\_list, my\_events, my\_vip\_events, seminar\_registration, list\_registrations, list\_vip\_registrations, edit\_event, my\_entered\_events, category\_list, event\_headline This must be set using flexforms.
Default
seminar_list
Property
templateFile
Data type
string
Description
location of the HTML template for the FE plugin
Default
EXT:seminars/pi1/seminars_pi1.tmpl
Property
salutation
Data type
string
Description
Switch whether to use formal/informal language on the front end.Allowed values are:formal | informal
Default
formal
Property
showSingleEvent
Data type
integer
Description

The UID of an event record. If an event is selected, the plug-inalways shows the single view of this event and not the list.

This must be set using flexforms.

Default

Property
timeframeInList
Data type
string
Description
the time-frame from which events should be displayed in the list view. Select one of these keywords:all, past, pastAndCurrent, current, currentAndUpcoming, upcoming, deadlineNotOver, today
Default
currentAndUpcoming
Property
hideColumns
Data type
string
Description

comma-separated list of column names that shouldn't be displayed in the list view, e.g. organizers,price\_special

The order of the elements in this list has no influence on the output.Allowed values are in: category, title,subtitle,uid, event_type, language, accreditation_number, credit_points, teaser, speakers, date, time, expiry, place, city, country, seats, price_regular, price_special, total_price, organizers, target_groups, attached_files, vacancies, status_registration, registration, list_registrations, status, edit, imagePlease note that some columns will only be shown if a front-end user currently is logged in.

Default
Image,category,subtitle,event_type,language,accreditation_number,cre dit_points,teaser,time,expiry,place,country,price_special,speakers,t arget_groups,attached_files
Property
hideFields
Data type
string
Description

comma-separated list of field names that shouldn't be displayed in the detail view, e.g. organizers,price\_special

The order of the elements in this list has no influence on the output.Allowed values are in: event_type, title, subtitle, language, description, accreditation_number, credit_points, category, date, uid, time, place, room, expiry, speakers, partners, tutors, leaders, p rice_regular,price_special,additional_information, target_groups, attached_files, paymentmethods, target_groups, organizers, vacancies, deadline_registration, otherdates, eventsnextday, registration, back, image, requirements, dependencies

Default
credit_points,eventsnextday
Property
hideSearchForm
Data type
boolean
Description
whether to show the search form in the list view
Default
0
Property
displaySearchFormFields
Data type
string
Description
comma-separated list of search options which should be shown in the search widget. If no field is displayed the search widget will be hidden. Allowed values are in: event_type, language, country, city, place, full_text_search, date, age, organizer, price, categories

Default

Property
limitListViewToCategories
Data type
string
Description
comma-separated list of category UIDs to filter the list view for, leave empty to have no such filter

Default

Property
limitListViewToPlaces
Data type
string
Description
comma-separated list of place UIDs to filter the list view for, leave empty to have no such filter

Default

Property
limitListViewToOrganizers
Data type
string
Description
comma-separated list of organizer UIDs to filter the list view for, leave empty to have no such filter

Default

Property
showOnlyEventsWithVacancies
Data type
boolean
Description
whether to show only events with vacancies on in the list view
Default
0
Property
seminarImageListViewHeight
Data type
integer
Description
the maximum height of the image of a seminar in the list view
Default
43
Property
seminarImageListViewWidth
Data type
integer
Description
the maximum width of the image of a seminar in the list view
Default
70
Property
hidePageBrowser
Data type
boolean
Description
whether to show the page browser in the list view
Default
0
Property
hideCanceledEvents
Data type
boolean
Description
whether to show canceled events in the list view
Default
0
Property
sortListViewByCategory
Data type
boolean
Description
whether the list view should always be sorted by category (before applying the normal sorting)
Default
0
Property
categoriesInListView
Data type
string
Description
whether to show only the category title, only the category icon or both. Allowed values are: icon, text, both
Default
both
Property
generalPriceInList
Data type
boolean
Description
whether to use the label “Price” as column header for the standard price (instead of “Standard price”)
Default
0
Property
generalPriceInSingle
Data type
boolean
Description
whether to use the label “Price” as heading for the standard price (instead of “Standard price”) in the detailed view and on the registration page
Default
0
Property
omitDateIfSameAsPrevious
Data type
boolean
Description
whether to omit the date in the list view if it is the same as the previous item's (useful if you often have several events at the same date), @deprecated #1788 will be removed in seminars 5.0
Default
0
Property
accessToFrontEndRegistrationLists
Data type
string
Description
who is allowed to view the list of registrations on the front end; allowed values are: attendees_and_managers, login, world
Default
attendees_and_managers
Property
showSpeakerDetails
Data type
boolean
Description
whether to show detailed information of the speakers in the single view; if disabled, only the names will be shown
Default
1
Property
showSiteDetails
Data type
boolean
Description
whether to show detailed information of the locations in the single viewif disabled, only the name of the locations will be shown
Default
1
Property
limitFileDownloadToAttendees
Data type
boolean
Description
whether file downloads are limited to attendees only
Default
1
Property
showFeUserFieldsInRegistrationsList
Data type
string
Description
comma-separated list of FEuser fields to show in the list of registrations for an event
Default
name
Property
showRegistrationFieldsInRegistrationList
Data type
string
Description
comma-separated list of registration fields to show in the list of registrations for an event
Default
None
Property
enableSortingLinksInListView
Data type
boolean
Description
whether to add sorting links to the headers in the list view
Default
1
Property
linkToSingleView
Data type
string
Description
when to link to the single view: always, never, onlyForNonEmptyDescription
Default
always
Property
speakerImageWidth
Data type
integer
Description
width of the speaker image in the event single view
Default
150
Property
speakerImageHeight
Data type
integer
Description
height of the speaker image in the event single view
Default
150
Property
pages
Data type
integer
Description
PID of the sysfolder that contains all the event records (e.g. the starting point)
Default
None
Property
recursive
Data type
integer
Description
level of recursion that should be used when accessing the startingpoint
Default
None
Property
listPID
Data type
page_id
Description
PID of the FE page that contains the event list
Default
None
Property
detailPID
Data type
page_id
Description
PID of the FE page that contains the single view
Default
None
Property
myEventsPID
Data type
page_id
Description
PID of the FE page that contains the "my events" list
Default
None
Property
registerPID
Data type
page_id
Description
PID of the FE page that contains the seminar registration plug-in
Default
None
Property
loginPID
Data type
page_id
Description
PID of the FE page that contains the login form or onetimeaccount
Default
None
Property
registrationsListPID
Data type
page_id
Description
PID of the page that contains the registrations list for participants
Default
None
Property
registrationsVipListPID
Data type
page_id
Description
PID of the page that contains the registrations list for editors
Default
None
Property
defaultEventVipsFeGroupID
Data type
integer
Description
UID of the FE user group that is allowed to see the registrations of all events
Default
None
Property
seminarImageSingleViewWidth
Data type
integer
Description
the maximum width of the image of a seminar in the single view
Default
260
Property
seminarImageSingleViewHeight
Data type
integer
Description
the maximum height of the image of a seminar in the single view
Default
160

[tsref:plugin.tx_seminars_pi1]

Setup for the list view 

For the list view, there are some additional configuration option that can only be set using the TS setup in the form plugin.tx_seminars_pi1.listView. property = value. Those values can not be set via Flexforms.

Property
Property:
Data type
Data type:
Description
Description:
Default
Default:
Property
orderBy
Data type
string
Description
The default sort order in list view. Allowed values are:category, title, uid, event_type, accreditation_number, credit_points, speakers, date, time, place, price_regular, price_special, organizers, vacancies
Default
date
Property
descFlag
Data type
boolean
Description
whether to show the list view ordered in ascending (=0) or descending order (=1)
Default
0
Property
results_at_a_time
Data type
integer
Description
The number of events that shall be displayed per page
Default
20
Property
maxPages
Data type
integer
Description
the number of neighboring pages to list in the page browser
Default
5

[tsref:plugin.tx_seminars_pi1.listView]

Setup for the registration digest email 

These configuration options can only be set via TypoScript setup within the plugin.tx_seminars.registrationDigestEmail namespace, not via flexforms.

These settings only affect the seminars Scheduler task.

Property
Property:
Data type
Data type:
Description
Description:
Default
Default:
Property
enable
Data type
boolean
Description
whether to send out the emails when the seminars Scheduler task is executed
Default
0
Property
fromEmail
Data type
string
Description
email address of the sender

Default

Property
fromName
Data type
string
Description
name of the sender (optional)

Default

Property
toEmail
Data type
string
Description
email address of the recipient

Default

Property
toName
Data type
string
Description
name of the recipient (optional)

Default

Property
htmlTemplate
Data type
string
Description
path to the fluid template for the HTML email
Default
EXT:seminars/Resources/Private/Templates/Mail/RegistrationDigest.html
Property
plaintextTemplate
Data type
string
Description
path to the fluid template for the plaintext email
Default
EXT:seminars/Resources/Private/Templates/Mail/RegistrationDigest.txt

[tsref:plugin.tx_seminars.registrationDigestEmail]

Constants for the Seminar-Manager front-end plug-in in plugin.tx_seminars_pi1 

You can configure the plug-in using your TS template constant in the form plugin.tx_seminars_pi1. property = value.

Property
Property:
Data type
Data type:
Description
Description:
Default
Default:
Property
cssFile
Data type
string
Description
location of the CSS file (set as empty to not include the file)
Default
EXT:seminars/pi1/seminars_pi1.css

[tsref:plugin.tx_seminars_pi1]

Events and hooks 

Events and hooks provide an easy way to extend the functionality of the this extension without blocking others to do the same.

Contents:

AfterSlugGeneratedEvent 

The PSR-14 event \OliverKlee\Seminars\Seo\Event\AfterSlugGeneratedEvent gets triggered after a slug has been generated or updated for an event record, and before the slug gets written to the database. Listeners may overwrite the slug if desired.

Example 

Registration of the event listener in the extension's Services.yaml:

EXT:my_extension/Configuration/Services.yaml
services:
  # Place here the default dependency injection configuration

  MyVendor\MyExtension\EventListener\Seo\SlugGeneratorEventListener:
    tags:
      - name: event.listener
        identifier: 'generateEventSlugsWithUid'
Copied!

The corresponding event listener class:

EXT:my_extension/Classes/EventListener/Seo/SlugGeneratorEventListener.php
<?php

declare(strict_types=1);

namespace MyVendor\MyExtension\EventListener\Seo;

use OliverKlee\Seminars\Seo\Event\AfterSlugGeneratedEvent;

/**
 * Generates event slugs in the format "slugified-title_uid".
 */
final class SlugGeneratorEventListener
{
    public function __invoke(AfterSlugGeneratedEvent $event): void
    {
        $slugContext = $event->getSlugContext();
        if ($slugContext->getEventUid() > 0) {
            $event->setSlug($slugContext->getSlugifiedTitle() . '_' . $slugContext->getEventUid());
        }
    }
}
Copied!

Hooks 

Hooks allow extending the functionality of seminars without using XCLASSes. There are hooks for these parts of seminars:

Please contact us if you need additional hooks.

Hooks for the single view 

There is a hook into the single view. It is executed just before the template gets rendered to HTML. You may set custom markers or change existing values for markers. See also Classes/Frontend/DefaultController.php for available properties and methods.

Register your class that implements \OliverKlee\Seminars\Hooks\Interfaces\SeminarSingleView like this in ext_localconf.php of your extension:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['seminars'][\OliverKlee\Seminars\Hooks\Interfaces\SeminarSingleView::class][]
    = \Tx_Seminarspaypal_Hooks_EventSingleView::class;
Copied!

Implement the methods required by the interface:

use OliverKlee\Seminars\Hooks\Interfaces\SeminarSingleView;

class Tx_Seminarspaypal_Hooks_SingleView implements SeminarSingleView
{
    /**
     * Modifies the seminar details view.
     *
     * This function will be called for all types of seminars (single events, topics, and dates).
     *
     * @param DefaultController $controller the calling controller
     */
    public function modifySingleView(DefaultController $controller): void
    {
        // Your code here
    }
}
Copied!

Hooks for the list view 

There are 4 hooks into the list view(s). First hook is called just before the seminar bag (the seminars to show in the list) or the registration bag (the seminars a user is registered for) is build. It is always called, even when there will be an empty list.

The other hooks are called during seminar list table creation:

  • just before the table header is rendered to HTML
  • just before a table row for a certain seminar or registration is rendered to HTML
  • in case of a my_event list: right after the row hook mentioned above
  • just before the table footer is rendered to HTML

In these hooks you may set custom markers or change existing values for markers. See also Classes/Frontend/DefaultController.php for available properties and methods.

The hook to the seminar or registration bag building process allows for changing the seminars/registrations shown in the list. You may add more filters or remove existing ones. See also Classes/BagBuilder/AbstractBagBuilder.php, Classes/BagBuilder/EventBagBuilder.php and Classes/BagBuilder/Registration.php for available properties and methods.

There are 7 types of lists your implementation must handle:

  • topic list (topic_list)
  • seminar list (seminar_list)
  • my seminars (my_events)
  • my VIP seminars (my_vip_events)
  • events next day (events_next_day)
  • other dates (other_dates)

The last two list types (events next day and other dates) are part of the single view, but handled as fully rendered seminar lists (including bag building).

Register your class that implements \OliverKlee\Seminars\Hooks\Interfaces\SeminarListView like this in ext_localconf.php of your extension:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['seminars'][\OliverKlee\Seminars\Hooks\Interfaces\SeminarListView::class][]
    = \Tx_Seminarspaypal_Hooks_ListView::class;
Copied!

Implement the methods required by the interface:

use OliverKlee\Seminars\Hooks\Interfaces\SeminarListView;

class Tx_Seminarspaypal_Hooks_ListView implements SeminarListView
{
    /**
     * Modifies the list view seminar bag builder (the item collection for a seminar list).
     *
     * Add or alter limitations for the selection of seminars to be shown in the
     * list.
     *
     * @see AbstractBagBuilder::getWhereClausePart()
     * @see AbstractBagBuilder::setWhereClausePart()
     *
     * This function will be called for these types of seminar lists: "topics", "seminars",
     * "my vip seminars", "my entered events", "events next day", "other dates".
     *
     * @param DefaultController $controller the calling controller
     * @param EventBagBuilder $builder the bag builder
     * @param string $whatToDisplay the flavor of list view: 'seminar_list', 'topic_list',
     *        'my_vip_events', 'events_next_day' or 'other_dates'
     */
    public function modifyEventBagBuilder(
        DefaultController $controller,
        EventBagBuilder $builder,
        string $whatToDisplay
    ): void {
        // Your code here
    }

    /**
     * Modifies the list view registration bag builder (the item collection for a "my events" list).
     *
     * Add or alter limitations for the selection of seminars to be shown in the
     * list.
     *
     * @see AbstractBagBuilder::getWhereClausePart()
     * @see AbstractBagBuilder::setWhereClausePart()
     *
     * This function will be called for "my events" lists only.
     *
     * @param DefaultController $controller the calling controller
     * @param RegistrationBagBuilder $builder the bag builder
     * @param string $whatToDisplay the flavor of list view ('my_events' only?)
     */
    public function modifyRegistrationBagBuilder(
        DefaultController $controller,
        RegistrationBagBuilder $builder,
        string $whatToDisplay
    ): void {
        // Your code here
    }

    /**
     * Modifies the list view header row in a seminar list.
     *
     * This function will be called for all types of seminar lists ("topics",
     * "seminars", "my seminars", "my vip seminars", "my entered events",
     * "events next day", "other dates").
     *
     * @param DefaultController $controller the calling controller
     */
    public function modifyListHeader(DefaultController $controller): void
    {
        // Your code here
    }

    /**
     * Modifies a list row in a seminar list.
     *
     * This function will be called for all types of seminar lists ("topics",
     * "seminars", "my seminars", "my vip seminars", "my entered events",
     * "events next day", "other dates").
     *
     * @param DefaultController $controller the calling controller
     */
    public function modifyListRow(DefaultController $controller): void
    {
        // Your code here
    }

    /**
     * Modifies a list view row in a "my seminars" list.
     *
     * This function will be called for "my seminars" , "my vip seminars",
     * "my entered events" lists only.
     *
     * @param DefaultController $controller the calling controller
     */
    public function modifyMyEventsListRow(DefaultController $controller): void
    {
        // Your code here
    }

    /**
     * Modifies the list view footer in a seminars list.
     *
     * This function will be called for all types of seminar lists ("topics",
     * "seminars", "my seminars", "my vip seminars", "my entered events",
     * "events next day", "other dates").
     *
     * @param DefaultController $controller the calling controller
     */
    public function modifyListFooter(DefaultController $controller): void
    {
        // Your code here
    }
}
Copied!

Hooks for the selector widget 

There is a hook into the selector widget of the list view. If the selector widget is activated, the hook is executed just before the template gets rendered to HTML. You may set custom markers or change existing values for markers. See also Classes/Frontend/SelectorWidget.php for available properties and methods.

Register your class that implements \OliverKlee\Seminars\Hooks\Interfaces\SeminarSelectorWidget like this in ext_localconf.php of your extension:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['seminars'][\OliverKlee\Seminars\Hooks\Interfaces\SeminarSelectorWidget::class][]
    = \Tx_Seminarspaypal_Hooks_EventSelectorWidget::class;
Copied!

Implement the methods required by the interface:

use OliverKlee\Seminars\Hooks\Interfaces\SeminarSelectorWidget;

class Tx_Seminarspaypal_Hooks_EventSelectorWidget implements SeminarSelectorWidget
{
    /**
     * Modifies the seminar widget, just before the subpart is fetched.
     *
     * This function will be called for all types of seminar lists, if `displaySearchFormFields` is configured for it.
     *
     * @param SelectorWidget $selectorWidget
     * @param EventBag $seminarBag the seminars used to create the selector widget
     */
    public function modifySelectorWidget(
        SelectorWidget $selectorWidget,
        EventBag $seminarBag
    ): void {
        // Your code here
    }
}
Copied!

Hooks for the registration notification emails 

There are the following hooks into the registration notification emails:

  • just before the attendee notification template is rendered to plain text
  • just before the attendee notification template is rendered to HTML
  • just before the attendee notification is sent
  • just before the organizer notification is sent
  • just before the additional organizer notifications are sent

You may set custom markers or change existing values for markers in the template hooks. See also Classes/Model/Registration.php for available properties and methods. The plain text hook is always called, because a HTML email always contains a plain text version, too. The HTML hook is called only if emails are sent as HTML.

With the other hooks you may modify the complete MailMessage object (e.g. sender or receiver addresses, subject line or the complete body). See also sysext/core/Classes/Mail/MailMessage.php for available properties and methods.

Register your class that implements \OliverKlee\Seminars\Hooks\Interfaces\RegistrationEmail like this in ext_localconf.php of your extension:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['seminars'][\OliverKlee\Seminars\Hooks\Interfaces\RegistrationEmail::class][]
    = \Tx_Seminarspaypal_Hooks_RegistrationEmail::class;
Copied!

Implement the methods required by the interface:

use OliverKlee\Seminars\Hooks\Interfaces\RegistrationEmail;

class Tx_Seminarspaypal_Hooks_RegistrationEmail implements RegistrationEmail
{
    /**
     * Modifies the attendee "Thank you" email just before it is sent.
     *
     * You may modify the recipient or the sender as well as the subject and the body of the email.
     *
     * @param string $emailReason Possible values:
     *          - confirmation
     *          - confirmationOnUnregistration
     *          - confirmationOnRegistrationForQueue
     *          - confirmationOnQueueUpdate
     */
    public function modifyAttendeeEmail(
        MailMessage $email,
        Registration $registration,
        string $emailReason
    ): void {
        // Your code here
    }

    /**
     * Modifies the attendee "Thank you" email body just before the subpart is rendered to plain text.
     *
     * This method is called for every confirmation email, even if HTML emails are configured.
     * The body of a HTML email always contains a plain text version, too.
     *
     * You may modify or set marker values in the template.
     *
     * @param Registration $registration
     * @param string $emailReason Possible values:
     *          - confirmation
     *          - confirmationOnUnregistration
     *          - confirmationOnRegistrationForQueue
     *          - confirmationOnQueueUpdate
     */
    public function modifyAttendeeEmailBodyPlainText(
        Template $emailTemplate,
        Registration $registration,
        string $emailReason
    ): void {
        // Your code here
    }

    /**
     * Modifies the attendee "Thank you" email body just before the subpart is rendered to HTML.
     *
     * This method is called only, if HTML emails are configured for confirmation emails.
     *
     * You may modify or set marker values in the template.
     *
     * @param Registration $registration
     * @param string $emailReason Possible values:
     *          - confirmation
     *          - confirmationOnUnregistration
     *          - confirmationOnRegistrationForQueue
     *          - confirmationOnQueueUpdate
     */
    public function modifyAttendeeEmailBodyHtml(
        Template $emailTemplate,
        Registration $registration,
        string $emailReason
    ): void {
        // Your code here
    }

    /**
     * Modifies the organizer notification email just before it is sent.
     *
     * You may modify the recipient or the sender as well as the subject and the body of the email.
     *
     * @param string $emailReason Possible values:
     *        - notification
     *        - notificationOnUnregistration
     *        - notificationOnRegistrationForQueue
     *        - notificationOnQueueUpdate
     */
    public function modifyOrganizerEmail(
        MailMessage $email,
        Registration $registration,
        string $emailReason
    ): void {
        // Your code here
    }

    /**
     * Modifies the organizer additional notification email just before it is sent.
     *
     * You may modify the recipient or the sender as well as the subject and the body of the email.
     *
     * @param string $emailReason Possible values:
     *          - 'EnoughRegistrations' if the event has enough attendances
     *          - 'IsFull' if the event is fully booked
     *          see RegistrationManager::getReasonForNotification()
     */
    public function modifyAdditionalEmail(
        MailMessage $email,
        Registration $registration,
        string $emailReason
    ): void {
        // Your code here
    }
}
Copied!

Hooks for the salutation in all emails to the attendees 

It is also possible to extend the salutation used in the emails with the following hook:

  • modifySalutation for tx_seminars_EmailSaluation which is called just before the salutation is returned by getSalutation

To use this hook, you need to create a class with a method named modifySalutation. The method in your class should expect two parameters. The first one is a reference to an array with the following structure:

array('dear' => String, 'title' => String, 'name' => String)

The second parameter is an user object FrontEndUser.

Your class then needs to be included and registered like in this example:

// register my hook objects
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['seminars']['modifyEmailSalutation'][] = \MyVendor\MyExt\Hooks\ModifySalutationHook::class;
Copied!

Hooks for the date and time span creation 

There are hooks into the date and time span creation of the seminars. If at any place a date or time span is required, these hooks are called to allow modification of the date or time span assembling. See also Classes/OldModel/AbstractTimeSpan.php for details about the default methods.

Register your class that implements \OliverKlee\Seminars\Hooks\Interfaces\DateTimeSpan like this in ext_localconf.php of your extension:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['seminars'][\OliverKlee\Seminars\Hooks\Interfaces\DateTimeSpan::class][]
    = \Tx_Seminarspaypal_Hooks_DateTimeSpan::class;
Copied!

Implement the methods required by the interface:

use OliverKlee\Seminars\Hooks\Interfaces\DateTimeSpan;

class Tx_Seminarspaypal_Hooks_DateTimeSpan implements DateTimeSpan
{
    /**
     * Modifies the date span string.
     *
     * This allows modifying the assembly of start and end date to the date span.
     * E.g., for Hungarian: '01.-03.01.2019' -> '2019.01.01.-03.'.
     *
     * The date format for the date parts are configured in TypoScript (`dateFormatYMD` etc.).
     * Get them from `$dateTimeSpan->getConfValueString('dateFormatYMD')` etc. The event
     * dates are also retrievable:
     * `$beginDateTime = $dateTimeSpan->getBeginDateAsTimestamp();`
     * `$endDateTime = $dateTimeSpan->getEndDateAsTimestamp();`
     *
     * @param string $dateSpan the date span produced by `AbstractTimeSpan::getDate()`
     * @param AbstractTimeSpan $dateTimeSpan the date provider
     * @param string $dash the glue used by `AbstractTimeSpan::getDate()` (may be HTML encoded)
     *
     * @return string the modified date span to use
     */
    public function modifyDateSpan(
        string $dateSpan,
        AbstractTimeSpan $dateTimeSpan,
        string $dash
    ): string
    {
        // Your code here
    }

    /**
     * Modifies the time span string.
     *
     * This allows modifying the assembly of start and end time to the time span.
     * E.g., for Hungarian: '9:00-10:30' -> '9:00tol 10:30ban'.
     *
     * The time format for the time parts is configured in TypoScript (`timeFormat`).
     * Get it from `$dateTimeSpan->getConfValueString('timeFormat')`. The event
     * times are also retrievable:
     * `$beginDateTime = $dateTimeSpan->getBeginDateAsTimestamp();`
     * `$endDateTime = $dateTimeSpan->getEndDateAsTimestamp();`
     *
     * @param string $timeSpan the time span produced by `AbstractTimeSpan::getTime()`
     * @param AbstractTimeSpan $dateTimeSpan the date provider
     * @param string $dash the glue used by `AbstractTimeSpan::getTime()` (may be HTML encoded)
     *
     * @return string the modified time span to use
     */
    public function modifyTimeSpan(
        string $timeSpan,
        AbstractTimeSpan $dateTimeSpan,
        string $dash
    ): string
    {
        // Your code here
    }
}
Copied!

Hooks for the emails sent from the back-end module 

The hook classes need to be registered and written like this:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['seminars']['backEndModule'][]
    = \tx_seminarspaypal_Hooks_BackEndModule::class;
Copied!

It's used like this:

class BackEndModuleHook implements BackEndModule {
    /**
     * Modifies the general email sent via the back-end module.
     *
     * Note: This hook does not get called yet. It is just here so the interface
     * is finalized.
     *
     * @param Registration $registration
     *        the registration to which the email refers
     */
     public function modifyGeneralEmail(Registration $registration, MailMessage $email): void {…}
Copied!

Hooks for the CSV generation of registration lists 

There is a hook into the CSV generation of registration lists to modify the generated CSV text.

Register your class that implements \OliverKlee\Seminars\Hooks\Interfaces\RegistrationListCsv like this in ext_localconf.php of your extension:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['seminars'][\OliverKlee\Seminars\Hooks\Interfaces\RegistrationListCsv::class][]
    = \Tx_Seminarspaypal_Hooks_RegistrationListCsv::class;
Copied!

Implement the methods required by the interface:

use OliverKlee\Seminars\Hooks\Interfaces\RegistrationListCsv;

class Tx_Seminarspaypal_Hooks_RegistrationListCsv implements RegistrationListCsv
{
    /**
     * Modifies the rendered CSV string.
     *
     * This allows modifying the complete CSV text right before it is delivered.
     *
     * @param string $csv the CSV text produced by `AbstractRegistrationListView::render()`
     * @param AbstractRegistrationListView $registrationList the CSV data provider
     *
     * @return string the modified CSV text to use
     */
    public function modifyCsv(string $csv, AbstractRegistrationListView $registrationList): string
    {
        // Your code here
    }
}
Copied!

Hooks for the data sanitization on TCE validation 

There is a hook into the data handler to additionaly manipulate seminars FlexForm data during TCE validation (just before storing the data). You may apply additional constraints and dynamically adjust values (e.g. registration deadline = begin date - 14 days).

TCE validation is a TYPO3-defined process. seminars gets the form values from the content element's FlexForm and stores required changes of the values into the database.

Register your class that implements \OliverKlee\Seminars\Hooks\Interfaces\DataSanitization like this in ext_localconf.php of your extension:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['seminars'][\OliverKlee\Seminars\Hooks\Interfaces\DataSanitization::class][]
    = \Tx_Seminarspaypal_Hooks_DataSanitization::class;
Copied!

Implement the methods required by the interface:

use OliverKlee\Seminars\Hooks\Interfaces\DataSanitization;

class Tx_Seminarspaypal_Hooks_DataSanitization implements DataSanitization
{
    /**
     * Sanitizes event data values.
     *
     * The TCE form event values need to be sanitized when storing them into the
     * database. Check the values with additional constraints and provide the modified
     * values to use back in a returned array.
     *
     * @param int $uid
     * @param mixed[] $data the events data as stored in database
     *
     * @return mixed[] the data to change, [] for no changes
     */
    public function sanitizeEventData(int $uid, array $data): array
    {
        // Your code here
    }
}
Copied!

Known problems 

  • The seminar hours are displayed without a unit, e.g. “17:00” instead of “17:00 h”.
  • All registrations (paid and unpaid) are counted for the seminar statistics.
  • In some cases, the list view in the front-end plug-in may be empty. Do this:

    • Check that all seminars lie within the configured time window for the list view (the default is current and upcoming events). Events without a begin date/time always appear as an upcoming event.
  • All non-empty changes at the flexforms of the plug-in overwrite the settings of the corresponding TS setup. Empty data in the flexforms don't overwrite non-empty data from the TS setup.
  • The search in the list view covers pretty most of what is visible in the single view except for the payment methods (this is intended).
  • The inlining of CSS in HTML emails is available in Composer-mode only as this feature makes use of a third-party library.
  • The CSV export currently will be empty if the b13/bolt package is installed.
  • The scheduler tasks currently cannot read their configuration if the b13/bolt package is installed.