Serverseitige manuelle Validierung mit TYPO3

In diesem Blogbeitrag werden wir uns die manuelle Validierung von Benutzereingaben in Typo3 ansehen. Dazu werden wir eine "action" erstellen, welche ein Formular verarbeitet und die Fehlermeldungen zu den jeweiligen Benutzereingaben liefert. Dazu bietet Typo3 schon Standart-Techniken an, welche wir natürlich befolgen: ConjunctionValidatorValidatorInterface und ValidatorResolver.

Benutzereingaben müssen natürlich sowohl Client- als auch Serverseitig validiert werden. Bei Typo3 gibt es nun mehrere Möglichkeiten zur Validierung: Manuell und automatisch (mittels Annotations im Domain-Model). Hier sehen wir uns die manuelle Validierung an, und werden dazu eigene Validierungs-Klassen schreiben aber auch bereits vorhandene verwenden und konfigurieren. Solltest du an dieser Stelle Interesse an der automatischen Validierung haben, findest du hierfür auch weitere Informationen in den angegebenen Quellen am Ende dieses Beitrags. 

Die Action

Zu Beginn schreiben wir die Action im Controller welche vom Client aufgerufen wird, und die Formulardaten erhält. In diesem Beispiel handelt es sich um ein Formular zur Newsletter Anmeldung. Sind alle Benutzereingaben vorhanden und konform wird ein Optin gesendet und der Status „Erfolg“ an den Client gemeldet. Im Fehlerfall werden die Fehlermeldungen (samt den dazugehörigen Feld) an den Client gesendet. In diesem Beispiel senden wir json-Daten, da diese Aufrufe bei uns mittels ajax erfolgen.

