Frontend User Registration: Multipurpose configurable registration 

Extension Key

sf_register

Package name

evoweb/sf-register

Version

main

Language

en

Author

Sebastian Fischer

License

This document is published under the Open Publication. license.

Rendered

Sun, 14 Dec 2025 14:15:49 +0000

Copyright

2010-2024


Offers the possibility to register and maintain the fe_user data in frontend by the user self.

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


Table of Contents:

Introduction 

This Documentation was written for version 13.0.0 of the extension.

What does it do? 

Registration with admin review and all notifications 

When a new user fills in the registration form they will see the strength of their password, along with additional email address and password fields to ensure they are filled in correctly.

Upon submitting the form, the user will have their data presented to them for review, just in case they want to change something. If the user submits again, the data is then stored in the database with a temporary usergroup. Any uploaded pictures are stored in a temporary folder until the user is activated.

The user is then sent an email with a link to verify their email address. The website administrator also receives an email to notify them that a new user has registered.

Once the user has verified their email address, the admin will be sent another notification, but this time containing an activation link. If the admin decides to accept the new user, they can click the link which will then update the database and set a regular usergroup for that user's account. One final email notification is sent to the user to inform them that their account is now active.

The new user will be able to log in and see all the pages and content that their usergroup permits!

Features 

  • Simple frontend user registration
  • uses extbase and fluid
  • admin review optional
  • email notification to users after each step
  • email notification to admin after each step
  • password strength indicator without javascript library
  • localisation support by static info tables
  • daylight saving support
  • respect AGB checkbox included
  • Captcha integration
  • email as username supported
  • required fields validator and some more validators out of the box
  • edit profile
  • change password
  • change frontend view for every form and registration step
  • english and german localisation included
  • mechanism to avoid profile images as file transfer by encrypted filenames and storage in temporary folders
  • saltedpassword encryption (if activated) or sha1- and md5 encryption support
  • configuration by TypoScript – customize to your needs

Screenshots 

*Illustration 1: simple register form with recaptcha*
*Illustration 2: extensive register form with sr\_freecap*

Users manual 

Here you get information on how to use the content element

Changing sorting of fields 

To change the order of fields its not necessary to edit the html template. It could be either done via TypoScript (which needs administrativ rights) or by the editor alone.

For an editor its as easy as selecting the fields in the plugin and then order them in the field selection. The screenshot below shows the select field.

Screenshots 

Illustration 1: field with which form fields are selectable and sortable

Administration 

  • install the extension with composer

    shell
    composer req evoweb/sf-register
    Copied!
  • install a compatible captcha extension of your choice

    shell
    composer req evoweb/recaptcha
    // or
    composer req sjbr/sr-freecap
    Copied!
  • install static-info-tables

    shell
    composer req sjbr/static-info-tables
    Copied!
  • include the static template, since TYPO3 13 its possible to use one of the two available SiteSets instead.
  • create a sysfolder to store the user data
  • create two fe_usergroups inside this sysfolder
  • use the Constants Editor to configure the extension. If you use a SiteSet instead of TypoScript static template, you need to use 'Site Management > Settings' instead
  • create a page for register, insert a "Registration: Create user" content element

    • record storage must include the sysfolder with your user data
  • create a page to edit the profile, insert a "Registration: Edit user" content element

    • limit the access to the usergroup the user gets after activation
    • record storage must include the sysfolder with your user data
  • create a page to change the password, insert a "Registration: Change password" content element

    • limit the access to the usergroup the user gets after activation
    • record storage must include the sysfolder with your user data

Configuration 

More complex configuration 

Table of content 

Integrate other captcha extension 

You have to write a captcha adapter for this purpose. You find the adapters here in vendor/evoweb/sf-register/Classes/Services/Captcha. Your class should extend \Evoweb\SfRegister\Services\Captcha\AbstractAdapter. The functions render() and isValid() are required for the adapter to work.

Write own validators 

You can write your own validator. Validators are stored in vendor/evoweb/sf-register/Classes/Domain/Validator extends class \TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator and require the function isValid().

Settings 

plugin.tx_sfregister.settings.*

badWordList

badWordList
Type
string
Default
god, sex, password

Comma separated list of word, that validator badWordFilter will avoid

redirectPostRegistrationPageId

redirectPostRegistrationPageId
Type
integer

Redirect page after registration

redirectPostActivationPageId

redirectPostActivationPageId
Type
integer

Redirect page after activation

useEmailAddressAsUsername

useEmailAddressAsUsername
Type
boolean

Use email address as username

useEncryptedFilename

useEncryptedFilename
Type
integer
Default
0

Encrypt filenames

  • 0 none
  • 1 md5
  • 2 sha1

autologinPostRegistration

autologinPostRegistration
Type
integer

Log in user after registration

autologinPostConfirmation

autologinPostConfirmation
Type
integer

Log in user after activation

usergroupPostSave

usergroupPostSave
Type
integer

Frontend usergroup after registration

usergroupPostConfirm

usergroupPostConfirm
Type
integer

Frontend usergroup after activation

usergroup

usergroup
Type
integer

Frontend usergroup after activation

captcha.jmrecaptcha

