Voici une autre approche.
Dans mon exemple, je rend le intégré user_profile_form()
, et je désactive simplement les champs inutiles. C'est bien parce que de cette façon, les propres fonctions de validation de Drupal sont appelées, l'indicateur de force et de correspondance de mot de passe basé sur JavaScript est également rendu, et les étiquettes de champ et les descriptions sont les mêmes que sur le formulaire de modification de l'utilisateur (sauf qu'ici, j'ai retiré l'e -mail en changeant le texte), mais vous pouvez aussi les changer si vous le souhaitez.
Le résultat ressemblera à ceci:
( Plein écran )
Ce formulaire sera visible au example.com/change-password
chemin (bien sûr, example.com
devrait être substitué à votre domaine), et je définirai également un bloc pour celui-ci.
/**
* 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;
}
Bien sûr, remplacez-le YOURMODULENAME
par le nom de votre propre module (même à proximité 'page callback'
et lors de l'appel drupal_get_form
)! Vous pouvez également désactiver d'autres champs si nécessaire (par exemple, plus de champs sont rendus via un autre module).
Videz le cache après l'avoir mis dans votre code.
Après cela, vous pouvez simplement rendre ce formulaire en appelant drupal_get_form('YOURMODULENAME_render_user_pass_change_form');
.