Đây là một cách tiếp cận khác.
Trong ví dụ của tôi, tôi kết xuất sẵn user_profile_form()
và chỉ đơn giản bỏ đặt các trường không cần thiết. Thật tốt vì cách này các hàm xác thực của Drupal được gọi, chỉ báo khớp mật khẩu VÀ cường độ mật khẩu dựa trên JavaScript cũng được hiển thị, và các nhãn và mô tả trường giống như trên biểu mẫu chỉnh sửa của người dùng (ngoại trừ ở đây tôi đã lấy ra e -mail thay đổi văn bản), nhưng bạn cũng có thể thay đổi chúng, nếu bạn muốn.
Kết quả sẽ như thế này:
( Toàn màn hình )
Biểu mẫu này sẽ hiển thị tại example.com/change-password
đường dẫn (tất nhiên, example.com
nên được thay thế cho miền của bạn) và tôi cũng sẽ xác định một khối cho nó.
/**
* 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;
}
Tất nhiên, thay thế YOURMODULENAME
bằng tên mô-đun của riêng bạn (ngay cả khi gần 'page callback'
và khi gọi drupal_get_form
)! Bạn cũng có thể hủy đặt các trường khác nếu cần thiết (ví dụ: nhiều trường được hiển thị thông qua mô-đun khác).
Xóa bộ nhớ cache sau khi đặt nó vào mã của bạn.
Sau này, bạn có thể chỉ cần hiển thị biểu mẫu này bằng cách gọi drupal_get_form('YOURMODULENAME_render_user_pass_change_form');
.