captcha.jmrecaptcha
Type
string
Default
\Evoweb\SfRegister\Services\Captcha\JmRecaptchaAdapter

Adapter for Captcha-Extension jm_recaptcha

captcha.srfreecap

captcha.srfreecap
Type
string
Default
\Evoweb\SfRegister\Services\Captcha\SrFreecapAdapter

Adapter for Captcha-Extension sr_freecap

Persistence 

plugin.tx_sfregister.persistence.*

Name Type Default
integer

storagePid

storagePid
Type
integer

Sysfolder with Frontend User records

Emails 

Notify admin create properties 

notifyAdminPostCreateSave

notifyAdminPostCreateSave
Type
boolean
Default
0

Defines wether the admin should get an email after the user saved the registration

notifyAdminPostCreateConfirm

notifyAdminPostCreateConfirm
Type
boolean
Default
0

Defines wether the admin should get an email after the user confirmed the registration

notifyAdminPostCreateRefuse

notifyAdminPostCreateRefuse
Type
boolean
Default
0

Defines wether the admin should get an email after the user refused the registration

notifyAdminPostCreateAccept

notifyAdminPostCreateAccept
Type
boolean
Default
0

Defines wether the admin should get an email after the admin accepted the registration

notifyAdminPostCreateDecline

notifyAdminPostCreateDecline
Type
boolean
Default
0

Defines wether the admin should get an email after the admin declined the registration

acceptEmailPostCreate

acceptEmailPostCreate
Type
boolean
Default
0

Defines wether the admin need to accept the registration

Notify admin edit properties 

Name Type Default
boolean 0
boolean 0
boolean 0
boolean 0

notifyAdminPostEditSave

notifyAdminPostEditSave
Type
boolean
Default
0

Defines wether the admin should get an email after the user saved the changes

notifyAdminPostEditConfirm

notifyAdminPostEditConfirm
Type
boolean
Default
0

Defines wether the admin should get an email after the user confirmed the email change

notifyAdminPostEditAccept

notifyAdminPostEditAccept
Type
boolean
Default
0

Defines wether the admin should get an email after the user accepted the email change

acceptEmailPostEdit

acceptEmailPostEdit
Type
boolean
Default
0

Defines wether the admin need to accepted the email change

Notify user create properties 

notifyUserPostCreateSave

notifyUserPostCreateSave
Type
boolean
Default
0

Defines wether the user should get an email after the user saved the registration

notifyUserPostCreateConfirm

notifyUserPostCreateConfirm
Type
boolean
Default
0

Defines wether the user should get an email after the user confirmed the registration

notifyUserPostCreateRefuse

notifyUserPostCreateRefuse
Type
boolean
Default
0

Defines wether the user should get an email after the user refused the registration

notifyUserPostCreateAccept

notifyUserPostCreateAccept
Type
boolean
Default
0

Defines wether the user should get an email after the admin accepted the registration

notifyUserPostCreateDecline

notifyUserPostCreateDecline
Type
boolean
Default
0

Defines wether the user should get an email after the admin declined the registration

confirmEmailPostCreate

confirmEmailPostCreate
Type
boolean
Default
0

Defines wether the user need to confirm the registration

Notify user edit properties 

Name Type Default
boolean 0
boolean 0
boolean 0
boolean 0

notifyUserPostEditSave

notifyUserPostEditSave
Type
boolean
Default
0

Defines wether the user should get an email after the user saved the changes

notifyUserPostEditConfirm

notifyUserPostEditConfirm
Type
boolean
Default
0

Defines wether the user should get an email after the user confirmed the email change

notifyUserPostEditAccept

notifyUserPostEditAccept
Type
boolean
Default
0

Defines wether the user should get an email after the user accepted the email change

confirmEmailPostEdit

confirmEmailPostEdit
Type
boolean
Default
0

Defines wether the user need to confirm the email change

Address and subject properties 

sitename

sitename
Type
string
Default
dummy Site

Page Title for email subject

userEmail.fromName

userEmail.fromName
Type
string
Default
userEmail from

Name used as from for email to user

userEmail.fromEmail

userEmail.fromEmail
Type
string
Default
userEmailfrom@test.local

Email used as from for email to user

userEmail.replyName

userEmail.replyName
Type
string
Default
userEmail reply

Name used as reply for email to user

userEmail.replyEmail

userEmail.replyEmail
Type
string
Default
userEmailreply@test.local

Email used as reply for email to user

adminEmail.toName

adminEmail.toName
Type
string
Default
adminEmail to

Name used as recipient for email to admin

adminEmail.toEmail

adminEmail.toEmail
Type
string
Default
adminToEmail@test.local

Email used as recipient for email to admin

adminEmail.fromName

adminEmail.fromName
Type
string
Default
adminEmail from

Name used as from for email to admin

adminEmail.fromEmail

adminEmail.fromEmail
Type
string
Default
adminEmailfrom@test.local

Email used as from for email to admin

adminEmail.replyName

adminEmail.replyName
Type
string
Default
adminEmail reply

Name used as reply for email to admin

adminEmail.replyEmail

adminEmail.replyEmail
Type
string
Default
adminEmailreply@test.local