public function userdataAction() {    // validation    $errors = array();    $validatorResolver = $this->objectManager->get('TYPO3\\CMS\\Extbase\\Validation\\ValidatorResolver');    $validatorResult = array();     //Get arguments    $args = $this->request->getArguments();     //execute validators    $validatorResult['toc'] = \Varioous\VaValidation\Utility\ValidationUtility::validateNotEmpty($validatorResolver, $args['toc']);    $validatorResult['salutation'] = \Varioous\VaValidation\Utility\ValidationUtility::validateSalutation($validatorResolver, $args['salutation']);    $validatorResult['firstname'] = \Varioous\VaValidation\Utility\ValidationUtility::validateName($validatorResolver, $args['firstname']);    $validatorResult['lastname'] = \Varioous\VaValidation\Utility\ValidationUtility::validateName($validatorResolver, $args['lastname']);    $validatorResult['email'] = \Varioous\VaValidation\Utility\ValidationUtility::validateEmail($validatorResolver, $args['email']);    $validatorResult['username'] = \Varioous\VaValidation\Utility\ValidationUtility::validateUsername($validatorResolver, $args['username']);     //iterate over all result    foreach ($validatorResult as $key => $value) {        //check if validator has error        if ($value->hasErrors()) {            //loop through all errors            foreach($value->getErrors() as $error){                //get error message                $errors[$key][] = \TYPO3\CMS\Extbase\Utility\LocalizationUtility::translate($key . "." . $error->getCode(), 'VaValidation');            }        }    }     //check if errors    if (count($errors) > 0) {        //return errors        return json_encode(['errors' => $errors]);    }     //send newsletter optin    \Varioous\VaNewsletter\Utility\NewsletterUtility::registerNewsletter($args['email'], $args['salutation'], $args['firstname'], $args['lastname'],$args['username']);     //return success    return json_encode(['success' => true]);}

In den folgenden Abschnitten werden wir die verschiedenen verwendeten Komponenten Schritt für Schritt durchgehen und diese genauer erklären.

ValidationUtility

Dies ist eine selbst erstellte Utility-Klasse um die Validierung von Benutzername, Email-Adressen etc. zu vereinheitlichen bzw. das diese im ganzen Projekt gleich verwendet werden. Außerdem hat es den Vorteil, sollte sich die Benutzername-Validierung ändern, muss man dies nur an einer Stelle ändern.

public static function validateEmail($validatorResolver, $email) {    $conjunctionValidatorEmail = $validatorResolver->createValidator('Conjunction');    $conjunctionValidatorEmail->addValidator($validatorResolver->createValidator('NotEmptyValidator'));    $conjunctionValidatorEmail->addValidator($validatorResolver->createValidator('EmailAddressValidator'));    $conjunctionValidatorEmail->addValidator(new \Varioous\VaYoga\Validator\EmailUniqueValidator());    return $conjunctionValidatorEmail->validate($email);}

In den folgenden Abschnitten werden wir die verschiedenen verwendeten Komponenten Schritt für Schritt durchgehen und diese genauer erklären.

ValidationUtility

Dies ist eine selbst erstellte Utility-Klasse um die Validierung von Benutzername, Email-Adressen etc. zu vereinheitlichen bzw. das diese im ganzen Projekt gleich verwendet werden. Außerdem hat es den Vorteil, sollte sich die Benutzername-Validierung ändern, muss man dies nur an einer Stelle ändern.

public static function validateEmail($validatorResolver, $email) {    $conjunctionValidatorEmail = $validatorResolver->createValidator('Conjunction');    $conjunctionValidatorEmail->addValidator($validatorResolver->createValidator('NotEmptyValidator'));    $conjunctionValidatorEmail->addValidator($validatorResolver->createValidator('EmailAddressValidator'));    $conjunctionValidatorEmail->addValidator(new \Varioous\VaYoga\Validator\EmailUniqueValidator());    return $conjunctionValidatorEmail->validate($email);}

Im obigen Codefragment sieht man dass einerseits vorgefertigte Validatoren verwendet werden (NotEmpty,EmailAddress), aber auch ein selbst erstellter (EmailUnique).

Vorgefertigte Validatoren

Vorgefertigte Validatoren werden vom Typo3-Core zur Verfügung gestellt. Eine Übersicht aller zur Verfügung gestellter Validatoren findet man hier.

Eigenen Validator schreiben

Man kann auch eigene Validatoren schreiben, die einer gewissen Vorlage (AbstractValidator) folgen müssen, diese können danach aber wie vorgefertigte Validatoren verwendet werden. Im obigen Beispiel wurde ein EmailUniqueValidator erstellt, also eine Funktion zur Überprüfung ob die Mail Adresse einzigartig ist, oder bereits in unserer Datenbank gespeichert wurde. Diese Methode (isValid) muss einfach TRUE im Erfolgsfall, ansonsten FALSE und eine Fehlermeldung zurück liefern. Dies sieht man im nächsten Code-Abschnitt:

class EmailUniqueValidator extends \TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator {     public function isValid($mail) {        $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Object\\ObjectManager');        $frontendUserRepository = $objectManager->get('Varioous\\VaValidation\\Domain\\Repository\\FrontendUserRepository');        //Finde Benutzer mit dieser E-Mail-Adresse        $result = $frontendUserRepository->findByEmailDisableFields($mail);        if (count($result->toArray()) != 0) {            //Benutzer gefunden -> Fehlermeldung und false zurückgeben            $this->addError('Die angegebene Mailadresse existiert bereits. Wenn Du das bist, melde Dich bitte zuerst an.', 1342342804);            return FALSE;        }        return TRUE;    } }

Fehlermeldungen

Nun möchten wir die Fehlermeldungen entweder selbst noch anpassen oder gegebenenfalls auch übersetzen. Dies geschieht wie man im ersten Listing (die Action) sieht in Zeile 25. Jetzt muss nur noch die Sprachdatei erstellt werden. Ein Beispiel herfür:

<trans-unit id="newsletter.400">     <source>Beim Anmelden ist leider ein Fehler aufgetreten. Bitte versuche es später nochmal.</trans-unit><trans-unit id="salutation.1346441">     <source>Bitte wähle eine Anrede aus.</trans-unit><trans-unit id="username.1342342806">     <source>Der Username ist leider schon vergeben.</trans-unit><trans-unit id="username.1221560718">     <source>Bitte trage einen Username ein.</trans-unit><trans-unit id="username.1428504122">     <source>Bitte trage einen Username ein (zwischen 3 und 40 Zeichen).</trans-unit><trans-unit id="firstname.1428504122">     <source>Bitte trage deinen Vornamen ein (zwischen 3 und 40 Zeichen).</trans-unit>

Wir entwickeln digitale Lösungen mit Leidenschaft

Warum wir das tun? Weil die Verwirklichung Ihrer Vision unser größter Anspruch und die schönste Anerkennung ist. Deshalb nehmen wir uns gerne ausreichend Zeit für die Realisierung Ihres digitalen Projekts.

Kontaktieren Sie uns, wir sind gerne für Ihre Fragen da:

Passend zu diesem Thema:

TYPO3 Chatbot

TYPO3 Chatbot

Chatbots ermöglichen es, die Betreuung von Website-Besuchern im Kundenservice einfach und effizient zu gestalten. Der Einsatz dieser virtuellen Helfer…

TYPO3 Indexed Search mit Segmentierung/Indexierung

TYPO3 Indexed Search mit Segmentierung/Indexierung

In diesem Blogbeitrag will ich Euch den Einsatz der Such-Erweiterung "indexed_search" zeigen und anhand eines Beispiels näher bringen. Wir werden uns …

TYPO3 Tipps und Tricks: Manueller/Programmatischer Login in Controller-Action (TYPO3 9)

TYPO3 Tipps und Tricks: Manueller/Programmatischer Login in Controller-Action (T…

Manchmal gibt es bei Web-Projekten die Notwendigkeit einen Login programmatisch (manuell, im PHP-Code) durchzuführen. Ein Kunde hat vor kurzem folgend…