Bagaimana saya bisa menampilkan formulir perubahan kata sandi sendiri?


9

Saya perlu menempatkan formulir pengaturan ulang kata sandi pengguna di area di luar konteks halaman edit pengguna.

Ini Kata Ganti modul tampak menjanjikan; Namun, ini hanya tersedia untuk drupal 6 dan hanya snapshot dev yang tersedia.

Saya dapat menggunakan hook_form_alter untuk menyembunyikan bidang pada formulir edit pengguna yang tidak terkait dengan kata sandi pengguna, tetapi saya lebih suka untuk tidak melakukannya jika memungkinkan.

Saya hopping fungsi ini sudah ada di suatu tempat.

Terima kasih sebelumnya.

Jawaban:


26

Saya tidak dapat menemukan apa pun di luar sana dan itu terdengar seperti hal yang mudah untuk dimiliki, jadi inilah modul kecil yang menyediakan blok dengan bentuk perubahan kata sandi:

File: change_password.info

name = Change Password
description = Provides a block containing a form for the current user to change their password.
core = 7.x

File: 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.'));
}

Ini (ringan) diuji dan bekerja, tetapi Anda mungkin ingin memberikannya sekali untuk ketenangan pikiran Anda sendiri.

Pembaruan Saya telah menjadikannya sebagai proyek kotak pasir jika-kalau ada yang tertarik.


Wow. Itu mengagumkan.
SMTF

3
Modul Block Form drupal.org/project/formblock sudah berisi dukungan untuk form reset kata sandi. Lihat drupal.org/node/524774

@nicoz Sepertinya jawaban yang bagus untuk pertanyaan itu. Saya pikir Anda bisa mengirimkannya daripada mengomentari jawaban yang ada.
SMTF

Saya pikir saya akan membiarkan clive mengambil kemuliaan. Dia melakukan semua pekerjaan untuk membuat modul untuk secara spesifik menjawab masalah ini. Juga, dia akan mengambil alih pimpinan dewan di sini, jadi poin apa pun diperhitungkan;)

@nicoz Saya telah menentukan Clive sebagai jawaban yang benar. Saya tidak berpikir itu berarti saya tidak dapat memilih Anda juga. Bersulang.
SMTF

7

Ini pendekatan lain.

Dalam contoh saya, saya membuat built-in user_profile_form(), dan hanya menghapus bidang yang tidak perlu. Ini bagus karena dengan cara ini fungsi validasi Drupal dipanggil, kekuatan kata sandi berbasis JavaScript DAN indikator pencocokan kata sandi juga diberikan, dan label dan deskripsi bidang sama dengan pada formulir edit pengguna (kecuali bahwa di sini saya mengeluarkan -mail mengubah teks), tetapi Anda juga bisa mengubahnya, jika Anda mau.

Hasilnya akan terlihat seperti ini:

Bentuk perubahan kata sandi ( Layar penuh )

Formulir ini akan terlihat di example.com/change-passwordjalur (tentu saja, example.comharus diganti dengan domain Anda), dan saya juga akan mendefinisikan blok untuk itu.

/**
 * 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;
}

Tentu saja, gantilah YOURMODULENAMEdengan nama modul Anda sendiri (bahkan di dekat 'page callback'dan saat menelepon drupal_get_form)! Anda juga dapat menghapus bidang lain jika perlu (mis. Lebih banyak bidang ditampilkan melalui modul lain).
Bersihkan cache setelah memasukkannya ke dalam kode Anda.

Setelah ini, Anda cukup merender formulir ini dengan menelepon drupal_get_form('YOURMODULENAME_render_user_pass_change_form');.


Terima kasih atas tanggapannya. Saya mencari bentuk kata sandi perubahan yang terisolasi. Dengan kata lain versi terisolasi dari formulir yang Anda isi setelah meminta kata sandi baru.
SMTF

@ SMTF: Oh, maaf, saya benar-benar salah paham pertanyaannya. Jadi, Anda ingin membuat formulir pengubahan kata sandi. Saya akan segera memperbaiki jawaban saya.
Sk8erPeter

2
@ SMTF: seperti yang saya janjikan, saya merevisi posting asli saya, dan menulis kode dengan pendekatan lain: dengan penggunaan fungsi Drupal bawaan. Silakan coba juga. Terima kasih!
Sk8erPeter
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.