Email used as reply for email to admin

Validation 

Purpose of Validators 

Validators are a mechanism to ensure that all information given by the user meet your expectation as an admin. Either if the values make sense in terms of format like emails oder in required information value like age verification.

If values need to be enforce your should use the RequiredValidator because this validator does not only check if the value of the configured field is filled but it also serves as a signal for the Required Partial to render the corresponding flag.

All validators are optional, could be set single or may be even assigned multiple times to a field. Despite the concept of extbase you are free to choose how many validators should take care of a value.

Changes since version 9.0.0 

Since version 9 validators are only used for selected fields, it's not necessary to remove validation configuration only because certain fields should not be present in the form.

In general the pattern for a validation rule is

"name", options={"parameter1": valueA, "parameter2": valueB}
Copied!

The name needs to be quoted followed with a comma if options are following. Then the options with an equal sign and json notated properties and values.

Different possibilities of assigning validators 

In case you want to have no validation at all for a field was was configured by default as required you need to empty the associated validators. Look at the example given where the validators of the email gets removed.

Remove validators 

EXT:site_package/Configuration/TypoScript/setup.typoscript
plugin.tx_sfregister.settings.validation.create.email >
Copied!

Assign only one validator 

If only one validator is needed you could assign it directly to the field like below.

EXT:site_package/Configuration/TypoScript/setup.typoscript
plugin.tx_sfregister.settings.validation.create.passwordRepeat = "Evoweb\SfRegister\Validation\Validator\RepeatValidator"
Copied!

Assign multiple validators 

And finally it's possible to have multiple validators for one field like in the next example.

EXT:site_package/Configuration/TypoScript/setup.typoscript
plugin.tx_sfregister.settings.validation.create.password {
    1 = "Evoweb\SfRegister\Validation\Validator\RequiredValidator"
    2 = "Evoweb\SfRegister\Validation\Validator\BadWordValidator"
}
Copied!

Regarding validator it's possible to have values attached to the assigned one. This is beneficial if you want to check against conditions that are not equal in different cases. One point where this is shown best with is the length of passwords. One would like to keep it simple as possible because the loss would be nearly not existing while another would prefer the passwords stronger than for Fort Knox.

Poor man´s passwords with short length 

EXT:site_package/Configuration/TypoScript/setup.typoscript
plugin.tx_sfregister.settings.validation.create.password {
    1 = "Evoweb\SfRegister\Validation\Validator\RequiredValidator"
    2 = "StringLength", options={"minimum": 4, "maximum": 8}
}
Copied!

Bulletproof passwords with long length 

EXT:site_package/Configuration/TypoScript/setup.typoscript
plugin.tx_sfregister.settings.validation.create.password {
    1 = "Evoweb\SfRegister\Validation\Validator\RequiredValidator"
    2 = "StringLength", options={"minimum": 8, "maximum": 40}
    3 = "Evoweb\SfRegister\Validation\Validator\BadWordValidator"
}
Copied!

In total you have five possible combination of validator assignments for each field that you use in your form. You have none, one and multiple validators. And in case of a validator present you can add options too override the default that is set in the validator.

Separate validators per process 

Each process has its own needs. While you want to have the username validated on creation, this is not needed in the edit or password change form. This could be achieved by separating the TypoScript settings in different conditions per page. But this is mostly inconvenient as you don't see what settings is met until the condition. Because of this the validation settings are split for any process.

EXT:site_package/Configuration/TypoScript/setup.typoscript
plugin.tx_sfregister.settings.validation {
    create {
        [...]
    }
    edit {
        [...]
    }
    password {
        [...]
    }
    invite {
        [...]
    }
}
Copied!

Special validators 

The UserValidator is not meant to be used for field validation. This validator is a special construct to make the configuration via TypoScript possible. All others are free to combine. If a validator is only suited for a certain field it will be mentioned in the detail configuration.

Custom validators 

You can use your own validators. Just code your validator and make it available for auto loading (either in an extbase standard path or via ext_autoload.php). Afterwards you are ready to use your validator like in the following example.

Custom validator usage 

EXT:site_package/Configuration/TypoScript/setup.typoscript
plugin.tx_sfregister.settings.validation.create.password = "Evoweb\SfRegister\Validation\Validator\RequiredValidator"
Copied!

Available validators 

Beside the validators that come with extbase and which are although available in the different processes, the registration come with a set of specific ones that are tailored to the special need. The following lists all validators which are suited for the usage on fields.

Name Type Default
string god, sex, password
string
string
string 0-mail.com, 027168.com, 0815.ru, mail.ru, bk.ru, list.ru

BadWordValidator

BadWordValidator
Type
string
Default
god, sex, password
Configured in
plugin.tx_sfregister.settings.badWordList

Checks if the field contains non of the word in the list is present.

Words to check against are configured in badWordList

IsTrueValidator

IsTrueValidator
Type
string

Checks if the field is set for example the general terms and conditions

RequiredValidator

RequiredValidator
Type
string

This validator serves two purpose. First of check if the field contains a value and that it is not empty. Second the rendering uses this validator as condition to render required sign or not.

BlockDomainValidator

