Updates will be published directly on TER and Packagist.
Free public support
Free public support is available on the #ext-sf_event_mgt TYPO3 Slack Channel.
Please also check the FAQ section of this documentation. New articles are added on a regular basis.
Paid Services and Support
I also offer the following paid services:
Personal support by email, phone, remote session or on site
Installation and configuration for the extension
Integrating new feature to the main extension (sponsors can be named - see Say thanks)
Priority Bug fixes
Developing extensions, that extend sf_event_mgt with unique features/requirements
Please contact me by email and ask for prices.
Say thanks
If you like this extension and want to say thanks, feel free to drop me an email or sponsor the
development of the extension. Please also consider to support the TYPO3 community by sponsoring
events, code sprints or by becoming a TYPO3 association member.
Thanks from me to:
Georg Ringer for his extension "news", from where I adapted some concepts and code I use in this extension
Alexander Kellner for his extension "powermail", from where I adapted some concepts and code I use in this extension
Thies Kracht who developed the CSV export
Phat Hoang and Oleksandr Bachynskyi from Pixelant AB for their ideas and contributions
Phat Hoang from Pixelant AB for the reCAPTCHA implementation
Jean-François Sillen from Wikafi S.P.R.L for sponsoring the sys_category refactoring
Jean-François Sillen from Wikafi S.P.R.L for sponsoring the price option feature
W52 MarketingKommunikation GmbH for sponsoring the waitlist, user registrations frontend plugin and email attachments
New Communication GmbH & Co. KG for sponsoring and ideas
Tymoteusz Motylewski for implementing event speakers and other contributions
Gerd Müller from Vogt-Schild Druck AG for sponsoring organisator filtering
Alexander Grein from Mediaessenz for implementing the default storage Pid feature
Bernhard Sirlinger for adding the automatic RealURL config
Marc Bastian Heinrichs for adding Cache Tags in list and detail view and for implementing the checkPidOfEventRecord setting
Rune Piper for several code cleanups and Pull Requests
Haisam Zehrawi from SeminarPool GmbH for sponsoring refactoring in the CSV export
Stefano Kowalke for several Pull Requests
Manuel Munz for adding additional registration fields
Christoph Lehmann for several Pull Requests
Christoph Lehmann from networkteam GmbH for sponsoring the backport of user generated content in custom notifications.
Der PARITÄTISCHE Wohlfahrtsverband Hamburg e.V. for sponsoring the GDPR clean command
mediaconcept GmbH for sponsoring the metadata feature for events
Events are the main record of this extension. An event contains several fields, which can be used to
describe the event in detail.
General
The general tab is used to add general information about the event like a title, start- and enddate
and a description.
Field:
Description:
Title
Title of the event.
Top event
If checked, the event is considered as a top event
Startdate
Date and time, when the event starts.
Enddate
Date and time, when the event ends.
Teaser
The teaser for the event.
Description
The description for the event.
Additional
The additional tab contains additional fields for the event like price, location, organiser, link and
program/schedule.
Field:
Description:
Price
A price for the event.
Currency
The currency for the price.
Price options
If the event has prices based on a selected date (e.g. early bird price), you can define one or multiple
price options. The following fields are availabe for price options.
Price
Date until the price is valid (selected date is included)
The event management will automatically output the current price if the {event.currentPrice} getter is used.
Link
A link (e.g. external link) for the event.
Program
The program/schedule for the event.
Custom text
A custom RTE text field. The field can e.g. be used to show, that event registration has ended.
Relations
The relations tab contains fields which holds relations locations, organisators and related events.
Field:
Description:
Location
The location of the event choosen from the location records created.
Room
Optional field for the room, where the event happens.
Organisator
The organisator of the event choosen from the organisator records created.
Speaker
One or multiple speaker of the event.
Related events
One or more related events
Media
The media tab contains fields which holds media-data for the event.
Field:
Description:
Image
One or more images. Each image can be configured to be shown either in the listview, the detailview or both.
Files
One or more files.
YouTube embed code
A YouTube embed code
Additional images
One or more additional images (e.g. images from the event).
Categories
You can assign one or multiple categories to an event.
Field:
Description:
Category
One or multiple categories for the event
Registration Options
For each event, it is possible to enable registration and to limit the
amount of free places, so only a limited amount of people can participate to the event. It is also
possible to allow the user to create multiple registrations at once, if the field "Max. simultaneous
registrations per user" is set to a value greater than 1.
Field:
Description:
Enable registration
Option to enable registration for the event. If enabled, users can register for
participation to the event.
Allow registration until end date and time
If set, it is possible to register to an event until the event end date and time is reached.
Note, that this option has no effect, if the registration deadline is earlier than the
event end date and time.
Registration start date
If set, registration is only possible after the given date.
Registration deadline
If set, registration is only possible until the given date.
Enable cancellation
Option to enable cancellation of registrations for the event. If enabled, users can cancel their
registration to the event.
Cancellation deadline
If set, cancellation is only possible until the given date.
Enable automatic confirmation of event registrations
If set, new registrations for the event will automatically be confirmed regardless of the global
setting settings.registration.autoConfirmation
Max. participants
The amount af max. participants. If the value is zero, there is no limitation.
Max. simultaneous registrations per user
The amount of registrations the participant can create with one single registration. If this
field contains a value greater than 1, a dropdown box can be shown in the registration view
where the user can select how many registrations should be created.
Enable waitlist
Option to enable a waitlist for the event, if the max. amount of registrations is reached.
Enable unique email check for registration
If set, email adresses of registrations are checked for uniqueness for the event.
Enable Payment
If checked, a user registering for an event can select available payment options.
Restrict available payment methods
If checked, the available payment methods for the event can be restricted
Selected payment methods
Selected payment methods, if "Restrict available payment methods" is checked.
Custom payment methods can be added. For documentation, please refer to the
Payment section in the developers manual.
Notify admin
When enabled, the administrator will receive an email for new event registrations (create/confirm)
Notify organisator
When enabled, the organisator will receive an email for new event registrations (create/confirm). The email
sent will use the same template as the admin email.
Registrations
Contains all registrations for the event. Only visible, when registration is enabled.
Field:
Description:
Registrations
A list of participants registered to the event.
Registrations on the waitlist
A list of participants registered to the waitlist of the event. This option is only visible, when the waitlist feature is enabled for the event.
Metadata
Contains fields related to meta tags
Field:
Description:
Keywords
One or multiple keywords used to output the meta tag "keywords"
Description
A description used to output the meta tag "description"
Alternative title
An alternative title which either can be used as meta tag "title" or
which is is used to override the page title.
Categories
You can create categories to structure event records in the frontend (e.g. show events which belong to one
or more categories)
Since the extension uses TYPO3 system categories, you create new categories by choosing "System records" -> "Category"
Locations
Locations can be assigned to an event.
Field:
Description:
Title
Title of the location.
Address
Address of the location
Zip
Zip of the location
City
City of the location
Country
Country of the location
Description
Description (RTE field) of the location.
Link
Link to location or link to a map (e.g. OpenStreetMap)
Latitude
Latitude of the location.
Longitude
Longitude of the location.
Organisator
The organisator can be assigned to an event.
Field:
Description:
Name
Name of the organisator.
E-Mail
E-Mail of the organisator
E-Mail signature
E-Mail signature of the organisator (can e.g. be used in email templates)
Phone
Phone of the organisator
Image
Image of the organisator
Speaker
One or multiple speakers can be assigned to an event.
Field:
Description:
Name
Name of the speaker
Job title
Job title of the speaker
Description
Description of the speaker
Image
Image of the speaker
Registrations
If the registration option is enabled for an event, participants can register to the
event. A registration contains the data the participant entered during the registration
process and also some administration fields like "confirmed" or "paid".
Default fields in the registration form are:
Gender
Title
Firstname
Lastname
Company
Address
Zip
City
Country
Phone
E-Mail
Date of birth
Notes
Accept terms and conditions
If you need additional field in the registration form, you can add individual fields on event basis.
For more information, see Registration field
General
The general tab contains personal data about the participant, who registered to the event
Field:
Description:
Gender
Gender of the participant
Title
Title of the participant
Firstname
Firstname of participant
Lastname
Lastname of participant
Company
Company of participant
Address
Address of participant
Zip
Zip of the participant
City
City of the participant
Country
Country of the participant
Phone
Phone of the participant
E-mail
E-mail of the participant
Date of birth
Date of birth of the participant
Accepted terms and conditions
Indicates, that the user has confirmed the terms and conditions (if field is used in template)
Notes
Notes from the participant
Registration date
The date the registration was created. This field can be edited in the backend, so you can control which
registration will move up from the waitlist for the default waitlist move up process.
Additional
The additional tab contains additional data about the registration
Field:
Description:
Frontend user
If there was a valid frontend user session at registration time, a relation to the frontend user record
is saved in this field
Confirmation until
Administration field. Date/time until the registration must be confirmed. Hides automatically,
when the registration has been confirmed.
Confirmed
Administration field. Will be set automatically, when the user confirms the registration.
No email notifications
It this field is set to true, the participant will not receive notifications sent by the
backend module.
Amount of registrations
Read-only field which shows the number of registrations the participant has created. Only
shown, if participant has created more than one registration
Parent registration
Read-only field which shows the parent registration. Only shown, if the registration depends
on another registration (multiple registrations created by the same participant)
Registration waitlist
If checked, the registration is on the waitlist
Registration field values
The registration fields tab contains all submitted registration field values.
Field:
Description:
Registration field values
List of registration field values
Payment
The payment tab contains information about payment of the registration
Field:
Description:
Paid
Administration field used to set if the user has paid for the event
Payment method
Selected payment method on registration
Payment reference
This field can be used by a payment extension for sf_event_mgt to store a payment reference
Registration field
If the registration option is enabled for an event, you can use registration fields to add additional
fields to the default registration form.
Field:
Description:
Title
Title of the field. Will be rendered as field label in the frontend
Type
Type of the registration field
Possible values:
Textfield (input)
Radiobutton
Checkbox
Textarea
Text
Divider
Date, Datetime or Time
Options
Options for the type "Radiobutton" and "Checkbox".
Example:
Option 1|value1
Option 2|value2
Required
If checked, field must be filled out in frontend
Placeholder
Placeholder for the field
Default value
The default value of the field
Date input mode
Only visible when the selected field type is "Date/Time".
Selects the date input mode: either 'date' (default), 'datetime' or 'time'
Please note: The default template just uses HTML5 input types. You might want to extend that to use a
JavaScript datetimepicker instead.
Registration field value
If the registration option is enabled for an event and registration fields are configured for an event,
the field values of each registration field are saved as a registration field value
Field:
Description:
Value
The data, the user entered in the registration form for the field
Value datatype
Datatype of the registration field value
Field
Relation to the registration field
Backend module
Open the the backend module "Events" from the TYPO3 backend menu and next select
a sysfolder containing your events.
To filter in the list of events, use the 3 search-fields title, startdate and enddate.
Available actions
The backend module contains 5 actions in the upper left.
The first 4 actions creates new items (event, location, organisator, speaker)
The last action does the same as the cronjob, it hides/removes expired registrations
CSV export
With the backend module, you can export a list of participants for events, which are
enabled with the registration option. If the list of fields exported does'nt fit your
needs, you can adjust the fields in the module TypoScript settings as described in the
configuration section of this extension.
Sending custom notification
For events which are enabled with the registration option, you can also send custom
email notification to the participants of the event. Press the "+" icon to get to
the view, where you can select the custom notification template.
If you want to create a custom notification, you just need to add some TypoScript
and a Fluid template for the new custom notification. Please refer to the manual
in the administration section of this extension.
Live Search
You can use the TYPO3 live search to search for specific events by adding "#event:" as a prefix to your search like
shown on the screenshot below
Configure extension TypoScript settings depending on your needs.
Optionally add the plugin Frontend user registrations to a page, to show registered frontend users their event registrations
Important
If you use registrations for events, you must follow the instructions regarding the CLI Commands
If you use registrations for events with a registration start date or a registration deadline, you must follow the instructions regarding the Page Cache Configuration
For the calendar view, make sure to uncheck the Disable overwrite demand setting in the plugin
The following settings are available in the "Settings" section of the "Admin Tool"
backend module. Open "Extension Configuration" to edit the settings for the extension.
Property:
Data type:
Description:
Default:
slugBehaviour
String
uniqueInSite: The same slug can be used for news in different sites. Use this setting only if no
event records are shared between sites. "unique" means that same event title will lead to different
slug names.
uniqueInSite
enableInvoice
Boolen
Enable payment method 'invoice'
true
enableTransfer
Boolen
Enable payment method 'transfer'
true
hideInlineRegistrations
Boolen
Enable feature to hide registrations when editing an event in the backend
False
hideInlineRegistrationsLimit
Integer
Max amount of registrations to display before event registrations will be hidden when editing an event.
List view, Detail view, Registration view, Calendar view, Search view
Since some plugins use the same settings, this section covers the settings
for the following plugins:
List view
Detail view
Registration view
Calendar view
Search view
Nearly all important settings can be made through the plugins, which override the
settings made with TypoScript. All plugin settings can also be configured with TypoScript
(use plugin.tx_sfeventmgt.settings. with the keys shown below).
Tab settings
Property:
View:
Description:
Key:
Display mode
List, Search, Calendar
With this setting the plugin can be configured to show all events, only
future or only past events.
Available options
all
future
current_future
past
displayMode
Show a single event record
Detail, Registration
The detail view will show the configured event record if not event is passed to the detail or registration
action by parameter. Can be used to display a single event on a page without the need to link to the detail
or registration page from a list view.
singleEvent
Sort by
List, Search, Calendar
Defines which field should be used for sorting events in the frontend. The default sorting field is
"startdate", which can be overridden by using this setting.
orderField
Sorting direction
List, Search, Calendar
Defines the sorting direction for orderField. The default sorting direction is
"asc", which can be overridden by using this setting.
Possible values:
<empty value>
asc
desc
orderDirection
Top event restriction
List, Search, Calendar
With this setting the plugin can be configured to show only top event events, to
except top events or to ignore the top event restriction.
Available options
0 (None - ignore top event restriction)
1 (Except top events)
2 (Only top events)
topEventRestriction
Max records displayed
List, Search, Calendar
The maximum number of records shown
queryLimit
Category mode
List, Search, Calendar
This setting defines, how categories are taken into account when selecting events.
The following options are available:
Ignore category selection
Show events with selected categories (OR)
Show events with selected categories (AND)
Do NOT show events with selected categories (NOTOR)
Do NOT show events with selected categories (NOTAND)
categoryConjunction
Category
List, Search, Calendar
Restrict events to be shown by one or more category
category
Include subcategory
List, Search, Calendar
Includes subcategories of the selected category
includeSubcategories
Location
List, Search, Calendar
Restrict events to be shown by one location
location
Organisator
List, Search, Calendar
Restrict events to be shown by one organisator
organisator
Speaker
List, Search, Calendar
Restrict events to be shown by one speaker
speaker
Record storage page
List, Search, Calendar
One or more sysfolders, where events are stored
storagePage
Comma seperated list of fieldnames, which are required.
Registration
List of fieldnames, which are mandatory for registration. The fields
firstname, lastname and email are always required and cannot be overridden.
The following additional fields are available:
title
company
address
zip
city
country
phone
gender
dateOfBirth
notes
accepttc
Note, that all fields are just checked, if they are empty or not. If the field "accepttc" (or any other
boolean field) is included in the list of required fields, it is checked if the field value is true.
registration.requiredFields
Tab additional
Detail Page
List, Registration
Page, where plugin is configured to show event details
detailPid
List Page
List, Details, Registration
Page, where the listview for events is shown. Only available,
when the plugin is configured to show event details.
listPid
Registration Page
List, Details
Page, where plugin is configured to show event registration
registrationPid
Payment Page
Registration
Page, where plugin is configured to handle payments for registration
paymentPid
Restrict foreign records to storage page
List
Categories, locations and organisators will only be loaded from the configured storage page (recursive)
restrictForeignRecordsToStoragePage
Disable Override demand
List
If set, the settings of the plugin can't be overridden by arguments in the URL.
disableOverrideDemand
Tab template
Property:
View:
Description:
Key:
Template layout
List
With this setting the plugin can be configured to show different template layouts.
Template layouts can be configured with Page TSConfig.
Template layout can be used/set by TypoScript (settings.templateLayout)
templateLayout
Tab notification
Property:
View:
Description:
Key:
E-Mail address of emails sent to the user
Registration
E-Mail address of emails sent to the user. This should
be the email address of the site admin or a general information
email address. The user will see this email address as sender.
notification.senderEmail
Name of the sender
Registration
Name of the sender
notification.senderName
settings.notification.replyToEmail
String
Reply-to email address of emails sent to the user
empty
E-Mail address(es) of website admin
Registration
E-Mail address(es) of website admin(s), who receives new/confirmed registrations. Multiple E-Mail addresses
must be separated with a comma.
notification.adminEmail
Subject of email sent to user when a new registration is created
Registration
Subject of email sent to user when a new registration is created
notification.registrationNew.userSubject
Subject of email sent to user when a new registration on the waitlist is created
Registration
Subject of email sent to user when a new registration on the waitlist is created
notification.registrationWaitlistNew.userSubject
Subject of email sent to admin when a new registration is created
Registration
Subject of email sent to admin when a new registration is created
notification.registrationNew.adminSubject
Subject of email sent to admin when a new registration on the waitlist is created
Registration
Subject of email sent to admin when a new registration on the waitlist is created
notification.registrationWaitlistNew.adminSubject
Subject of email sent to user when a registration has been confirmed
Registration
Subject of email sent to user when a registration has been confirmed
notification.registrationConfirmed.userSubject
Subject of email sent to user when a registration on the waitlist has been confirmed
Registration
Subject of email sent to user when a registration on the waitlist has been confirmed
Subject of email sent to user when a registration has been cancelled
Registration
Subject of email sent to user when a registration has been cancelled
notification.registrationCancelled.userSubject
Subject of email sent to admin when a registration has been cancelled
Registration
Subject of email sent to admin when a registration has been cancelled
notification.registrationCancelled.adminSubject
Tab category menu
Property:
View:
Description:
Key:
Categories
List
A subset of categories which will be shown in the category menu. If empty, all
categories will be shown
categoryMenu.categories
Include Subcategories
List
Includes subcategories of selected categories to the category menu
categoryMenu.includeSubcategories
Order field
List
Order field for the category menu (internally limited to "title", "uid" and "sorting")
categoryMenu.orderField
Order direction
List
Order direction for the category menu
categoryMenu.orderDirection
Frontend user registrations
NOTE: Make sure,that you place the Plugin on a page with "Usergroup Access Rights" configured to only show
the plugin output for logged in users and/or users belonging to a user group. Anyway, the plugin will only output
content if there is an active FE user session.
Settings
Nearly all important settings can be made through the plugin, which override the
settings made with TypoScript. All plugin settings can also be configured with TypoScript
(use plugin.tx_sfeventmgt.settings. with the keys shown below).
Property:
View:
Description:
Key:
Display mode
List
With this setting the plugin can be configured to show registrations for all events, only
future or only past events.
Available options
all
future
current_future
past
userRegistration.displayMode
Sort by
List
Defines which field should be used for sorting events in the frontend. The default sorting field is
"startdate", which can be overridden by using this setting.
userRegistration.orderField
Sorting direction
List
Defines the sorting direction for orderField. The default sorting direction is
"asc", which can be overridden by using this setting.
Possible values:
<empty value>
asc
desc
userRegistration.orderDirection
Registration pid
List
Page, where the event plugin is configured to show event registration
registrationPid
Record storage page
List
One or more sysfolders, where events and registrations are stored
userRegistration.storagePage
Recursive
List
Recursion level for record storage page
userRegistration.recursive
Payment
The Plugin "Events and event-registration - Payment" plugin should be placed on a separate TYPO3 page. You must
reference the "Events and event-registration" plugin settings to the TYPO3 page UID if you want to use the
payment plugin.
Page Cache Configuration
Since TYPO3 does not know, which records a plugin will show, it can not automatically consider starttime/stoptime
of e.g. event records for the page cache lifetime calculation. It has to be configured that TYPO3 will include the
starttime/stoptime of records in the page cache lifetime calculation using config.cache as described in the
TypoScript reference
The shown example will include the starttime/stoptime for all events in PID 2 (storage page for events) for cache
lifetime calculation of PID 3 (page with list view plugin) and 4 (page with detail view plugin).
When you use "Event management and registration" along with the Registration start date or Registration dealine
featurem it is highly recommended to configure cache settings like shown in the example above. If this setting is not
configured properly, the cache lifetime of a page may be too high resulting in registration links being shown for
events, where registration is not logically possible.
The extension hooks into the page cache lifetime calculation and uses the configured cache configuration to calculate
the cache lifetime for events with a Registration start date or Registration dealine. Please note, that the
calculation only includes events, where the startdate is not reached and where registration is enabled.
If set, the calendar will show events for all days of all shown weeks of the calendar and not only
events for the current month.
1 (true)
settings.calendar.showWeekNumber
Boolean
Definies, if the calendar should show week numbers or not.
1 (true)
settings.detail.checkPidOfEventRecord
Boolen
If set, the detail view checks the incoming event record against the defined starting point(s).
If those don’t match, the event record won’t be displayed.
0 (False)
settings.detail.imageWidth
Integer
Default width of images in detail view
200
settings.detail.imageHeight
Integer
Default height of images in detail view
Empty
settings.detail.isShortcut
Boolean
This setting should be set to "1" if the event should be fetched from the Content Object data.
This option should only be set to "1", if events are displayed using the "Insert Record" content element
0 (false)
settings.registration.checkPidOfEventRecord
Boolen
If set, the registration view checks the incoming event record against the defined starting point(s).
If those don’t match, the registration to the event is not possible.
0 (False)
settings.registration.autoConfirmation
Boolean
If set to true, new registration will automatically be confirmed by redirecting
the user to the confirmRegistration-Action.
0 (false)
settings.registration.deleteExpiredRegistrations
Boolean
If set to true, expired registrations will be deleted by the action in the backend module. If this
setting is set to false, expired registrations will just be set to hidden
Note, this setting has no effect for the cleanup CLI command.
0 (false)
settings.registration.formatDateOfBirth
string
Date format of field dateOfBirth
d.m.Y
settings.registration.requiredFields
String
List of required fields in registration. The fields firstname, lastname and email
are always required and cannot be overridden.
The following additional fields are available:
title
company
address
zip
city
country
phone
gender
dateOfBirth
notes
accepttc
captcha
Note, that all fields are just checked, if they are empty or not. If the field "accepttc" (or any other
boolean field) is included in the list of required fields, it is checked if the field value is true.
empty
settings.registration.linkTermsAndConditions
String
A page or an external URL that can be used in the registration template to show "Terms & Conditions"
empty
settings.registration.prefillFields.{fieldname}
String
Key/value mapping for prefilling fields from fe_users table. The
key-field is the fieldname in sf_event_mgt and the value-field is
the fieldname in fe_users.
If set to true (1), a registration will keep the dependency to the main registration if the registration
has been submitted using the simultaneous registration process. Note, that it is recommended to set this
value to false (0), since cancellation of the main registration will also cancel moved up "child"
registrations.
Fields to be included in a query for the search view
title, teaser
settings.search.adjustTime
boolean
When the setting settings.search.dateFormat is set to a date only, it is recommended to set this option
to true. The time for a given startdate will be set to 00:00:00 and the time for a given enddate will be set
to 23:59:59, so all events for the given dates will be found by a search.
true
settings.pagination.enablePagination
boolean
If true, the list view outputs required variables to render a pagination.
false
settings.pagination.itemsPerPage
integer
Amount of items per paginated page.
10
settings.pagination.maxNumPages
integer
Maximum number of pages to show in the pagination.
10
settings.event.errorHandling
String
If an event for the detail and registration view is not found (e.g. is hidden or deleted), you can configure,
if the plugin should redirect to the list view, show a 404 error or render the view (default) without the
event data.
Possible values:
redirectToListView
pageNotFoundHandler
showStandaloneTemplate
The "showStandaloneTemplate" option requires a Template and optional an HTTP status code.
Note: For TYPO3 9.5, this setting has only effect when the event is not passed through GET parameters to the
action (e.g. event set in plugin). For all other scenarios, the TYPO3 "sites" error handling steps in.
Comma seperated list of fields to include in CSV export. Please note, that you must write the property
names of the fields to export (e.g. firstname, lastname, dateOfBirth, event.title)
In order to export the values of registration fields, use "registration_fields" as fieldname. Note, that
it is only possible to export all registrations fields at once.
If switched on, a warning message is shown in the backend module, when a backend user does not have
read/write access rights to the temp-folder of the default storage.
true
settings.csvExport.fieldDelimiter
String
Comma seperated list delimiter
,
settings.csvExport.fieldQuoteCharacter
String
Comma seperated list quote character
"
settings.csvExport.prependBOM
Boolean
Prepend UTF-8 BOM to export. Switch this setting on, of you have problems when opening the exported CSV file
with Microsoft Excel
false
settings.list.itemsPerPage
Integer
Number of items to show per page in backend module
10
settings.search.dateFormat
String
Date format for search fields in backend module
d.m.Y H:i
settings.search.fields
String
Fields to be included in a query from the backend module
This setting allows to set the default storage pid of new events generated over the backend module.
To set the default storage pid for new event records to e.g. a sysfolder with the pid 20 use:
Since TYPO3 9.5, the TYPO3 Core comes with speaking URLs out of the box. For Extbase Extensions, the administrator
can configure route enhancers to create speaking URLs for extension parameters.
The following example shows a basic configuration for routes of sf_event_mgt.
Note
The examples shown are for version 6.x of the extension, where several new plugins
have been introduced. For an example routing configuration that covers version 4.x and 5.x
of the extension, please switch to the version of the documentation to the left.
Note, that some requirements are too loose (e.g. eventuid, reguid) and can not be simplified, so therefore
a cHash parameter will be added to the route automatically.
The extension also extends sys_category with a slug field the same way as ext:news does. Please note, that
the overwriteDemand/category argument is a string, which can contain multiple category UIDs. When you
use the overwriteDemand for categories with only one category, the example configuration above will work.
If you pass multipl, comma separated category UIDs to the overwriteDemand/category argument, you have to
implement you own routing aspect.
Please do never change templates directly in the Ressources folder of the extensions,
since your changes will get overwritten by extension updates.
The easiest way to override templates is to set the following constants:
plugin.tx_sfeventmgt.view.templateRootPath
plugin.tx_sfeventmgt.view.partialRootPath
plugin.tx_sfeventmgt.view.layoutRootPath
Those values will automatically be added after the default paths configuration of the extension. If you prefer
to configure the path-values using TypoScript setup, please refer to the example below
(note the plural of the path-name):
DateTime object with the first day of the current month
{previousMonthConfig}
Array with date, month and year of the previous month
{nextMonthConfig}
Array with date, month and year of the next month
{weekConfig}
Array holding the year and weeknumber for the current, previous and next week.
This variable must be used to create a calendar view by week.
{contentObjectData}
The current content object of the plugin
{pageData}
The current page data
Search view
Object:
Description:
{events}
An object holding all events that matched the configured demand in the plugin settings and the given searchdemand
{categories}
All available categories
{locations}
All available locations
{organisators}
All available organisators
{speakers}
All available speakers
{searchDemand}
The searchDemand object
{overwriteDemand}
The overwriteDemand object
{contentObjectData}
The current content object data
{pageData}
The current page data
Notification views
The following objects can be used in notification views
Object:
Description:
{event}
An object holding the given event
{registration}
An object holding the given registration
{settings}
An array of extension settings
{hmac}
HMAC for the registration UID
{reghmac}
Appended HMAC for the registration UID
E-Mail subjects
The following objects can be used in email subjects for event registration and custom notifications
Object:
Description:
{event}
An object holding the event for a registration
{registration}
An object holding the registration
Registration message views
Registration message views are cancelRegistration, confirmRegistration and saveRegistrationResult
Object:
Description:
{event}
An object holding the given event
{registration}
An object holding the given registration
{failed}
If the status is failed
{titleKey}
The key of the title to use in <f:translate> viewHelper
{messageKey}
The key of the message to use in <f:translate> viewHelper
{result}
The integer value of the {messageKey} variable
iCalendar view
The iCalendar view is used to render an iCal file which can be downloaded by the user for the given event.
Please note, that the iCalendar view is a simple textfile. If you choose to extend the view, be sure that
new fields are compliant with RFC 5545 https://tools.ietf.org/html/rfc5545
Object:
Description:
{event}
An object holding the given event
Plugin: Events and event-registration - FE user registrations
List view
Object:
Description:
{registrations}
An object holding all registrations that matched the configured demand in the plugin settings
Special Getters
Some domain objects contain special getters which are used in templates to avoid complex fluid conditions.
Event
The Event-Object has the following special getters
Getter:
Description:
{event.registrationPossible}
Returns, if registration for the event is possible. This getter respects if registration is enabled,
if max. participants is configured/reached, if registration deadline is configured/reached and if
registration deadline / event startdate is reached.
{event.freePlaces}
Returns the amount of free places for an event
{event.activePriceOptions}
Returns all active price options sorted by date ASC
{event.currentPrice}
Returns the current price of the event respecting possible price options
{event.cancellationPossible}
Returns, if cancellation for registrations of the event is possible
{event.registrationFieldsUids}
Returns an array with registration field uids
{event.registrations}
Special getter to return the amount of registrations that are saved to default language
{event.registrationsWaitlist}
Special getter to return the amount of waitlist registrations that are saved to default language
{event.endsSameDay}
Returns if the event ends on the same day
{event.images}
Returns the same ans {event.image}
{event.listViewImages}
Returns all images from {event.image} that are configured to be shown in list view
{event.firstListViewImage}
Returns the first image from {event.image} which is configured to be shown in list view
{event.detailViewImages}
Returns all images from {event.image} that are configured to be shown in detail view
{event.firstDetailViewImage}
Returns the first image from {event.image} which is configured to be shown in detail view
Viewhelpers
The following viewhelpers can be used in you templates.
PrefillViewHelper
This viewhelper prefills fields in the registration form with values from fe_users.
This viewhelper does exactly the same as f:uri.page, but this viewhelper
builds frontend links with buildFrontendUri(), so links to FE pages can get
generated in the TYPO3 backend.
This viewhelper can be used in email templates for custom notifications, when you want to link to a
given page in you TYPO3 website.
This viewhelper renders an array of possible simultaneous registration for
the given event. The viewhelper respects the max. amount of simultaneous
registrations per user and also respects the amount of remaining participants
for the event.
The index of the array returned starts with 1, so the resulting array can be used
directly in the f:form.select viewhelper.
Formats the given DateTime object according to rfc5545, so it can be used in the iCalendar view
Format.ICalendarDescriptionViewHelper
Formats the given string according to rfc5545, so it can be used in the iCalendar view
Registration.Hmac
Must be used, when the plugin Frontend user registrations is used and it should be possible
for users to cancel registrations (if configured in event). See usage in UserRegistration templates.
Registration.IsRequiredField
Can be used to show content, if a field or registration field is configured as required.
See usage in Registration template and registration field partials.
Can be used to show a string, when a given field or registration field has validation errors
See usage in Registration template and registration field partials.
Use this viewhelper to set the page title and indexed search title on event-detail and -registration pages.
Example:
<e:title pageTitle="{event.title}" indexedDocTitle="A custom title for indexed search"/>
Copied!
Category.Count
Can be used to get the amount of events per category.
Example:
<e:category.count categoryUid="{category.uid}" />
Copied!
MetaTag
Use this viewhelper to add various meta tags related to the event. The default template for the event
detail view uses this viewhelper to output the meta tags "keyword", "description" and "og:title".
In the List view, Detail view, Registration view, Calendar view, Search view you can define criterias for the listview, so it e.g. only
shows the events of a special category or for a special location. Nearly all settings
affecting the demand of the shown events can be overwritten by a URL parameter called
overwriteDemand.
Below follows some examples for the overwriteDemand setting:
Filter by category
The following code snippet shows a list of links which restrict the category to be shown
to the given category:
As all links are generated using the f:link.action viewHelper, they are fully cached.
Filter by special location properties
It is possible to filter events by the location city and country. Using the overwriteDemand
parameter is as following:
<f:link.action action="list" controller="Event" arguments="{overwriteDemand:{locationCity: 'Hamburg'}}">Show all events in Hamburg</f:link.action>
<f:link.action action="list" controller="Event" arguments="{overwriteDemand:{locationCountry: 'Germany'}}">Show all events in Germany</f:link.action>
Copied!
Filter by year, month and/or day
It is possible to filter events by a specific year, month or day. Using the overwriteDemand
parameter is as following:
<f:link.action action="list" controller="Event" arguments="{overwriteDemand:{year: '2017'}}">All events in 2017</f:link.action>
<f:link.action action="list" controller="Event" arguments="{overwriteDemand:{year: '2017', month: '10'}}">All events in october of the year 2017</f:link.action>
<f:link.action action="list" controller="Event" arguments="{overwriteDemand:{year: '2017', month: '10', day: '1'}}">All events on the 1st of october 2017</f:link.action>
Copied!
The filtering also respects events, which are in between the given filter criteria. If you for example set
the filter option to filter events for the 2st of october 2017, then also an event will be shown, that start
at the 1st of october and ends at the 3rd of october.
CLI Commands
Cleanup expired registrations
Only needed if you use registrations for events
If a new participant registers to an event, the participant must confirm the registration in a
given timeframe (default 1 hour from registration time). If the participant does not confirms
the registration in the given timeframe, the booked place for the event should be made available
again for other participants.
In order to remove/hide expired registrations, a CLI command is available to remove/hide expired registrations.
It is recommended to setup a scheduler task to execute the CLI command periodically.
GDPR cleanup for registrations
Local data privacy policies may require, that you only save personal user data
when needed. In order to remove personal user data of registrations including
saved registration field data for expired events, a CLI command is available.
Arguments
days - Amount of days reduced from todays date for expired event selection.
Options
softDelete - If set, registration will not be deleted hard, but only flagged as deleted
ignoreEventRestriction - If set, simply all available registrations will be selected and deleted. Use with care!
It is recommended to setup a scheduler task to execute the CLI command periodically.
Note
The GDPR cleanup only includes events, which have a start- and enddate. Events with no enddate are
not covered by the cleanup, since it is not possible to calculate, when the event has ended.
Custom notifications
If you use the registration option for events, you have to possibility to send
custom notifications to participants of the event. In order to do so, use the
admin module to open the "Notify participants" view.
Create an own notification
To create an own notification, you first need to create a HTML template that will
be used as the notification body. The template must be located in the following
path:
Templates/Notification/User/Custom/
Copied!
In this example, I create the file MyNotification.html
You can use the following objects in your template:
{registration}
{event}
{settings}
{hmac}
{reghmac}
{customNotification}
After you created the notification template, you have to configure the new notification
in the TypoScript settings of the admin module.:
module.tx_sfeventmgt {
settings {
notification {
customNotifications {
myNotification {
title = A title for the notification
template = MyNotification.html
subject = A subject for the email
}
}
}
}
}
Copied!
After configuring the new notification to the TypoScript settings, you can use it to
notifiy participants of the event.
Selecting the recipients of custom notifications
If you want to send a custom notification only to a selected group of recipients (e.g. those who
actually have paid for the event), you can use the "constraints" setting to limit the recipients.:
module.tx_sfeventmgt {
settings {
notification {
customNotifications {
myNotification {
title = A title for the notification
template = MyNotification.html
subject = A subject for the email
constraints {
paid.equals = 1
}
}
}
}
}
}
Copied!
Using the example above, only those participants will receive an email where the field "paid" equals with "1".
You can use the following conditions
equals
lessThan
lessThanOrEqual
greaterThan
greaterThanOrEqual
You may also combine the conditions like shown below:
module.tx_sfeventmgt {
settings {
notification {
customNotifications {
myNotification {
title = A title for the notification
template = MyNotification.html
subject = A subject for the email
constraints {
paid.equals = 1
confirmed.equals = 1
}
}
}
}
}
}
Copied!
Note, that combined conditions are always combined with a logical AND statement, so custom
notifications with the example settings from above will be sent to all participants, who have
paid and confirmed to the event.
Also note, that the usage of conditions like shown above are rudimentary and does not cover all
scenarios.
E-Mail attachments
If the registration option is enabled for an event, participants can register to the
event. The extension allows you to send emails to the participant in order to notify
him, that he has registered or confirmed his registration.
The extension supports to add attachments to the following type of emails:
New event registration
New event registration on the waitlist
Confirmed event registration
Confirmed event registration on the waitlist
Configuring email attachments
Attachments must be configured in TypoScript and it is possible to add attachments globally to all emails of a
specific type or individual per event. Due to readability, the default TypoScript setup does not include an
example configuration for email attachments.
Possible attachment configurations
Attachment configuration can be added to the following TypoScript settings:
The example above configures the attachments for emails to the user (the participant) when a new registration is
created.
The fromFiles setting configures the file fileadmin/terms-and-conditions.pdf to be added to the email. If the
file does not exist, it will not be added.
The fromEventProperty setting configures to add all files from the event properties files and image. Those
properties are of the type TYPO3CMSExtbasePersistenceObjectStorage and may contain fileReferences. It is also
possible to use properties of the type TYPO3CMSExtbaseDomainModelFileReference
The configuration ot the fromRegistrationProperty setting is similar to the fromEventProperty setting. In the
example above, the property registrationFiles will be used. Note, that the registration model of the extension does
not contain any default fields that can be used as attachments, so you have to add your own if you need them.
iCal attachment
Configuration of an iCal attachment is similar to the configuration of attachments (see above). The only difference is,
that the iCal attachment is only supported for the recipient group user
Properties for attachment configuration
Property:
Data type:
Description:
Default:
iCalFile
boolean
If set, a iCal file for the event will be attached to the user email
In the example above, emails for new user registrations will include an iCal file for the event.
Email attachments using PSR-14 Events
If the TypoScript configuration settings for email attachments do not fulfill your requirements, you can
use the ModifyUserMessageAttachmentsEvent Event to add custom attachments using PHP (see PSR-14 Events)
RSS feed
This section describes how you add a RSS feed for the list of events. The implementation of the RSS feed in
sf_event_mgt is similar to the RSS feed implementation in the news extension from Georg Ringer. Many parts
of the RSS feed documentation are taken from his extension with small modifications to fit sf_event_mgt.
The template for the RSS feed can be found in the file Resources/Private/Templates/Event/List.xml
To configure sf_event_mgt to use this template, simply set the format of the output als shown below:
plugin.tx_sfeventmgt.settings.list.format = xml
Copied!
RSS feed by TypoScript (recommended)
One way to generate the RSS feed is to use TypoScript. Add to following TypoScript to your site and adopt it to your
needs:
This example will show all events which are saved on the page with uid 3. The detail view page is the one with uid 4.
The RSS feed itself can be found with the link /?type=9918.
RSS feeds by using a plugin
If you want to use the sf_event_mgt plugin to configure the settings of your RSS feed, then just configure the
event plugin as if you are creating a list view (set startin point, categories, detail page, ...)
Next, add a new TypoScript template to the page and insert the following TypoScript to the setup section
Important
If the sf_event_mgt plugin is located in different column than default (0), then you extend the TypoScript as
following:
page.10.select.where = colPos=1
Copied!
Note
When using Fluid Styled Content, you have to make sure, that you override layouts and templates of
Fluid Styled Content in order to remove the wrapper-div and also to ensure the RSS feed contains
no empty lines. To keep things simple, it is recommended to configure the RSS feed using TypoScript
RSS feed configuration
Don't forget to configure the RSS feed properly as the sample template won't fulfill your needs completely.
Please look up the constants and change the mentioned settings.
plugin.tx_sfeventmgt {
rss.channel {
title = Feed title
description =
link = http://domain.tld/
language = en-gb
copyright = TYPO3 Event management and registration
category =
generator = TYPO3 EXT:sf_event_mgt
}
}
Copied!
Add a link to the RSS feed in the list view
To be able to render a link in the header section of the normal page which points to the RSS feed you can use
something like this in your List.html fluid template.
The registration form of the extension may be target of spam bots, which submit the form with various data.
Besides the fact, that this may require manual work to delete all spam submissions from the database, it may
even be a bigger problem for events with a fixed amount of free places, when spam bots registrations block
valid user registrations.
The extension offers possibilities to reduce the amount of spam in the registration form to a minumum:
It is possible to configure spam checks which are executed on form submission. A configurable max spam score is used
to determine, if a form submission is considered as spam or not. Each spam check can increase the total spam score
by a configurable amount.
Configuration
The configuration is (hopefully) self explaining.
The spam check can be enabled or disabled using Typoscript.:
To enable the spam check,
plugin.tx_sfeventmgt.settings.registration.spamCheck.enabled = 1
must be set.
Next, each spam check must be activated and configured to your needs.
The honeypot spam check
This check adds a field (either invisible input field or a hidden form field) to the registration form.
If the field is filled out, it is very likely that the form submission is spam. Therefore you should configure
a high
increaseScore
, so the spam check as a whole already is considered as failed when this check fails.
If this spam check is configured and the field is not submitted (missing in POST parameters), the check is also
considered as failed.
The link spam check
This check counts the amount of links in all submitted form fields. If the configured
maxAmountOfLinks
is
exceeded, the check is considered failed.
The challenge/response spam check
This check adds a hidden input field to the registration form. The check expect a specific value to be submitted
in the hidden input field. If this value is not present, the check is considered failed.
The spam check has the following configuration options:
challengeResponse {
enabled = 0
name = Challenge/Response check (JavaScript required) using ROT13 encryption/obfuscation
class = DERHANSEN\SfEventMgt\SpamChecks\ChallengeResponseSpamCheck
increaseScore = 10
configuration {
prefix = SfEventMgt
postfix = TYPO3
}
}
Copied!
The spam check calculates a challenge consisting of the configured pre- and postfix and a hmac which includes the
uid of the event. This challenge is added as data-attribute to the hidden form field.
The check expects the challenge to be returned ROT13 encrypted/encoded. There is a plain vanilla JS script in
Resources/Public/JavaScript/cr-spamcheck.js
that does the job for you, if you use the included partial for
the spam checks of the extension.
Creating a custom spam check
It is also possible to create custom spam checks. To do so, just add an own configuration array to the
checks
array and implement your check as a class that extends
\DERHANSEN\SfEventMgt\SpamChecks\AbstractSpamCheck
Please refer to the existing spam checks in the extension for details.
You should evaluate, which captcha service suits best for your needs, since the reCAPTCHA
service may not be inline with local laws (e.g. privacy concerns due to GDPR)
Configuration
Both hCaptcha and Google reCAPTCHA require API credentials, so the captcha can be check against an API.
The API credentials must be added as TypoScript constants (see example below).
Note, that you must replace
<event-record-pid>
and
<detail-pid>
with your own values.
Tip
When you only want to show future events, you can extend the config by
additionalWhere =
tx_sfeventmgt_domain_model_event.enddate > UNIX_TIMESTAMP()
Language menu on event detail pages
If a language menu is rendered on a detail page and the languages are configured to use a strict mode, the following snippet
helps you to setup a proper menu. If no translation exists, the property available is set to false - just as if the current
page is not translated.
10 = TYPO3\CMS\Frontend\DataProcessing\LanguageMenuProcessor
10 {
as = languageMenu
addQueryString = 1
}
11 = DERHANSEN\SfEventMgt\DataProcessing\DisableLanguageMenuProcessor
# comma separated list of language menu names11.menus = languageMenu
Copied!
Default waitlist move up process
The extension contains a built in waitlist feature to allow your users to register on a waitlist for events, where
all places are taken. It is possible to automatically move up user from the waitlist either by the built in logic
in the extension or by implementing a custom logic using the PSR-14 event WaitlistMoveUpEvent
Note
The default waitlist move up process is designed to meet the most common and simple requirements to a
waitlist move up process. If the move up process does not fulfill your needs, you have to implement an
own process.
How does the waitlist move up process work?
The default automatic move up process is active, when the following conditions are met for the event:
"Enable cancellation" is activated
"Enable waitlist" is activated
"Automatic waitlist move up" is activated
As soon as the event is fully booked, new registration will be added to the waitlist of the event.
When a registered user cancels the registration, registrations will move up from the waitlist.
Note, that the following conditions decide, if a registration will move up:
The registration must be confirmed
The registration must have a valid date in the field "Registration date"
The registration with the earliest "Registration date" will move up first
As soon as a registration moved up from the waitlist, the user will recieve an email, that the registration moved up.
Things to keep in mind when using the default move up process
The default move up process does not execute, when registrations are removed from the event because the confirmation dealine exceeded
When the simultaneous registration process is used, registrations are treated seperately by the default move up process.
This can result in, that the main registration will be moved up, but additonal may not.
When the simultaneous registration process is used, the dependency to the main registration will automatically be
removed. This is recommended, since the cancellation of the main registration will result in the cancellation
of all "connected" registrations. The TypoScript setting settings.waitlist.moveUp.keepMainRegistrationDependency
can be used to keep the dependency to the main registration.
When the simultaneous registration process is used, moved up registrations will automatically be enabled for
notification.
If a payment process is activated for the event, the AfterRegistrationMovedFromWaitlist event must manuelly be implemented
in order to send an email with payment information (e.g. payment link) to the user who moved up.
Customizing the move up process
If the default move up process does not fulfill your needs, you can use the PSR-14 event WaitlistMoveUpEvent
to create a custom move up logic. Please refer to the code of the default move up process to see how a custom
logic can be implemented.
If you implement a custom move up logic and to not want the default move up process to be executed, make sure
so set $processDefaultMoveUp to false in your event listener.
The extensions contains many PSR-14 events which make it possible to extend the extension with own functionality.
You can for example add own variables to all views or extend email notifications by own needs.
Please note, that there is no documentation for each PSR-14 event in detail, so you have to check each event
individually for supported properties. Generally I tried to make the events as self explaining as possible.
If you are new to PSR-14 events, please refer to the official TYPO3 documentation about
PSR-14 events and Event Listeners.
The extension supports custom payment methods, which can be added by creating an own extension that adds a new
payment method and implement Event Listeners for the PSR-14 Events for the different payment actions. It is
required, that the payment is processed by an external payment provider (e.g. Paypal payment page).
Please refer to the General workflow image shown below.
It is also required, that each Event Listener uses a Fluid standalone view to render the output that will be
shown in the desired payment action in sf_event_mgt
Note
Please note, that it is only possible to start the payment process after the registration has been
confirmed by the user.
This section describes how to create your own payment solution for sf_event_mgt which makes use of the provided
payment actions.
I will assume, that the new payment method is called mypaymentmethod and the extension key for the new
payment method is sf_event_mgt_mypaymentmethod
General workflow
Depending on the selected payment method, the user is redirected to the payment providers payment page.
Depending on the requirements of the payment method, you should implement an Event Listener for available PSR-14 Events.
You should at least implement handling of redirect, success, failure and cancel actions.
The code below shows how to implement your payment method to the redirectAction PSR-14 Event of sf_event_mgt:
The setters in all events allow you to control the behavior of the payment process in the main extension.
4. Add payment class
Please refer to the class AbstractPayment in sf_event_mgt for possible settings. You payment class
must extend AbstractPayment and you should override/set the local $enable properties in order
to enable the actions in sf_event_mgt
Please also refer to the PaymentController in sf_event_mgt to see all available PSR-14 Events.
In this example I create the class DERHANSENSfEventMgtMypaymentmethodPaymentMypaymentmethod and add
the following method.:
/**
* Adds required HTML (for redirection) to the given values-array
*
* @param array $values
* @param bool $updateRegistration
* @param \DERHANSEN\SfEventMgt\Domain\Model\Registration $registration
* @param ActionController $pObj
* @return void
*/publicfunctionrenderRedirectView(&$values, &$updateRegistration, $registration, $pObj){
$pluginSettings = $this->getPluginSettings();
/** @var \TYPO3\CMS\Fluid\View\StandaloneView $view */
$view = $this->objectManager->get('TYPO3\\CMS\\Fluid\\View\\StandaloneView');
$view->setFormat('html');
$view->setLayoutRootPaths($pluginSettings['view']['layoutRootPaths']);
$view->setPartialRootPaths($pluginSettings['view']['partialRootPaths']);
$view->setTemplateRootPaths($pluginSettings['view']['templateRootPaths']);
// @todo - e.g. call payment providers API to initialize payment//// Make sure to multiply the price with the given amount of depending registrations//// Depending on the payment provider you may receive a redirection URL or a token// which can be passed to the standalone view.
$view->assignMultiple([
'settings' => $pluginSettings['settings'],
]);
$values['html'] = $view->render();
}
Copied!
Replace the @todo section with your own code. The returned view should include some text
and at least the link for the redirection. In order process automatic redirection, the
view could include a JavaScript redirect to the payment providers payment page.
5. Implement methods
Step 4 already showed how to implement one action. Feel free to implement other required
actions (at least success, failure and cancel to your need.
Each PSR-14 Event enables you to update the given registration. Just set the properties of the
$registration object and set $updateRegistration to true.
It is also possible to remove a registrations, if payment failed or was cancelled. Please
see the corresponding PSr-14 Events for possible options.
6. cHash in generated links
All links created in PaymentController will automatically have a cHash added by TYPO3.
This should be ok for most scenarios, but sometimes the payment provider will append GET
parameters to links (e.g. successUrl or failureUrl), which then leads to the situation,
that the TYPO3 cHash check fails.
Since all Payment actions are uncached and the registration GET parameter is checked
using a HMAC, the cHash can manually be removed from generated URLs by implementing
the ProcessPaymentInitializeEvent PSR-14 event.
7. Security conciderations
Make sure that your rendered Fluid standlone views do not contain sensitive data or possibilities
for Cross Site Scripting (XSS) (values['html'] is rendered with f:render.raw).
FAQ
The event detail page shows a 404 error
This problem can occur in TYPO3 versions greater than 9.5.17 or 10.4.2 when the TYPO3 website has multiple
sites that use a shared folder for events. If this is the case, you must configure unique slug handling
in the extension settings slugBehaviour.
Why do you not include a nice CSS stylesheet?
Because you normally customize templates/stylesheets to your needs. Therefore the
extension just comes with a rudementary CSS stylesheet available in
EXT:Resources/Public/Css/events_default.css which must be included manually like
shown below:
Is it possible to extend events/registrations with own fields?
Yes, since version 3.0 of the extension, you can add additional Registration field on event basis.
You can also extend sf_event_mgt with own fields (e.g. new fields for Event). I have created a demo extension,
which shows how to add new fields to the event and registration domain model.
This only works, if you create links with f:link.action as shown above. If you want to display the
categories in a select-box, then I suggest you create a CSS only select box (e.g. UL menu)
When does {event.registrationPossible} return TRUE
For each event, the attribute registrationPossible returns TRUE or FALSE, if registration for
the event is possible. TRUE is returned, when all conditions below are fulfilled:
Registration option is activated for the event
Max participants is not reached (if max. participants > 0) or max participants is not reached and waitlist is enabled
Date set at registration deadline is not reached
Startdate of event is not reached
Startdate of registration is reached (if set)
Why does the extension not support recurring events?
The user registration is one of the main features of the extension and it requires, that every event is unique in order
to save registrations for a particular event. This makes it impossible to only have one event record, that has multiple
recurrences.
Since there is no smart way to add recurring events to the extension without making it more complex and harder to
maintain, this feature will not make it into the extension.
How can I disable double opt in for event registration?
You can enable autoConfirmation for new registrations as described in the TypoScript reference section.
With autoConfirmation enabled, new registrations will automatically be confirmed and the user
will not receive a confirmation email.
How does the simultaneous registration process work?
If the field "Max. simultaneous registrations per user" is set to a value greater than 1 for the given
event, a user is able to create multiple registrations at once. If the user in the registration view
chooses to create more than one registration, there will be created the given amount of registrations
in the backend for the user. All fields (e.g. firstname, lastname, email) will contain the same values.
The first registration saved is the "main registration", and all other registrations saved later will
depend on the "main registration". All "dependent registrations" will automatically get the option
"No email notifications" set to true, so custom notifications are only sent to the email address
of the "main registration".
If automatic confirmation is turned off (default), the user has to confirm the registration by clicking
a link in the confirmation email. When the user confirms the registration, all "dependent registrations"
of the "main registration will automatically also be confirmed.
How can I set a default currency?
You can set default values for many fields in TYPO3 by using TCAdefaults. To set a default value for the
currency field, add the following to the Page TSConfig, which sets € as the default currency for new records:
How to make the field "Accept terms and conditions" mandatory
The field "Accept terms and conditions" is part of the registration domain model, but it is not required
during registration. To make the field required, add the field to the list of required field like shown below:
You can override all language files with your own translations/labels. As an example, the following code
overrides/extends the locallang_db.xlf and the locallang.xlf
Add this example code to a ext_localconf.php file (e.g. in a site package extension).:
How can I use the overwriteDemand feature for the search view
It is also possible to use the overwriteDemand feature for the search view in order to limit the
events that the search result includes. If you for example wish to limit the search to a special
category, you must pass the category UID as shown below (the value field contains the category UID).:
Native pagination is not supported for the searchview, since besides GET parameters
also POST parameters need to be considered in order to render the pagination. Although
it technically would be possible to implement this feature, it will not be includes
in the extension as it is a suboptimal solution (search word as dynamic GET parameter).
If you need a paginated search for events, it is recommended to use a search extension
(e.g. ext:ke_search or ext:solr).
How does the payment process work
For each event with registration enabled, you can also enable payment. If payment is enabled, you can output
available payment methods for the event in the registration form. When a user registers for an event, he
can select a payment method.
The extension comes with 2 default payment methods debit and transfer. Both payment methods do not include
any further payment processing.
It is possible to extend the extension with own payment methods that include further payment processing (e.g. by
an external payment provider).
For more information on how to add custom payment methods, see Payment section
The default payment methods are missing
Open the extension settings in the extension manager and press the "Save" button.
Configured price options do not show up in frontend
Make sure that the date for the price option is valid. Also make sure, that you use {event.currentPrice} in your
Fluid template to output the current price.
How can I use the iCalDownload action in the Listview?
With the following Fluid snippet, you can use the iCalDownload in the listview:
Note, that you have to set the pageUid to a page with the detail view plugin.
Why does the next/previous month links not work for the calendar view?
The next/previous links use the overwriteDemand feature, which by default is disabled. Make sure you have
unchecked the Disable overwrite demand setting in the plugin.
The category filter for the list view does not work
The filtering also uses the overwriteDemand feature, which by default is disabled. Make sure you have
unchecked the Disable overwrite demand setting in the plugin and also ensure that the category mode is not
equal to Ignore category selection.
How do I show the event title as page title on the detail page?
Either use the TYPO3 PageTitle API or you can use the title-ViewHelper of this extension.
How do I set the indexed search title for an event?
Use the title-ViewHelper of this extension.
The Payment Plugin throws exception about missing default controller
The page with the Payment Plugin shows the following error:
The default controller for extension "SfEventMgt"and plugin "Pipayment" can not be determined. Please check for TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin() in your ext_localconf.php
Copied!
Please delete the content element with the Payment Plugin and create a blank content element of type "Plugin" and
next directly select the Payment Plugin from the plugins select box.
If the plugin originally was a plugin with Flexform settings and switchableControllerActions, those settings
will remain in the database field pi_flexform and lead to the described error.
How can I move registrations on the waitlist automativally up, if a registered user cancels a registration?
Since version 5.2.0 there is a simple and default waitlist move up process. Please refer to the documentation
section about the Default waitlist move up process for further information.
If the default move up process does not fulfill your needs, you can use the PSR-14 Event WaitlistMoveUpEvent
to implement your own move up logic.
Event registrations get confirmed by search engines
Under certain conditions with extensions that create sitemaps it may happen, that a confirmation link of a
registration email gets added to the sitemap and afterwards visited by a search engine crawler.
This behavior has at least been seen when the extension metaseo has been used to create a sitemap.
In order to avoid the registration link from being added to the sitemap, the page with the
registration plugin needs to be excluded from the sitemap, i.e. use "Exclude from sitemap" in the page
settings or by other means (e.g. blacklist in EXT:metaseo).
Displaying events using the "Insert Record" content element
If you display events using the "Insert Record" content element, you may want to use a different layout to display
the event detail view. For this purpose, you can use {settings.detail.isShortcut} in the Detail.html Fluid
Template to render a different layout.
How can I display JSON-LD data for events?
If you want to to display JSON-LD data for events in the event detail view, you can add an own partial including
the JSON-LD data you need. Since requirements of data in JSON-LD may vary per project, sf_event_mgt does not ship
with a partial or ViewHelper to create such data.
Example Partial Code (will work until Fluid < 3.0):
Note: When using Fluid, always make sure to escape variables properly.
As an alternative, you could create an own ViewHelper which generates the required JSON-LD data.
Images for categories are not shown in the frontend?
Categories in TYPO3 backend do not have an image by default. The TYPO3 extension ext:news
by Georg Ringer adds additional fields (e.g. an image-field) to the category domain model.
If you want ext:sf_event_mgt to use the category domain model of ext:news, the category domain model
of ext:sf_event_mgt needs to be overridden as shown below:
Add this to an extension (e.g. your sitepackage) in ext_localconf.php:
Editing events is very slow having a huge amount of registrations. Can this be fixed?
Short answer: No, not really. For TCA inline fields, TYPO3 will load all data before opening the records
in the backend. So having an event with 1500 registrations will actually load all registrations before
showing the edit form for the event in the TYPO3 backend. Note, that just disabling the field "registration"
by TCA will not work, since TYPO3 will load the data anyway.
In order to make it at least possible to edit the event data, the extension makes it possible to hide all
registration inline fields and prevent TYPO3 from loading all data when a configurable limit of registrations
is reached per event.
How can I show and browse the event calendar by weeks?
The calendar view is able to show events by week or by month. The default template
contains the markup for the month view including links to browse to the previous
and next month.
In order to show events by week, it is recommended to create a new template layout
for the calendar view and next to use the fluid variable {weekConfig} to
show events for the current week and to create previous and next week links. The
default template includes an example, which is surrounded by <f:comment>
Known Problems
The extension does not (and will never) support recurring events. See FAQ for more information.
It is not possible to translate emails sent by the extension
Prior to version 4.1.0 of the extension, the iCal download does not work, when
$TYPO3_CONF_VARS['FE']['compressionLevel'] is set to a value > 0 - https://forge.typo3.org/issues/69223
It is at least required to execute the "Migrate plugins and settings" update wizard
and to apply database migrations.
Note, that manual changes (at least to existing templates) is required. For further
information please refer to the change log.
5.1.0
This version contains a breaking change which might affect users who either extended the notification module with custom
code (e.g. by xclass) or who use NotificationService::sendUserMessage() in own code.
If you have restricted the events in the plugin by category, you need to define the "category mode" by opening the
plugin settings and configuring the category mode. The default value of the "category mode" is to ignore the
category selection, so a category selection from a previous version of the extension would be ignored now!
Youtube embed field
The Youtube embed field has been removed. If you want to add a Youtube video to an event, use the TYPO3 core
functionality to add media items to the "files" field of an event.
2.0.0
Flexform restructuring
Due to restructuring of the Flexform settings of the event plugin, it is required to run the update
script of the extension, so existing Flexform settings (e.g. listPid, detailPid, ...) will be migrated
to the new structure. Please use the update script in the extension manager to process the
migration as shown below.
Please click on the update-icon to start the category migration.
Detail-page image-width and height
The following TypoScript needs to be migrated manually.
Please also update your Fluid templates, if you use the variables that changed.
1.5.0
The removal of the local category system requires the execution of a migration script, so existing
categories will get migrated to sys_category entries. Please use the update script in the extension
manager to process the migration as shown below.
Please click on the update-icon to start the category migration.
1.2.0
Due to the new cancellation-option for registrations, you need update all plugins, which are
configured to display "Registration" in the "What to display" section. Just open the plugin for edit
and select "Registration" in the "What to display"-selectbox.
We migrated an instance from EXT:seminars v2.1 to EXT:sf_event_mgt v4.3
What's included?
Events
Registrations
Categories
Locations (multiple => single)
Organizers (multiple => single)
Speaker
We also migrated event types and target groups. The sql queries are basically the same like the category queries. You will need two more category fields in tx_sfeventmgt_domain_model_event for them.
SQL queries
We are starting with a fresh install of sf_event_mgt so we can use ids mostly 1 to 1.
/* Organizers */
INSERT INTO tx_sfeventmgt_domain_model_organisator (uid,pid,name,email,email_signature)
SELECT
uid,
pid,
title,
email,
email_footer,
FROM
tx_seminars_organizers
WHERE
deleted = 0;
/* Locations */
INSERT INTO tx_sfeventmgt_domain_model_location (uid,pid,title,address,city,description)
SELECT
uid,
pid,
title,
address,
city,
directions
FROM
tx_seminars_sites
WHERE
deleted = 0;
/* Speakers */
INSERT INTO tx_sfeventmgt_domain_model_speaker (uid,pid,name,description)
SELECT
uid,
pid,
title,
description
FROM
tx_seminars_speakers
WHERE
deleted = 0;
/* Description of speakers */
UPDATE tx_sfeventmgt_domain_model_speaker
SET
description = (
SELECT
CONCAT(
IF (organization!='', CONCAT(organization, '<br>'), ''),
IF (homepage!='', CONCAT('<a href="', homepage,'">', homepage, '</a><br>'), ''),
IF (email !='', CONCAT('<a href="mailto:', email, '">', email, '</a><br>'), ''),
description
)
FROM
tx_seminars_speakers
WHERE
tx_sfeventmgt_domain_model_speaker.uid = tx_seminars_speakers.uid
);
/* Events */
INSERT INTO tx_sfeventmgt_domain_model_event (
uid,
pid,
hidden,
title,
teaser,
description,
startdate,
enddate,
registration_deadline,
cancel_deadline,
enable_cancel,
location,
room,
speaker,
price,
enable_registration,
unique_email_check,
max_participants,
registration,
enable_autoconfirm,
enable_waitlist,
notify_organisator
)
SELECT
uid,
pid,
hidden,
title,
teaser,
CONCAT(
IF (
subtitle!='',
CONCAT(
'<h2>',
subtitle,
'</h2>'
),
''
),
description,
additional_information
),
begin_date,
end_date,
deadline_registration,
deadline_unregistration,
1, /* Enable cancellation */
place,
room,
speakers,
price_regular,
needs_registration,
IF(
allows_multiple_registrations = 1,
'0',
'1'
),
attendees_max,
registrations,
1, /* auto confirm registration */
queue_size,
1 /* notify organisator on new registration */
FROM tx_seminars_seminars
WHERE
deleted = 0 AND
(end_date = 0 OR end_date >= UNIX_TIMESTAMP()); /* filter out past events */
/* Events <=> Locations */
UPDATE tx_sfeventmgt_domain_model_event
SET location = (
SELECT
uid_foreign
FROM
tx_seminars_seminars_place_mm
WHERE
tx_sfeventmgt_domain_model_event.uid = tx_seminars_seminars_place_mm.uid_local
LIMIT 1 /* seminars has multiple locations, this extension has only a single location */
);
/* Events <=> Speaker */
INSERT INTO tx_sfeventmgt_event_speaker_mm (uid_local,uid_foreign,sorting)
SELECT
uid_local,
uid_foreign,
sorting
FROM tx_seminars_seminars_speakers_mm
WHERE
uid_local IN (SELECT uid FROM tx_sfeventmgt_domain_model_event);
/* Events <=> Organizers */
UPDATE tx_sfeventmgt_domain_model_event
SET organisator = (
SELECT
uid
FROM tx_seminars_organizers
LEFT JOIN tx_seminars_seminars_organizers_mm
ON
tx_seminars_seminars_organizers_mm.uid_foreign = tx_seminars_organizers.uid
WHERE
tx_seminars_seminars_organizers_mm.uid_local = tx_sfeventmgt_domain_model_event.uid AND
tx_seminars_organizers.deleted = 0
ORDER BY
sorting ASC
LIMIT 1 /* seminars has multiple organizers, this extension only a single organizer */
);
/* Categories */
INSERT INTO sys_category (uid,pid,title,parent)
SELECT
uid + 10000, /* bigger than your highest category uid */
pid,
title,
823 /* Parent category for our event categories */
FROM
tx_seminars_categories
WHERE
deleted = 0;
/* Events <=> Categories */
INSERT INTO sys_category_record_mm (uid_local,uid_foreign,tablenames,fieldname)
SELECT
uid_foreign + 10000,
uid_local,
'tx_sfeventmgt_domain_model_event',
'category'
FROM tx_seminars_seminars_categories_mm
WHERE
tx_seminars_seminars_categories_mm.uid_local IN (SELECT uid FROM tx_sfeventmgt_domain_model_event);
/* Registrations */
INSERT INTO tx_sfeventmgt_domain_model_registration (
uid,
pid,
hidden,
tstamp,
crdate,
fe_user,
`event`,
waitlist,
notes,
firstname,
lastname,
email,
confirmed,
amount_of_registrations
)
SELECT
uid,
pid, /* Your need to make sure registrations the same pid as event records (Inline relation) */
hidden,
tstamp,
crdate,
`user`,
seminar,
registration_queue,
CONCAT(
IF (attendees_names!='', CONCAT('Weitere Namen:\n',attendees_names,'\n\n'), ''),
IF (interests!='', CONCAT('Interessen:\n',interests,'\n\n'), ''),
IF (expectations!='', CONCAT('Erwartungen:\n',expectations,'\n\n'), ''),
IF (background_knowledge!='', CONCAT('Vorkenntnisse:\n',background_knowledge,'\n\n'), ''),
IF (known_from!='', CONCAT('Wie haben Sie von dieser Veranstaltung erfahren?\n',known_from,'\n\n'), ''),
IF (notes!='', CONCAT('Sonstiges:\n',notes,'\n\n'), '')
),
fe_users.first_name,
fe_users.last_name,
fe_users.email,
1,
seats
FROM tx_seminars_attendances
LEFT JOIN fe_users
ON fe_users.uid=tx_seminars_attendances.user
LEFT JOIN tx_seminars_seminars ON
tx_seminars_seminars.uid = tx_seminars_attendances.seminar
WHERE
tx_seminars_attendances.deleted = 0 AND
tx_seminars_seminars.deleted = 0 AND
tx_seminars_attendances.seminar IN (
SELECT
uid
FROM
tx_sfeventmgt_domain_model_event
);
Copied!
Reference to the headline
Copy and freely share the link
This link target has no permanent anchor assigned.The link below can be used, but is prone to change if the page gets moved.