Ecco un altro approccio.
Nel mio esempio, eseguo il rendering del built-in user_profile_form()
e deseleziono semplicemente i campi non necessari. È utile perché in questo modo vengono chiamate le funzioni di convalida di Drupal, viene visualizzato anche l'indicatore di corrispondenza della password e l'indicatore di corrispondenza della password basati su JavaScript e le etichette e le descrizioni dei campi sono le stesse del modulo di modifica dell'utente (tranne che qui ho estratto -mail cambiando il testo), ma puoi anche cambiarli, se lo desideri.
Il risultato sarà simile al seguente:
( Schermo intero )
Questo modulo sarà visibile sul example.com/change-password
percorso (ovviamente, example.com
dovrebbe essere sostituito al tuo dominio) e definirò anche un blocco per esso.
/**
* Implements hook_menu().
*/
function YOURMODULENAME_menu() {
$items = array();
$items['change-password'] = array(
'title' => t('Change password'),
'description' => t('You can change your password here.'),
'page callback' => 'YOURMODULENAME_render_user_pass_change_form',
'access arguments' => array('access content'),
);
return $items;
}
/**
* Render the password changing form with the usage of Drupal's built-in user_profile_form
*
* @global type $user
* @return array The rendered form array for changing password
*/
function YOURMODULENAME_render_user_pass_change_form() {
global $user;
if (!user_is_logged_in()) {
drupal_access_denied();
}
module_load_include('inc', 'user', 'user.pages');
$form = drupal_get_form('user_profile_form', $user);
$request_new = l(t('Request new password'), 'user/password', array('attributes' => array('title' => t('Request new password via e-mail.'))));
$current_pass_description = t('Enter your current password to change the %pass. !request_new.', array('%pass' => t('Password'), '!request_new' => $request_new));
$form['account']['current_pass']['#description'] = $current_pass_description;
unset(
$form['account']['name'],
$form['account']['mail'],
$form['account']['status'],
$form['account']['roles'],
$form['locale'],
$form['l10n_client'],
$form['picture'],
$form['overlay_control'],
$form['contact'],
$form['timezone'],
$form['ckeditor'],
$form['metatags'],
$form['redirect']
);
return $form;
}
define('PASSWORD_CHANGING_BLOCK', 'password_changing_block');
/**
* Implements hook_block_info().
*/
function YOURMODULENAME_block_info() {
$blocks = array();
$blocks[PASSWORD_CHANGING_BLOCK] = array(
'info' => t('Block for changing password'), //The name that will appear in the block list.
'cache' => DRUPAL_CACHE_GLOBAL, // The block is the same for every user on every page where it is visible.
);
return $blocks;
}
/**
* Implements hook_block_view().
*
* Prepares the contents of the block.
*/
function YOURMODULENAME_block_view($delta = '') {
switch ($delta) {
case PASSWORD_CHANGING_BLOCK :
if(user_is_logged_in()){
$block['subject'] = t('Change Password');
$block['content'] = drupal_get_form('YOURMODULENAME_render_user_pass_change_form');
}
break;
}
return $block;
}
Ovviamente, sostituisci YOURMODULENAME
con il nome del tuo modulo (anche vicino 'page callback'
e quando chiami drupal_get_form
)! Se necessario, puoi anche annullare la disattivazione di altri campi (ad es. Più campi vengono visualizzati tramite un altro modulo).
Svuota la cache dopo averla inserita nel tuo codice.
Successivamente, puoi semplicemente rendere questo modulo chiamando drupal_get_form('YOURMODULENAME_render_user_pass_change_form');
.