BlockDomainValidator
Type
string
Default
0-mail.com, 027168.com, 0815.ru, mail.ru, bk.ru, list.ru
Configured in
plugin.tx_sfregister.settings.blockDomainList

Check that the email field does not contain any of the words in the list for the domain.

Words to check against are configured in blockDomainList.

Special fields Validators 

CaptchaValidator

CaptchaValidator
Type
string
Default
recaptcha

Checks if the entered value matches the captcha text by using the same captcha adapter like the one used for the rendering. Therefor the option type needs to equal the configuration of the rendering.

Likewise the rendering of the captcha its possible to use custom captchas to validate. How to use create custom is described in Bring in your own captcha

Possible options are:

types

  • srfreecap
  • jmrecaptcha
  • recaptcha

EmptyValidator

EmptyValidator
Type
string

Checks if the field uid is empty to no unauthorized user manipulation could happen.

Specialty: This validator gets auto-assigned to the uid field in the create process

EqualCurrentPasswordValidator

EqualCurrentPasswordValidator
Type
string

This validator is used in the password change process. It compares if the entered old password is equal to the current set password for the account the user is logged in with.

EqualCurrentUserValidator

EqualCurrentUserValidator
Type
string

On edit process it's important that the correct user data get modified. To ensure that the submitted data does not temper the user id. This validator compares the user id send by the form with the user id of the logged in user to prevent and change of the id.

Specialty: This validator gets auto-assigned to the uid field in the edit process

ImageUploadValidator

ImageUploadValidator
Type
string

The image upload validator checks if the file uploaded has an allowed file extension and if the file size is in the allowed max size. Both checks uses system configuration.

config/system/additional.php
// file extension in
$GLOBALS['TCA']['fe_users']['columns']['image']['config']['allowed']
// file size in
$GLOBALS['TCA']['fe_users']['columns']['image']['config']['max_size']
Copied!

UniqueValidator

UniqueValidator
Type
string
Default
0

Checks if the value is unique for the field in the storage folder. If the option 'global' is set a second check for the value in the field is done system wide.

By this you could define that an email address is unique either in the local context or for the complex TYPO3 cms installation. So if you have multiple newsletters that could get registered its ideal to choose only the global = 0 check, so an user could register multiple times.

If the username should be only available once in the system to prevent collisions in authentication you would choose to set globals = 1 .

Possible options are:

global

  • 0 unique only in storage folder
  • 1 unique in the hole installation

RepeatValidator

RepeatValidator
Type
string

To ensure that the input of a user was done without mistake by the user self it's a good idea to have the values entered in two fields and then compare their values. That is possible with this validator.

The fields need to be present with the pattern [fieldName] and [fieldName]Repeat. Where fieldName is free to choose. While Repeat is not configurable by now this validator is only usable for email and password fields.

Extendability 

Use your own flavor of fields 

Since version 8.8.0 its easier then ever to user your own fields. Just add your partial folder via typoscript and register your own field configuration. After that you need to tell the user ts config that the new type is available to be selected in the plugin too.

Fields.typoscript
plugin.tx_sfregister.view.partialRootPaths.50 = EXT:your_extension/Resources/Private/Partials/
plugin.tx_sfregister.settings.fields.configuration {
    your_field_key {
        partial = YourFieldKey
        # @see Feature: #93334 - Translation Domain Mapping
        backendLabel = your_extension.be:your_field_key
    }
}
Copied!
ext_localconf.php
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addUserTSConfig(
    '@import \'EXT:sf_register/Configuration/TypoScript/Fields.typoscript\''
);
Copied!
Setup
@import 'EXT:sf_register/Configuration/TypoScript/Fields.typoscript'
Copied!

By using the same fields file both in typoscript as well as in user ts config. No additional configuration is needed.

In your partials there are the following information available

  • {user} the user object with previous entered values
  • {fieldName} the name of the field in the user object
  • {options} every value that is inside of the field config {partial, backendLabel, etc}
  • {settings} the general plugin settings

Adding custom properties 

Since late the frontend user domain model can be extended. This can be done the extension evoweb/extender which sole purpose is to extend extbase domain models. There is an example on how to use the extender.

If you run into problems extending please be aware that the only solution supported is by the use of 'extender'.

In this example its noteworthy that the last array key is not required but advised. The path to the file matches extension key and extbase compatible path to the domain model.

For highlighting purpose its advised to let the domain model extend from \Evoweb\SfRegister\Domain\Model\FrontendUser

ext_localconf.php
$GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['sf_register']['extender'][
    \Evoweb\SfRegister\Domain\Model\FrontendUser::class
]['site-package'] = 'EXT:site_package/Classes/Domain/Model/FrontendUser.php';
Copied!

Beside extending the domain model with property and get-/set-method a field needs to be created for sql and registered in TCA.

ext_tables.sql
#
# Table structure for table 'fe_users'
#
CREATE TABLE fe_users (
    extending varchar(60) DEFAULT ''
);
Copied!
TCA/Overrides/fe_users.php
$temporaryColumns = [
    'extending' => [
        'exclude' => 1,
        'label' => 'extending',
        'config' => [
            'type' => 'input',
            'readOnly' => TRUE,
        ],
    ],
];

