TYPO3 extension seminars 

Extension key

seminars

Package name

oliverklee/seminars

Version

main

Language

en

Author

Oliver Klee

License

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

Rendered

Fri, 21 Nov 2025 16:59:40 +0000

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

Table of Contents:

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 registrations” 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 events and registrations
  • publishing workflow for events entered in the front end
  • files can be attached to each event
  • CSV export of registrations of an event
  • the front-end output is valid XHTML
  • visual design is done using only CSS
  • mostly accessible front-end output
  • 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

Screenshots 

This is a front-end list a seminars. Note the color-coded number of vacancies in the last column.

This is the top of a front-end detailed view for a seminar.

This is the “my registrations” list for a logged-in front-end user.

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 5.x to 6.x 

The following steps are necessary to upgrade from seminars 5.x to 6.x:

  1. Upgrade to the latest version of seminars 5.x.
  2. Upgrade to the latest versions of feuserextrafields and oelib.
  3. Update the database schema and run all upgrade wizards.
  4. If you are using onetimaccount, switch the plugin to "One-time FE account creator without autologin".
  5. Upgrade to the latest version of onetimeaccount.
  6. If you are using the allowRegistrationForStartedEvents option, set a corresponding registration deadline for all future events for which you want to allow registration after the event has started. (This option has been removed in seminars 6.0.)
  7. Go through the venue records and make sure that the address field contains the full address (including ZIP code, city and country (if relevant)).
  8. If you have any events for which no registration should not be possible and which have no date yet, make sure that these events have the "needs registration" checkbox set to "no". (seminars 6.0 by default allows registration for all events that have no date yet as well.)
  9. If you have been using the unregistrationDeadlineDaysBeforeBeginDate configuration option, set a corresponding unregistration deadline for all future events. (This option has been removed in seminars 6.0.)
  10. If you do not want attendees to be able to cancel their registration themselves, set the unregistration deadline to a date in the past for all future events. (By default, attendees will be able to cancel their registration themselves until the event starts.)
  11. If you are using custom Fluid templates for the registration form, remove the separateBillingAddress field from all registration form templates.
  12. Upgrade to seminars 6.x.
  13. Update the database schema and run all upgrade wizards.
  14. If you are using the selector widget (the search form) in the frontend, open the corresponding content element in the backend and save it again.
  15. Enable the automatic configuration check for the seminars extension in the extension manager.
  16. Open all seminars content elements in the frontend, check for configuration check warnings and fix them.
  17. Disable the automatic configuration check for the seminars extension in the extension manager again.

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.)

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 {
}

# 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:

folder 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:

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:

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:

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:

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:

Page structure for a minimal setup with online registration

For a full-blown registration with several list views, two archive pages, the “my registrations 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):

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 registrations” list (if you want to use that feature). Set the page access to “show at any login.”
  8. To use the new "my registrations" plugin, add a plug-in content element to that page. Save it and set the type to “My registrations”.
  9. Alternatively, to use the legacy "my events" plugin: 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).

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 fieldsFromFeUserForEmailCsv and fieldsFromAttendanceForEmailCsv are relevant. Please consider the corresponding section about CSV file attachment for 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.

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)

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

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[city][]=Berlin
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.

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 

Tab "Events" in the back-end module “Events”
Column/GUI element
Column/GUI element
Meaning
Meaning

Column/GUI element

Meaning
creates a new event record in the selected sysfolder
Column/GUI element
download as CSV
Meaning
downloads all events as CSV file which can be opened e.g. in Excel

Column/GUI element

Meaning

Record type:

a

b
Single event

a

b
Topic for multiple events

a

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

Meaning
edit an event

Column/GUI element

Meaning
delete an event

Column/GUI element

Meaning
temporarily hide an event
Column/GUI element
act.
Meaning
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:

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:

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 

Tab "Registrations" in the back-end module “Events”

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

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

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, making the connection between this front-end user and the corresponding event. The statistics for that event 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.

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

Reference 

There are two sections in TS setup that contain setting for this extension: plugin.tx_seminars and plugin.tx_seminars_pi1.

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, attendance_mode, seats, total_price,attendees_names,lodgings,accommodation,foods,food,checkbox es, kids, accreditation_number, credit_points, date, time, place, room,paymentmethod, billing_address,interests footer,planned_disclaimer,unregistration_notice,ticket_id

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, attendance_mode, 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
currency
Data type
string
Description
ISO 4217 alpha 3 code of the currency to be used, must be valid
Default
EUR
Property
allowRegistrationForStartedEvents
Data type
boolean
Description
whether registration should be possible even if an event has already started
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
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,crdate,price,total_price,method_of_payment,interests,expectations,back ground_knowledge,known_from,notes
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,crdate,price,total_price,method_of_payment,interests,expectations,back ground_knowledge,known_from,notes
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

[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, 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, 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,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, 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, 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
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
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
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: 'generate-event-slugs-with-underscore'
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!

BeforeAttendeeDownloadSentEvent 

The PSR-14 event \OliverKlee\Seminars\Controller\Event\BeforeAttendeeDownloadSentEvent gets triggered after the stream with the contents for a file download for an attendee has been created, but before the stream gets returned with the HTTP response.

Listeners may provide a stream with different contents if desired, for example for adding a watermark or logo.

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\Controller\EventListener\Controller\BeforeAttendeeDownloadSentEventListener:
    tags:
      - name: event.listener
        identifier: 'generate-pdf-for-download-with-watermark'
Copied!

The corresponding event listener class:

EXT:my_extension/Classes/EventListener/Controller/BeforeAttendeeDownloadSentEventListener.php
<?php

declare(strict_types=1);

namespace MyVendor\MyExtension\EventListener\Controller;

use OliverKlee\Seminars\Controller\Event\BeforeAttendeeDownloadSentEvent;

/**
 * Provides a modified PDF for the attendee download.
 */
final class BeforeAttendeeDownloadSentEventListener
{
    public function __invoke(BeforeAttendeeDownloadSentEvent $event): void
    {
        $contentStream = $event->getContentStream();

        // Here you would modify the content stream as needed.
        // For example, you could add a watermark or modify the PDF content.

        // Set the modified content stream back to the event.
        $event->setContentStream($contentStream);
    }
}
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", "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",
     * "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",
     * "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",
     * 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",
     * "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 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.

Sitemap