Hier ist ein anderer Ansatz.
In meinem Beispiel rendere ich die integrierten user_profile_form()
Felder und deaktiviere einfach die unnötigen Felder. Es ist gut, weil auf diese Weise Drupals eigene Validierungsfunktionen aufgerufen werden, der JavaScript-basierte Kennwortstärke- UND Kennwortabgleichsindikator ebenfalls gerendert wird und die Feldbezeichnungen und Beschreibungen dieselben sind wie auf dem Benutzerbearbeitungsformular (außer dass ich hier das e herausgenommen habe -mail Text ändern), aber Sie können sie auch ändern, wenn Sie möchten.
Das Ergebnis sieht folgendermaßen aus:
( Vollbild )
Dieses Formular wird im example.com/change-password
Pfad angezeigt (sollte natürlich example.com
durch Ihre Domain ersetzt werden), und ich werde auch einen Block dafür definieren.
/**
* 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;
}
Ersetzen YOURMODULENAME
Sie natürlich den Namen Ihres eigenen Moduls (auch in der Nähe 'page callback'
und beim Anruf drupal_get_form
)! Bei Bedarf können Sie auch andere Felder deaktivieren (z. B. werden mehr Felder über ein anderes Modul gerendert).
Leeren Sie den Cache, nachdem Sie ihn in Ihren Code eingefügt haben.
Danach können Sie dieses Formular einfach durch Aufrufen rendern drupal_get_form('YOURMODULENAME_render_user_pass_change_form');
.