Mitgliederverwaltung in Contao: Login per E-Mail statt Benutzername
So setzen Sie im Mitgliederbereich automatisch die E-Mail als Benutzername – ohne zusätzliche Erweiterung
In diesem Artikel zeigen wir, wie Contao-Mitglieder sich ausschließlich per E-Mail anmelden können und der Benutzername automatisch gesetzt wird – ohne Erweiterungen und updatesicher.
Die Agentur Zentral GmbH entwickelt individuelle Contao-Lösungen, passt Systeme exakt an Kundenanforderungen an und betreut Projekte langfristig – von der technischen Konzeption bis zur kontinuierlichen Weiterentwicklung.
Zielsetzung
In Contao sollen Mitglieder sich mit ihrer E-Mail statt einem separaten Benutzernamen anmelden. Bei Registrierung wird die E-Mail automatisch als Username gespeichert. Im Backend bleibt das Feld sichtbar, ist aber schreibgeschützt.
Keine Notwendigkeit für Erweiterungen wie
- terminal42/contao-mailusername
oder ähnliche „E-Mail statt Benutzername“-Pakete.
Die Umsetzung erfolgt Core-konform und bleibt update-sicher.
Registrierung: E-Mail automatisch als Benutzername setzen
config/services.yaml
services:
App\EventListener\RegistrationUsernameListener:
tags:
- { name: contao.hook, hook: createNewUser, method: onCreateNewUser }
src/EventListener/RegistrationUsernameListener.php
<?php
namespace App\EventListener;
use Contao\Database;
final class RegistrationUsernameListener
{
public function onCreateNewUser(int $memberId, array $data): void
{
if (empty($data['email'])) {
return;
}
$email = mb_strtolower(trim($data['email']));
Database::getInstance()
->prepare('UPDATE tl_member SET username=? WHERE id=?')
->execute($email, $memberId);
}
}
Backend: Feld sperren und absichern
contao/dca/tl_member.php
<?php
$GLOBALS['TL_DCA']['tl_member']['fields']['username']['eval']['readonly'] = true;
$GLOBALS['TL_DCA']['tl_member']['fields']['username']['eval']['tl_class'] =
trim(($GLOBALS['TL_DCA']['tl_member']['fields']['username']['eval']['tl_class'] ?? '') . ' username-locked');
$GLOBALS['TL_DCA']['tl_member']['fields']['username']['save_callback'][] =
[\App\EventListener\DataContainer\UsernameGuard::class, 'forceEmailAsUsername'];
$GLOBALS['TL_DCA']['tl_member']['fields']['username']['sql'] =
['type' => 'string', 'length' => 64, 'notnull' => false];
src/EventListener/DataContainer/UsernameGuard.php
<?php
namespace App\EventListener\DataContainer;
use Contao\DataContainer;
use Contao\Database;
final class UsernameGuard
{
public function forceEmailAsUsername($value, DataContainer $dc)
{
if (!$dc->id) {
return $value;
}
$row = Database::getInstance()
->prepare('SELECT email FROM tl_member WHERE id=?')
->execute($dc->id);
$email = mb_strtolower(trim((string) $row->email));
return $email ?: $value;
}
}
Stylesheet: Backend-Styles
config/config.yml
contao:
backend:
custom_css:
- files/theme/css/backend.css
files/theme/css/backend.css
#ctrl_username[readonly],
.tl_text.username-locked[readonly] {
cursor: not-allowed;
}
Backend: Sprachtext
contao/languages/de/tl_member.php
<?php
$GLOBALS['TL_LANG']['tl_member']['username'][1] = 'Der Benutzername wird automatisch aus der E-Mail gesetzt.';
Fazit
Mit wenigen Zeilen Code lässt sich der Mitglieder-Login in Contao auf E-Mail-Basis umstellen, ohne Erweiterungen oder Template-Anpassungen. Die Lösung ist schlank, stabil und reduziert Wartung und Fehlerquellen.