\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('fe_users', $temporaryColumns, 1);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes('fe_users', 'extending');
Copied!

Bring in your own captcha 

By implementing a adapter which is extending the \Evoweb\SfRegister\Services\Captcha\AbstractAdapter you are able to add an own captcha. The adapter now then has to be configured to be usable by adding typoscript settings like the following taken from recaptcha:

Captcha.typoscript
plugin.tx_sfregister.settings {
    # register recaptcha as captcha possibility
    captcha.recaptcha = Evoweb\Recaptcha\Adapter\SfRegisterAdapter

    fields {
        configuration {
            # change captcha field type to recaptcha
            captcha.type = Recaptcha
        }
    }

    validation.create {
        # tell validation to use recaptcha adapter
        captcha = Evoweb\SfRegister\Validation\Validator\CaptchaValidator(type = recaptcha)
    }
}
Copied!

PSR-14 Events 

This kind of event is superseding Hooks and Signal-Slots in TYPO3 and are the way to go. That's why all signals are replaced with their event counterparts.

How to implement a slot 

An overview on how to configure and interact with events was given on the Developer Days in 2019. The detailed example shows how to configure them in the Services.yaml:

YourEventListener.php
use Evoweb\SfRegister\Controller\Event\ProcessInitializeActionEvent;
use TYPO3\CMS\Core\Attribute\AsEventListener;

class YourEventListener
{
    #[AsEventListener('your-extension-identifier', ProcessInitializeActionEvent::class)]
    public function __invoke(ProcessInitializeActionEvent $event): void
    {
    }
}
Copied!

The code above shows how to get an event listener is registered to an event.

Available events 

FeuserController 

Evoweb\SfRegister\Controller\Event\InitializeActionEvent

Evoweb\SfRegister\Controller\Event\InitializeActionEvent
$controller
\Evoweb\SfRegister\Controller\FeuserController
$settings
array
$response
\Psr\Http\Message\ResponseInterface

FeuserCreateController 

Evoweb\SfRegister\Controller\Event\CreateFormEvent

Evoweb\SfRegister\Controller\Event\CreateFormEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Controller\Event\CreatePreviewEvent

Evoweb\SfRegister\Controller\Event\CreatePreviewEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Controller\Event\CreateSaveEvent

Evoweb\SfRegister\Controller\Event\CreateSaveEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Controller\Event\CreateConfirmEvent

Evoweb\SfRegister\Controller\Event\CreateConfirmEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Controller\Event\CreateRefuseEvent

Evoweb\SfRegister\Controller\Event\CreateRefuseEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Controller\Event\CreateAcceptEvent

Evoweb\SfRegister\Controller\Event\CreateAcceptEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Controller\Event\CreateDeclineEvent

Evoweb\SfRegister\Controller\Event\CreateDeclineEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

FeuserDeleteController 

Evoweb\SfRegister\Controller\Event\DeleteFormEvent

Evoweb\SfRegister\Controller\Event\DeleteFormEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Controller\Event\DeleteSaveEvent

Evoweb\SfRegister\Controller\Event\DeleteSaveEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Controller\Event\DeleteConfirmEvent

Evoweb\SfRegister\Controller\Event\DeleteConfirmEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

FeuserEditController 

Evoweb\SfRegister\Controller\Event\EditFormEvent

Evoweb\SfRegister\Controller\Event\EditFormEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Controller\Event\EditPreviewEvent

Evoweb\SfRegister\Controller\Event\EditPreviewEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Controller\Event\EditSaveEvent

Evoweb\SfRegister\Controller\Event\EditSaveEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Controller\Event\EditConfirmEvent

Evoweb\SfRegister\Controller\Event\EditConfirmEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Controller\Event\EditAcceptEvent

Evoweb\SfRegister\Controller\Event\EditAcceptEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

FeuserInviteController 

Evoweb\SfRegister\Controller\Event\InviteFormEvent

Evoweb\SfRegister\Controller\Event\InviteFormEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Controller\Event\InviteInviteEvent

Evoweb\SfRegister\Controller\Event\InviteInviteEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

FeuserPasswordController 

Evoweb\SfRegister\Controller\Event\PasswordFormEvent

Evoweb\SfRegister\Controller\Event\PasswordFormEvent
$password
\Evoweb\SfRegister\Domain\Model\Password
$settings
array

Evoweb\SfRegister\Controller\Event\PasswordSaveEvent

Evoweb\SfRegister\Controller\Event\PasswordSaveEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

FeuserResendController 

Evoweb\SfRegister\Controller\Event\ResendFormEvent

Evoweb\SfRegister\Controller\Event\ResendFormEvent
$email
\Evoweb\SfRegister\Domain\Model\Email
$settings
array

Evoweb\SfRegister\Controller\Event\ResendMailEvent

Evoweb\SfRegister\Controller\Event\ResendMailEvent
$email
\Evoweb\SfRegister\Domain\Model\Email
$settings
array

Mail 

Evoweb\SfRegister\Services\Event\NotifyAdminCreateAcceptEvent

