Femanager – Profil bearbeiten und das Passwort Problem

Bei einem aktuellen Projekt arbeite ich mit Femanager für die Frontend-Benutzer-Verwaltung und bin dabei auf einige Schwierigkeiten gestoßen, die ich mit einem Workaround umschiffen konnte. Die Benutzer-Registrierung funktioniert sehr gut, die Probleme entstehen im Profil-Bearbeiten-Formular.

Das Standard-Template für Profil bearbeiten (Edit) im Femanager ist relativ einfach: Falls im Backend Felder ausgewählt sind, dann gebe für jedes Feld das Partial aus, ansonsten alle Felder. In meinem Fall ist das Profil bearbeiten Formular etwas komplexer aufgebaut: zweispaltig, Felder teilweise gruppiert.

Zuerst hatte ich das Passwort im Formular drin, hatte jedoch die Passwort-Validierung aus der Konfiguration entfernt und die Einstellung keepPasswordIfEmpty gesetzt. Es kommt eine Fehlermeldung von der Passwort-Hash-Funktion (Femanager Issue).

Ok, also Passwort aus dem Formular entfernt. Dann eine neue Seite erstellt, auf der Profil-Bearbeiten-Plugin platziert und dort nur das Passwort als Feld ausgewählt, weiterhin alle anderen Felder per Konfiguration als der Validierung entfernt. Die clientseitige Validierung hat auch rumgezickt, also habe ich sie auch deaktiviert (zumindest auf der Seite). Mit dieser Konfiguration kann das Passwort auf einer separaten Seite geändert werden.

plugin.tx_femanager.settings {
    edit.validation {
        _enable.client = 0
        password.required = 1
        password_repeat.required = 1
        lastName >
        firstName >
        username >
        email >
        address >
        zip >
        usergroup >
        city >
        country >
        jobState >
        subject >
    }
}

Obwohl ich das Passwort aus dem Template entfernt habe und die Validierung des Passworts aus dem Konfiguration, wird die Passwort-Validierung trotzdem aufgerufen. Schuld daran ist die folgende Zeile im PasswordValidator:

public function isValid($user)
{
    $this->init();
 
    // if password fields are not active or if keep function active
    if (!$this->passwordFieldsAdded() || $this->keepPasswordIfEmpty()) {
        return true;
    }
 
    $password = $user->getPassword();
    $passwordRepeat = isset($this->piVars['password_repeat']) ? $this->piVars['password_repeat'] : '';
 
    if ($password !== $passwordRepeat) {
        $this->addError('validationErrorPasswordRepeat', 'password');
        return false;
    }
 
    return true;
}

Die Funktion passwordFieldsAdded liefert dann true, wenn das Passwort-Feld im Flexform explizit hinzugefügt wurde oder gar kein Feld, was aus der Sicht der Extension bedeutet, dass das Passwort-Feld ja sichtbar ist. Ich habe ja schon erwähnt, dass durch das etwas komplexere Formular die Variante die Felder alle einzeln auszuwählen für mich nicht in Frage kommt. Ich muss also alle Felder ausgeben, durch die Konfiguration der Extension jedoch vorgaukeln, dass das Passwort-Feld nicht gewählt ist. Als Lösung habe ich in der TypoScript-Konfiguration eine neue Einstellung hinzugefügt showAll, die ich dann im Template abfrage. Damit kann ich im Flexform z.B. das Feld ‘firstname’ auswählen und es werden trotzdem alle Felder angezeigt. Auf der Passwort-Bearbeiten-Seite muss ich den Wert auf 0 setzen, damit nur das Passwort-Feld ausgegeben wird.

Das Edit-Template sieht verkürzt so aus:

<f:if condition="{settings.edit.showAll}">
    <f:then>
        ALLE FELDER AUSGEBEN
    </f:then>
    <f:else>
        <f:for each="{femanager:misc.explode(string:'{settings.edit.fields}')}" as="field">
            <f:render partial="Fields/{femanager:misc.upper(string:'{field}')}" arguments="{_all}" />
        </f:for>
        <f:render partial="Fields/SubmitUpdate" arguments="{_all}" />
    </f:else>
</f:if>

Es ist leider die beste Lösung für das Problem, die mir gerade einfällt. Bin gespannt, ob mir es bald um die Ohren fliegt…

Hinterlasse eine Antwort

(will not be published)

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>