Drupal: form user_pass_reset per il recupero della password. Come reindirizzare le richieste ad una pagina differente da /user/n/edit

PROBLEMA. L'utilizzo del modulo "Change password" sposta le impostazioni di cambio password in una nuova scheda nella pagina del profilo utente. Questo può portare ad una maggiore usabilità del sito in quanto semplifica il form di cambio password, eliminando possibili fonti di disturbo. Tuttavia può anche creare alcuni problemi ad utenti meno smaliziati durante la procedura di recupero della password, in quanto dopo aver utilizzato il link di recupero password, si viene reindirizzati non alla scheda di cambio password, ma alla pagina del profilo utente.

La pagine del profilo utente con la scheda di modifica della password

SOLUZIONE. Per fare in modo che cliccando sul link di recupero password si venga indirizzati correttamente alla scheda di modifica password sopra mostrata, è sufficiente creare un piccolo modulo ed utilizzare hook_form_alter() (o in alternativa hook_form_FORM_ID_alter):

<?php
/*
* Implementation of the hook_form_alter
*/
function nomemodulo_form_alter(&$form, &$form_state, $form_id) {
  // Reindirizzo l'utente alla scheda di cambio password dopo aver effettuato
  // l'accesso tramite il link di recupero password.
  if ($form_id == 'user_pass_reset') {
    $old_action = $form['#action'];
    $form['#action'] = $old_action.'?destination=user/'.arg(2).'/edit/chgpwd';
  }
}

Il form che dobbiamo intercettare è il form user_pass_reset. Il codice mostrato qui sopra non fa altro che modificare l'azione predefinita del form (salvata in $old_action) aggiungendo un redirect all'URL (parametro destination) corrispondente alla scheda di modifca password nelle pagine del profilo utente

http://www.miosito.it/user/n/edit/chgpwd

dove n è lo user ID. L'URL per il recupero della passowrd è nella forma

http://www.miosito.it/user/reset/n/1289337983/0c82617841378ab290bcb20b280686d3

con n corrispondente sempre allo user ID. arg(2) non fa altro che prendere il terzo argomento dell'URL (ricordiamo che la numerazione parte da 0):

  • arg(0) = user
  • arg(1) = reset
  • arg(2) = n

Si noti che nel codice di cui sopra avremmo potuto utilizzare in alternativa la funzione drupal_goto() per formare il nuovo URL.