Вот другой подход.
В моем примере я рендерим встроенные user_profile_form()
и просто сбрасываю ненужные поля. Это хорошо, потому что таким образом вызываются собственные функции проверки в Drupal, также отображается индикатор надежности пароля и соответствия пароля на основе JavaScript, а метки и описания полей такие же, как в форме редактирования пользователя (за исключением того, что здесь я вынул e -почта изменения текста), но вы также можете изменить их, если хотите.
Результат будет выглядеть так:
( Полный экран )
Эта форма будет видна по example.com/change-password
пути (конечно, example.com
ее следует заменить вашим доменом), и я также определю для нее блок.
/**
* 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;
}
Конечно, замените YOURMODULENAME
своим именем модуля (даже рядом 'page callback'
и при вызове drupal_get_form
)! Вы также можете сбросить другие поля, если это необходимо (например, дополнительные поля отображаются с помощью другого модуля).
Очистите кеш после помещения его в ваш код.
После этого Вы можете просто сделать эту форму, позвонив drupal_get_form('YOURMODULENAME_render_user_pass_change_form');
.