Nutzer soll nach Passwort Festlegung auf Profil weitergeleitet werden: Bis 8.8.x funktionierte das, seit 8.9.x nicht mehr
am 01.07.2020 - 13:09 Uhr in
Hi,
ich möchte folgendes erreichen:
Der Nutzer soll, nachdem er seinen "first-time-login-link" aus der E-Mail geöffnet hat, sein Passwort erstellen. Danach soll er direkt auf sein Profil weitergeleitet werden.
Bisher habe ich das einfach mit einem Custom Module geregelt:
<?php
function userredirect_form_alter(&$form, $form_state, $form_id) {
if ($form_state->get('user-pass-reset'){
$form['actions']['submit']['#submit'][] = '_userredirect_user_edit_form_submit';
}
}
function _userredirect_user_edit_form_submit($form, &$form_state) {
$form_state->setRedirect('entity.user.canonical', array('user' => \Drupal::currentUser()->id()));
}
?>
Das scheint aber nicht mehr zu funktionieren. Vermutlich seit dem Update von 8.8.x auf Drupal 8.9.x.
Mit Drupal 8.8.x funktionierte das tadellos.
Ich habe es auch gecheckt - das Formular hat immernoch die form_id "user_pass_reset". Aber auch wenn ich die anderen IDs anspreche, z.B. "change-pwd-form", funktioniert es nicht. Auch wenn ich statt der form_state die form_id direkt abfrage, funktioniert es nicht.
Habe die IF-Abfrage testweise mal so umgebaut:
<?php
if ($form_state->get('user-pass-reset') || $form_state->get('change-pwd-form') || $form_id === 'change_pwd_form' || $form_id === 'user_pass_reset') {
$form['actions']['submit']['#submit'][] = '_userredirect_user_edit_form_submit';
}
?>
Nichts passiert.
Wenn der Nutzer jetzt sein Passwort festlegt, verbleibt er immer im Passwort Formular.
Ich sollte vllt. noch erwähnen, dass ich ein zusätzliches Modul installiert habe, das die Usability für den Nutzer erhöht, indem es die Passwort-Felder in ein separates Formular verschiebt: https://www.drupal.org/project/change_pwd_page. So sieht der Nutzer, wenn er das erste Mal sein Passwort festlegen soll, auch nur die Passwort-Felder. Das war aber bisher kein Problem und die Weiterleitung funktionierte trotzdem.
Wie kann ich es jetzt erreichen, dass er wieder auf sein Profil weitergeleitet wird, sobald er sein Passwort festgelegt hat?
Vielen Dank im Voraus für Eure Hilfe.
- Anmelden oder Registrieren um Kommentare zu schreiben
Ok... Weil ich einen
am 02.07.2020 - 10:00 Uhr
Ok... Weil ich einen Tippfehler hier im Forenbeitrag gefunden habe, nämlich dass die form_id "user-pass-reset" wäre, im Quellcode wird sie aber mit Unterstrichen ausgegeben, habe ich jetzt mal in der IF-Abfrage auch bei der Abfrage des form_state die Bindestriche durch Unterstriche ersetzt. Jetzt passiert wenigstens was Neues. Nämlich, dass der Nutzer, nachdem er den "One-Time-Login-Link" aus der Mail anklickt und anschließend auf den Button "Anmelden" klickt, auf das Profil mit der UID 0 weitergeleitet wird, auf das er logischer Weise keinen Zugriff hat. Aber es will auf ein Profil weiterleiten. Also habe ich versucht die Einzel-Abfragen zur form_state mit Unterstrichen zu verwenden, also so:
<?php
if ($form_state->get('user_pass_reset') ) {
$form['actions']['submit']['#submit'][] = '_userredirect_user_edit_form_submit';
}
?>
Bzw. so:
<?php
if ($form_state->get('change_pwd_form') ) {
$form['actions']['submit']['#submit'][] = '_userredirect_user_edit_form_submit';
}
?>
In beiden Fällen passierte wieder nix.
Dann dachte ich, ok, irgendwie hat die Änderung in Unterstriche vllt. bewirkt, dass die IF-Abfrage eben bei den "form_id" Abfragen hängen bleibt... Also habe ich die if-Abfrage darauf reduziert, also so:
<?php
if ($form_id === 'change_pwd_form' || $form_id === 'user_pass_reset') {
$form['actions']['submit']['#submit'][] = '_userredirect_user_edit_form_submit';
}
?>
Und hier passierte es dann wieder: Weiterleitungsversuch auf das Profil mit der UID 0 (nach Nutzung des "One-Time-Login-Link" aus der Mail und anschließendem Klick auf den Button "Anmelden" - also noch bevor er ein Passwort festlegen kann bzw. in das Formular dazu gelangt).
OK. Damit lässt sich aber vllt. arbeiten.
Drupal weiß zu diesem Zeitpunkt also nicht, welche UID der currentUser hat, richtig? Liegt das nun daran, dass der Nutzer seine Anmeldung noch nicht ganz abschließen konnte, weil diese falsche Weiterleitung verhindert hat, dass die Passwortvergabe erfolgen konnte? Oder ist einfach die ID-Abfrage falsch?
Ich dachte, das geht mit folgendem Befehl: "\Drupal::currentUser()->id()". Das scheint auch noch in Drupal 9.x der Fall zu sein - also nehme ich mal an, dass es in 8.9.x ebenfalls noch so gemacht wird. Also wird das nicht der Grund sein.
Vermutlich ist es eher, dass sich die ID doch geändert hat für dieses spezielle Formular.
Wie kriege ich denn raus, wie die ID für Drupal wirklich heißt? Der Quellcode (HTML) scheint mich da ja auf eine falsche Fährte zu führen.
Ich checks nicht. Hoffentlich könnt ihr mir hier helfen.
pyretta schrieb Wie kriege
am 02.07.2020 - 18:24 Uhr
Wie kriege ich denn raus, wie die ID für Drupal wirklich heißt? Der Quellcode (HTML) scheint mich da ja auf eine falsche Fährte zu führen.
Entweder installierst du dir einen PHP Debugger wie Xdebug oder einfacher das Devel Modul. Mit beiden bekommst du die korrekte Form_ID aus dem $form array, wenn du das entsprechende Form aufrufst.
Vielen Dank glycid für deine
am 03.07.2020 - 10:31 Uhr
Vielen Dank glycid für deine Hinweise und Tipps.
Das Devel Modul ist installiert. Aber das Formular ist ja nur als anonymer Nutzer sichtbar - und das auch nur ein einziges Mal - nämlich mit dem "One-Time-Login-Link". Also komme ich da ja nicht mit Devel ran, weil das Modul ist nur für Admins zugänglich und ich glaube, wenn ich das für anonyme Besucher aktiviere, wäre das eher ein Sicherheitsrisiko. Oder wäre das auch dann ok?
Den PHP Debugger kenne ich noch nicht. Müsste ich mir erst anschauen, wie das funktioniert. Kann sowas denn auch ohne Sicherheitsrisiko anonyme Zugriffe als anonymer Gast debuggen?
pyretta schrieb Kann sowas
am 03.07.2020 - 16:04 Uhr
Kann sowas denn auch ohne Sicherheitsrisiko anonyme Zugriffe als anonymer Gast debuggen?
Ich bin jetzt davon ausgegangen, dass du lokal entwickelst und dann auf live deployest. Auf der Live Instanz würde ich das nicht machen.
glycid's Vorschlag war ja
am 08.07.2020 - 16:23 Uhr
glycid's Vorschlag war ja schon mal ein sehr guter, nur in meinem Fall wohl nicht anwendbar. Nochmal vielen Dank glycid.
Aber vllt. hat ja jemand noch einen Tipp, was ich hier anders machen könnte bzw. wie ich die Form-ID rausbekomme?
Hatte vllt. noch jemand ein ähnliches Problem und es bereits gelöst?
Bin für jeden Rat dankbar.