Evoweb\SfRegister\Services\Event\NotifyAdminCreateAcceptEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyAdminCreateConfirmEvent

Evoweb\SfRegister\Services\Event\NotifyAdminCreateConfirmEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyAdminCreateDeclineEvent

Evoweb\SfRegister\Services\Event\NotifyAdminCreateDeclineEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyAdminCreateRefuseEvent

Evoweb\SfRegister\Services\Event\NotifyAdminCreateRefuseEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyAdminCreateSaveEvent

Evoweb\SfRegister\Services\Event\NotifyAdminCreateSaveEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyAdminDeleteConfirmEvent

Evoweb\SfRegister\Services\Event\NotifyAdminDeleteConfirmEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyAdminDeleteSaveEvent

Evoweb\SfRegister\Services\Event\NotifyAdminDeleteSaveEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyAdminEditAcceptEvent

Evoweb\SfRegister\Services\Event\NotifyAdminEditAcceptEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyAdminEditConfirmEvent

Evoweb\SfRegister\Services\Event\NotifyAdminEditConfirmEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyAdminEditSaveEvent

Evoweb\SfRegister\Services\Event\NotifyAdminEditSaveEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyAdminInviteInviteEvent

Evoweb\SfRegister\Services\Event\NotifyAdminInviteInviteEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyAdminResendMailEvent

Evoweb\SfRegister\Services\Event\NotifyAdminResendMailEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyUserCreateAcceptEvent

Evoweb\SfRegister\Services\Event\NotifyUserCreateAcceptEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyUserCreateConfirmEvent

Evoweb\SfRegister\Services\Event\NotifyUserCreateConfirmEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyUserCreateDeclineEvent

Evoweb\SfRegister\Services\Event\NotifyUserCreateDeclineEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyUserCreateRefuseEvent

Evoweb\SfRegister\Services\Event\NotifyUserCreateRefuseEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyUserCreateSaveEvent

Evoweb\SfRegister\Services\Event\NotifyUserCreateSaveEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyUserDeleteConfirmEvent

Evoweb\SfRegister\Services\Event\NotifyUserDeleteConfirmEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyUserDeleteSaveEvent

Evoweb\SfRegister\Services\Event\NotifyUserDeleteSaveEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyUserEditAcceptEvent

Evoweb\SfRegister\Services\Event\NotifyUserEditAcceptEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyUserEditConfirmEvent

Evoweb\SfRegister\Services\Event\NotifyUserEditConfirmEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyUserEditSaveEvent

Evoweb\SfRegister\Services\Event\NotifyUserEditSaveEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyUserInviteInviteEvent

Evoweb\SfRegister\Services\Event\NotifyUserInviteInviteEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\NotifyUserResendMailEvent

Evoweb\SfRegister\Services\Event\NotifyUserResendMailEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\InvitationToRegisterEvent

Evoweb\SfRegister\Services\Event\InvitationToRegisterEvent
$user
\Evoweb\SfRegister\Domain\Model\FrontendUser
$settings
array

Evoweb\SfRegister\Services\Event\PreSubmitMailEvent

Evoweb\SfRegister\Services\Event\PreSubmitMailEvent
$mail
\TYPO3\CMS\Core\Mail\MailMessage
$settings
array
$arguments
array

Templating 

Template for dynamic fields 

Since version 8.8.0 the forms are rendered by partials. Create and Edit form fields are defined in typoscript or selected in the plugin and then rendered by a loop which calls the configured partial per field.

This was made to be able to only change one field alone through modifying the partial.

Additionally its now possible to select the fields needed in the content instead the need to add typoscript for the one page where the registration should be different.

As its not always needed to define your field selection there are some defaults configured out of the box.

Fields/setup.typoscript
plugin.tx_sfregister.settings.fields.defaultSelected {
    create { }
    edit { }
}
Copied!

Word of advise to those that upgrade an existing installation. To make use of this feature in your old templates you need to replace all <div> tags between the form tags with the loop.

Form.html
<f:for each="{settings.fields.selected}" as="selectedField">
    <f:alias map="{options: '{settings.fields.configuration.{selectedField}}'}">
        <f:render
            partial="Form/{options.partial}"
            arguments="{
                user: user,
                fieldName: selectedField,
                options: options,
                settings: settings
            }"/>
    </f:alias>
</f:for>
Copied!

Customize the output 

Per default, all templates are stored in typo3conf/ext/sf_register/Resources/Private/

Copy files you want to modify of the folder into the fileadmin. Don't forget to set the path to this new templates folder with.

Since TYPO3 6.2 its possible to have so called fallback paths for template, partial and layout root paths. By this its not necessary to copy all files of given path any more.

plugin.tx_sfregister.view.templateRootPaths.0 = EXT:sf_register/Resources/Private/Templates/
plugin.tx_sfregister.view.templateRootPaths.1 = EXT:example/Resources/Private/Templates/sf_register/

plugin.tx_sfregister.view.partialRootPaths.0 = EXT:sf_register/Resources/Private/Partials/
plugin.tx_sfregister.view.partialRootPaths.1 = EXT:example/Resources/Private/Templates/sf_register/Partials/

