Zum Inhalt springen

Eigener CustomUserValidator gibt keine ErrorMessage zurück?

Erstellt am 27. Januar 2011 · 5 Antworten · letzte Antwort am 16. Januar 2012

Tags: Frage

typonewbe ·

Hallo,

ich versuche für ein Registrierungsformular meiner Extension das confirm password Problem zu lösen.

Im Buch "Zukunftssichere Extensions mit Extbase und Fluid" gibt es sogar einen Beispielvalidator dafür. Diesen hab ich etwas angepasst umgesetzt. Grund dafür ist die Tatsache, dass ich nicht noch ein unnützes Feld password_confirmation in meiner DB haben wollte.

class Tx_MyExt_Domain_Validator_CustomUserValidator extends Tx_Extbase_Validation_Validator_AbstractValidator {
		/**
		 * 
		 *
		 * @param Tx_MyExt_Domain_Model_FrontendUsers $user
		 * @return boolean true
		 */
		public function isValid($user) {
			$this->errors = array();
			/*if(!$user instanceof Tx_MyExt_Domain_Model_FrontendUsers) {
				$this->addError('The given Object is not a FrontendUser.', 1962341470);
				return FALSE;
			}
			*/
			if($user->getPassword() != t3lib_div::_GP('passwordConfirmation')) {
				$this->addError('The passwords do not match.', 1962341799);
				return FALSE;
			}
			return TRUE;
		}
	}

Jedenfalls das Hauptproblem bei diesem Validator ist das ich statt einem Feld den Benutzer selbst validiere dafür gibt es aber kein Eingabefeld. Wenn ich jetzt den Fehler provoziere passiert zwar etwas, allerdings wird

<f:form.errors for="newFrontendUser">
	<div style="background-color: #fdd; padding: 12px;">
		<strong>
			<f:translate key="FrontendUser_Attributes_{error.propertyName}" />:
		</strong>
		<f:for each="{error.errors}" as="fieldError">
			<f:translate key="FrontendUser_Error_{error.propertyName}_{fieldError.code}" />
			{error.propertyName} : {fieldError.code}
		</f:for>
	</div>
</f:form.errors>

weder der {error.propertyName} noch der {fieldError.code} ausgefüllt.

Ich erhalte somit keine Fehlermeldung und keinen Code mit dem ich was anfangen kann.

Hat jemand eine Idee wie ich den Validator bzw. das Formular dazu bringe Anständige Fehlermeldung und Errorcode auszugeben?

Danke schon mal für die Mühe!

Viele Grüße typonewbe

wolfi02 ·

Hallo typonewbe,

hast du für dieses Problem bereits eine Lösung gefunden? Stehe nämlich vor dem selben Problem und finde auch im Netz nix dazu.

Viele Grüße Christian

freshman17 ·

Das $user-Objekt muss an die Action übergeben werden, dann kann man dieses validieren.
Beispiel:

Formular:

<f:form method="post" action="foo" name="user" object="{user}">...</f:form>

Action:

/**
 * @param Tx_MyExt_Domain_Model_User $user
 * @validate $user Tx_MyExt_Domain_Validator_UserValidator
 */
public function fooAction($user) {..}

Validator:

class Tx_MyExt_Domain_Validator_UserValidator extends Tx_Extbase_Validation_Validator_AbstractValidator {
	public function isValid($user) {..}
}

Übrigens ist in diesem Beispiel die @validate-Annotation nicht zwingend notwendig da die Namenskonventionen eingehalten werden (siehe: TYPO3-Extensions mit Extbase & Fluid Seite 232)
Gruß

wolfi02 ·

Hallo freshman17,

danke für deinen Hinweis. So wie du es beschrieben hast, hatte ich es bereits implementiert. Die Validierung wurde auch durchgeführt und bei einem Fehler das Objekt entsprechend nicht gespeichert. Der Benutzer wurde auch wieder auf das Formular zugeführt, allerdings ist das Problem, dass keine Fehlermeldung im FE erzeugt wird.

In der Validatorklasse hatte ich mit

t3lib_utility_Debug::debug($this->getErrorMessages());

geprüft ob Meldungen erzeugt werden (werden sie). Nur im FE scheint es keine Möglichkeit zu geben, auf die erzeugten Meldungen zu zugreifen. Ich nehme mal an, dass das System in diesem Fall nicht weiß, welchem Feld es die Fehlermeldung(en) zuordnen soll.

Oder muss der Zugriff auf die ErrorMessages im FE anders gestaltet werden?

Vielen Dank und viele Grüße Christian

freshman17 ·

Hi Christian,

im FE hat man zwei Möglichkeiten den Fehler sichtbar zu machen:

1. Fluid fügt die CSS-Klasse f3-form-error zu allen fehlerhaften Feldern hinzu (nur für Eigenschaften eines Objektes geeignet)
2. es gibt einen flashMessages-ViewHelper, der die Fehlermeldungen ausgibt.

<f:flashMessages />
<f:form method="post" action="foo" name="user" object="{user}">...</f:form>

Gruß

wolfi02 ·

Hallo freshman17,

wie man an die entsprechenden Meldungen im FE herankommt war mir klar. Ich habe inzwischen einen Lösung gefunden, welche ganz gut funktioniert.

$this->errors['propertyName'] = new Tx_Extbase_Validation_PropertyError('propertyName', time());
$this->errors['propertyName']->addErrors(array(new Tx_Extbase_Validation_Error(
								Tx_Extbase_Utility_Localization::translate('locallangKey', 'extensionName'), 1326384303)));

Das Problem ist/war wirklich, dass Extbase die Fehlermeldung zwar korrekt erstellt hat, allerdings keiner konkreten Property zugeordnet hat bzw. konnte. Durch diese 3 Codezeilen oben, ist es nun möglich ist einem Object-Validator die Fehlermeldung einer bestimmten Property zu zuordnen.

Viele Grüße Christian