ユーザー編集ページのコンテキスト外の領域にユーザーのパスワードリセットフォームを配置する必要があります。
この パスワードの変更 モジュールは有望に見えました。ただし、drupal 6の場合にのみ使用でき、devスナップショットのみ使用できます。
Hook_form_alterを使用して、ユーザーのパスワードに関連しないユーザー編集フォームのフィールドを非表示にすることもできますが、できる限りそうしない方がよいでしょう。
私はこの機能がすでにどこかに存在していると思います。
前もって感謝します。
私はすでにそこに何も見つけることができなかったし、それを持っているのは便利なように思えたので、パスワード変更フォームを備えたブロックを提供する小さなモジュールを次に示します。
ファイル:change_password.info
name = Change Password
description = Provides a block containing a form for the current user to change their password.
core = 7.x
ファイル:change_password.module
<?php
/**
* Implements hook_block_info().
*/
function change_password_block_info() {
return array(
'change_password_form' => array(
'info' => t('Change Password Form')
)
);
}
/**
* Implements hook_block_view().
*/
function change_password_block_view($delta = '') {
$block = array();
// Only show the block for a logged-in user.
if ($delta == 'change_password_form' && user_is_logged_in()) {
$block['subject'] = t('Change Password');
$block['content'] = drupal_get_form('change_password_form');
}
return $block;
}
/**
* Password change form.
*/
function change_password_form($form, &$form_state) {
// Sanity check
if (user_is_anonymous()) {
return $form; // Or drupal_access_denied()?
}
// Get the currently logged in user object.
$form['#account'] = $GLOBALS['user'];
// Textfield cor current password confirmation.
$form['current_pass'] = array(
'#type' => 'password',
'#title' => t('Current password'),
'#size' => 25,
'#required' => TRUE
);
// Password confirm field.
$form['account']['pass'] = array(
'#type' => 'password_confirm',
'#size' => 25,
'#title' => t('New Password'),
'#required' => TRUE
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit')
);
return $form;
}
/**
* Validate handler for change_password_form().
*/
function change_password_form_validate(&$form, &$form_state) {
// Make sure the password functions are present.
require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
// Make sure the provided current password is valid for this account.
if (!user_check_password($form_state['values']['current_pass'], $form['#account'])) {
form_set_error('current_pass', t('The current password you provided is incorrect.'));
}
}
/**
* Submit handler for change_password_form().
*/
function change_password_form_submit(&$form, &$form_state) {
// Set up the edit array to pass to user_save()
$edit = array('pass' => $form_state['values']['pass']);
// Save the account with the new password.
user_save($form['#account'], $edit);
// Inform the user.
drupal_set_message(t('Your password has been changed.'));
}
(軽く)テストされて機能しますが、自分の心の安らぎのためにもう一度試してみるとよいでしょう。
更新誰かの興味がある場合に備えて sandboxプロジェクト としてそれをチャックしました。
ここに別のアプローチがあります。
私の例では、組み込みの 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');
を呼び出すだけで、このフォームをレンダリングできます。