plugin.tx_sfregister.view.layoutRootPaths.0 = EXT:sf_register/Resources/Private/Layouts/
plugin.tx_sfregister.view.layoutRootPaths.1 = EXT:example/Resources/Private/Templates/sf_register/Layouts/
Copied!

In pre and post TYPO3 6.2 version its possible to define a template rootpath in the registration plugin. This gets add/set to the view and used for rendering.

Viewhelper for templates 

Birthdate with three select boxes 

<register:form.rangeSelect start="1" end="31" property="dateOfBirthDay"/>
-
<register:form.rangeSelect start="1" end="12" property="dateOfBirthMonth"/>
-
<register:form.rangeSelect start="1960" end="2011" property="dateOfBirthYear"/>
Copied!
1

Single select with radio buttons 

<f:form.radio property="gender" value="1"/> <f:translate key="gender_1"/>
<f:form.radio property="gender" value="2"/> <f:translate key="gender_2"/>
Copied!
1

Single select as select box 

<f:form.select property="gender" options="{
    1: '{f:translate(key: \'gender_1\')}',
    2: '{f:translate(key: \'gender_2\')}'
}"/>
Copied!
1

Automatic marking of required fields 

<f:render partial="required" arguments="{field: 'gender'}"/>
Copied!

you get the asterix (*) behind your label, if the required validator is active for this field.

Tutorial 

How to setup different registration processes? 

It is possible to have simple registrations like directly activated user accounts as well as complex ones like double optin confirmations with admin acceptance. So if its possible to have different approaches how to set them up?

Simple like peanut butter jelly sandwich 

  • In the Extension Manager

    • install the extension
    • in Extension Settings choose 'minimal' in TypoScript complexity
  • In modul List

    • add a storage folder and remember the storage folder id
    • add a usergroup with name of your choice in this storage folder
    • add a page named Registration
    • in the page page properties on tab Resources select the storage folder in field 'General Record Storage Page'
    • on this page add a plugin type 'Registration for create, edit or delete Frontend Users'
  • In the plugin

    • select 'Create' in the 'What action should be taken?' select box
    • leave the Template root path empty until you know what you do
  • In modul Template

    • choose 'Info/Modify'
    • edit the whole template record
    • add the include static 'Feuser Register [minimal] (sf_register)' and save and close the TypoScript
    • choose the Constant Editor
    • activate and set the remembered usergroup id in the field 'usergroup set if no activation is needed': (the result in constants field is plugin.tx_sfregister.settings.usergroup = 3)

Somewhat like creme bruleé 

Help is needed here, to describe each step.

Your christmas stuffed Turkey 

Help is needed here, to describe each step.

Registration actions 

Possible actions 

The following diagram displays which actions are necessary for a successful registration. Some of them are optional like the confirmation and activation. Some are mandatory to get a valid user to login with.

Screenshots: 

*Illustration 1: Action diagram of registration steps

ChangeLog 

  • Changelog is in the extension files

Breaking Changes 

2025.12.09 

With version 13 site sets with own settings $evoweb.sf-register.settings.* were introduced. These should have override TypoScript constants.

This concept is now discarded in favor for $plugin.tx_sfregister.settings.* which is now also used in the siteSets. Please be aware and migrate them. Most likely its replacing evoweb.sf-register with plugin.tx_sfregister.

2025.01.10 

The breaking change of 2019.01.13 is reverted. Since commit d10e1bc the shorthand notation for validators got deprecated and will be removed in 14.0. So now you need to use the fully qualified classname again.

Required validator:

Before
"Evoweb.SfRegister:Required"
Copied!
After
Evoweb\SfRegister\Validation\Validator\RequiredValidator
Copied!

2024.10.24 

Replace TypoScript condition and plugin.tx_sfregister.settings.minified value with \Evoweb\SfRegister\ViewHelpers\ApplicationContextViewHelper.

