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: