Mitglieder­verwaltung 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

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 }
      - { name: contao.hook, hook: updatePersonalData, method: onUpdatePersonalData }

src/EventListener/RegistrationUsernameListener.php

<?php

namespace App\EventListener;

use Contao\Database;
use Contao\FrontendUser;
use Contao\Module;

final class RegistrationUsernameListener
{
    public function onCreateNewUser(int $memberId, array $data, ?Module $module = null): void
    {
        if (empty($data['email'])) {
            return;
        }

        $email = mb_strtolower(trim((string) $data['email']));

        Database::getInstance()
            ->prepare('UPDATE tl_member SET username=? WHERE id=?')
            ->execute($email, $memberId);
    }

    public function onUpdatePersonalData(FrontendUser $member, array $data, Module $module): void
    {
        if (!isset($data['email']) || '' === trim((string) $data['email'])) {
            return;
        }

        $email = mb_strtolower(trim((string) $data['email']));

        Database::getInstance()
            ->prepare('UPDATE tl_member SET username=? WHERE id=?')
            ->execute($email, $member->id);
    }
}

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']['email']['save_callback'][] = [\App\EventListener\DataContainer\UsernameGuard::class, 'syncUsernameFromEmail'];

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

    public function syncUsernameFromEmail($value, DataContainer $dc)
    {
        $email = mb_strtolower(trim((string) $value));

        if ($dc->id && '' !== $email) {
            Database::getInstance()
                ->prepare('UPDATE tl_member SET username=? WHERE id=?')
                ->execute($email, $dc->id);
        }

        return $email;
    }
}

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 inkl. Registrierung, Frontend-Profiländerung und Backend-Pflege umstellen, ohne Erweiterungen oder Template-Anpassungen. Ohne Erweiterungen, core-konform und updatesicher.

Zurück zur Blog-Übersicht