Environments are matched with Expression Languages and allow values like:

  • Development
  • Testing
  • Production
  • Production/*
  • Production/Staging

By this one TypoScript condition less gets used, which improves cacheability of pages.

2024.10.23 

The new content element wizards are now not auto registered. If you use one of the two provided SiteSets, the wizards are available in the related tree.

If you use a page tree without a SiteSet, the wizards can be included in the the root page with the page field "Page TSconfig" by selecting the "[Frontend user registration] New content element wizards".

2024.10.22 

Since TYPO3 13.x list_type is deprecated. A upgrade task is provided to convert the plugins from list_type to CType rendering.

2024.10.18 

  • Rename password meter with ID sfrpassword to sfrPassword
  • Fallback for password element <meter> is not supported anymore.

2024.08.31 

  • Extract the modification of the validators to ModifyValidator service. It's still configured the same (via TypoScript) but is handled via service outside of the controller.
  • Replace $controller->controller with $controller->getControllerName()
  • Move change usergroup to FrontendUserGroup service
  • Without injecting FrontenUserGroup into other controller, changing usergroup is only supported in FeuserCreateController.
  • Move getLoggedInUserId, getLoggedInUser, determineFrontendUser, userIsLoggedIn, autoLogin and redirectToPage to FrontendUser service
  • Remove access on context in controller and move it to FrontendUser service

2024.08.26 

Replace SelectStaticCountriesViewHelper with f:form.countrySelect to decouple from EXT:static_info_tables if you only relay on selecting countries.

2024.05.13 

The registration of fields for the field selection in the content elements was moved from ext_localconf.php to user.tsconfig. The consequence is, that extending/overriding fields requires to order the loading of extensions. To achieve this, you need to require sf_register in your composer.json and ext_emconf.php

2022.01.01 

Interface EvowebSfRegisterInterfaceFrontendUserInterface is renamed to EvowebSfRegisterDomainModelFrontendUserInterface

2021.12.31 

Validator configuration is changed. As long as your custom validator has no injected classes like repository or likewise, you do not need to change anything.

If you need something in your validator, you need to use to constructor injection, add an implements of InjectableInterface, make the validator a public service via Services.yaml and need have a way to get the options set. Options can be set by your own method or by using the AbstractValidator of sf_register.

So if you need a class in your validator in code this changes are needed: Add your validator to Services.yaml: Add implements InjectableInterface to your validator Use `\Evoweb\SfRegister\Validation\Validator\AbstractValidator` as validator base Add the repository in constructor

Services.yaml
Evoweb\SfRegister\Validation\Validator\UniqueValidator:
  public: true
Copied!
Class definition
use Evoweb\SfRegister\Validation\Validator\AbstractValidator;
use Evoweb\SfRegister\Validation\Validator\InjectableInterface;

class UniqueValidator extends AbstractValidator implements InjectableInterface, ...
Copied!
__construct
public function __construct(FrontendUserRepository $userRepository)
{
   $this->userRepository = $userRepository;
}
Copied!

2020.04.29 

The hole extension was refactored to make best usage of TYPO3 10 changes. Namely

  • constructor DI
  • exchange Signal/Slot dispatcher with PSR-14 events, have a look in extendability at PSR-14 events
  • refactor to fully match the PSR-12 standard
  • rename TypoScript setting processInitializeActionSignal to processInitializeActionEvent
  • rename TypoScript setting redirectSignal. to redirectEvent.
  • reorganize TypoScript setting createDefaultSelected etc to defaultSelected.create etc
  • reorganize TypoScript notifyUser and notifyAdmin setup and constants to notifyUser. and notifyAdmin.
  • modify Mail service to have better controller and action assignment
  • replace switchableControllerActions with individual plugin per controller check what elements with list_type sfregister_form are present in table tt_content and replace them with their corresponding new plugin
  • change how TS names, templates, mail subject and PSR-14 event name are build based on controller and action name in combination with notifyAdmin and notifyUser TS name is build notifyAdmin.{ControllerName}{ActionName} notifyAdmin.createSave Template name is build NotifyAdmin{ControllerName}{ActionName} NotifyAdminCreateSave Mail subject is build subjectNotifyAdmin{ControllerName}{ActionName} subjectNotifyAdminCreateSave Event name is build NotifyAdmin{ControllerName}{ActionName}Event NotifyAdminCreateSaveEvent PostCreateSave replaced with CreateSave PostCreateConfirm replaced with CreateConfirm PostCreateRefuse replaced with CreateRefuse PostCreateAccept replaced with CreateAccept PostCreateDecline replaced with CreateDecline PostDeleteSave replaced with DeleteSave PostDeleteConfirm replaced with DeleteConfirm PostEditSave replaced with EditSave PostEditConfirm replaced with EditConfirm PostEditAccept replaced with EditAccept SendInvitation replaced with InviteInvite PostResendMail replaced with ResendMail

2019.02.03 

Drop custom form styles in favor for Bootstrap 4.2 styles. Be aware, to get the styles.css from older releases if you depend on it. If you use the Bootstrap 4.2 form styles you are good to go.

2019.02.02 

The password strength meter got replaced with the <meter> element. If you still need the old iframe variant for old browser or for the looks, please override the file EXT:sf_register/Resources/Private/Partials/Form/Password.html in your sitepackage and replace

Before
<iframe id="bargraph" frameborder="none" scrolling="no"
    src="/typo3conf/ext/sf_register/Resources/Public/Images/progressbar.svg"></iframe>
Copied!
After
<meter min="0" low="20" optimum="30" high="40" max="50" id="bargraph"></meter>
Copied!

2019.01.17 

The core changed away from saltedpasswords towards integrated passwordHashing in EXT:Core (see Deprecation: #85804 - Salted password hash class deprecations)

By this its always possible to properly hash passwords.

Due to this shift the support for md5 and sha1 configuration is dropped in EqualCurrentPasswordValidator::isValid and FeuserController::encryptPassword.

2015.11.15 

  • Method changeUsergroup got pulled up from FeuserCreateController to FeuserController. If a controller extends FeuserCreateController the change in changeUsergroup needs to be copied.
  • Method changeUsergroup got the parameter $usergroupIdToBeRemoved removed. This is because all known usergroups previously set get removed now. So only the $user and $usergroupIdToAdd need to be provided. All usage of this method needs to be changed accordingly.
  • Drop mailhash, setMailhash() and getMailhash() from frontend user model as it was deprecated since 2014.

Sitemap