パスワード変更フォームを単独で表示するにはどうすればよいですか?


9

ユーザー編集ページのコンテキスト外の領域にユーザーのパスワードリセットフォームを配置する必要があります。

このパスワード変更モジュールは有望に見えました。ただし、それはdrupal 6でのみ使用でき、devスナップショットのみ使用できます。

hook_form_alterを使用して、ユーザーのパスワードに関連しないユーザー編集フォームのフィールドを非表示にすることもできますが、できる限りそうしない方がよいでしょう。

私はこの機能がすでにどこかに存在していると思います。

前もって感謝します。

回答:


26

私はすでに何も見つけることができず、それは便利なもののように思えたので、パスワード変更フォームを備えたブロックを提供する小さなモジュールを次に示します。

ファイル: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.'));
}

(軽く)テストされて機能しますが、自分の心の安らぎのために、もう一度試してみてください。

更新誰かの興味を引くために、私はそれをサンドボックスプロジェクトとしてチャックしました。


ワオ。すごいです。
SMTF 2012年

3
フォームブロックモジュールdrupal.org/project/formblockには、パスワードリセットフォームのサポートがすでに含まれています。drupal.org/node/524774を

@nicozそれは質問に対する良い答えのように見えます。既存の回答についてコメントするだけではなく、そのように提出できると思います。
SMTF 2012年

私は栄光を奪い取ろうと思った。彼は具体的に問題に答えるためのモジュールを作成するためにすべての仕事をしました。また、彼はここでリーダーボードのトップを引き継ぐので、任意のポイントがカウントされます;)

@nicoz Clive'sを正解に指定しました。私もあなたの投票に賛成できないとは思いません。乾杯。
SMTF 2012年

7

ここに別のアプローチがあります。

私の例では、組み込みをレンダリングし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');


ご回答ありがとうございます。分離されたパスワード変更フォームを探しています。つまり、新しいパスワードを要求した後に入力するフォームの分離バージョンです。
SMTF 2012年

@SMTF:ああ、すみません、質問を完全に誤解しました。そこで、パスワード変更フォームをレンダリングしたいとします。すぐに正解します。
Sk8erPeter

2
@SMTF:私が約束したように、私は元の投稿を修正し、別のアプローチでコードを書きました:組み込みのDrupal関数を使用します。ぜひお試しください。ありがとう!
Sk8erPeter
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.