Làm cách nào tôi có thể tự hiển thị một biểu mẫu mật khẩu thay đổi?


9

Tôi có nhu cầu đặt biểu mẫu đặt lại mật khẩu của người dùng ở các khu vực bên ngoài ngữ cảnh của trang chỉnh sửa người dùng.

Đây Thay đổi Mật khẩu mô-đun trông đầy hứa hẹn; tuy nhiên, nó chỉ có sẵn cho drupal 6 và chỉ có một ảnh chụp nhanh dev.

Tôi có thể sử dụng hook_form_alter để ẩn các trường trên biểu mẫu người dùng chỉnh sửa không liên quan đến mật khẩu của người dùng, nhưng tôi không muốn làm điều đó nếu có thể.

Tôi đang hy vọng chức năng này tồn tại ở đâu đó.

Cảm ơn trước.

Câu trả lời:


26

Tôi không thể tìm thấy bất cứ thứ gì ngoài đó và nó nghe có vẻ như là một thứ tiện dụng, vì vậy đây là một mô-đun nhỏ cung cấp một khối có dạng mật khẩu thay đổi:

Tệp: change_password.info

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

Tập tin: 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.'));
}

Nó (nhẹ) được thử nghiệm và hoạt động, nhưng bạn có thể muốn cung cấp cho nó một lần nữa để yên tâm.

Cập nhật Tôi đã tặc lưỡi như một dự án hộp cát trong trường hợp có ai quan tâm.


Ồ Điều đó thật tuyệt vời.
SMTF

3
Mô-đun khối Form drupal.org/project/formblock đã chứa hỗ trợ cho biểu mẫu đặt lại mật khẩu. Xem drupal.org/node/524774

@nicoz Điều đó có vẻ như là một câu trả lời tốt cho câu hỏi. Tôi nghĩ rằng bạn có thể gửi nó như vậy thay vì chỉ nhận xét về một câu trả lời hiện có.
SMTF

Tôi nghĩ rằng tôi sẽ để clive lấy vinh quang. Ông đã làm tất cả các công việc để tạo ra một mô-đun để trả lời cụ thể vấn đề. Ngoài ra, anh ta sắp nắm quyền lãnh đạo ban lãnh đạo ở đây, vì vậy bất kỳ điểm nào cũng được tính;)

@nicoz Tôi đã chỉ định Clive là câu trả lời đúng. Tôi không nghĩ điều đó có nghĩa là tôi cũng không thể bình chọn cho bạn. Chúc mừng.
SMTF

7

Đâ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:

Hình thức thay đổi mật khẩu ( 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.comnê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ế YOURMODULENAMEbằ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');.


Cảm ơn vì sự trả lời. Tôi đang tìm kiếm một hình thức mật khẩu thay đổi bị cô lập. Nói cách khác, một phiên bản riêng biệt của biểu mẫu bạn điền vào sau khi yêu cầu mật khẩu mới.
SMTF

@SMTF: Ồ, tôi xin lỗi, tôi hoàn toàn hiểu sai câu hỏi. Vì vậy, bạn muốn hiển thị các hình thức thay đổi mật khẩu. Tôi sẽ sửa câu trả lời của tôi sớm.
Sk8erPeter

2
@SMTF: như tôi đã hứa, tôi đã sửa đổi bài đăng gốc của mình và viết mã bằng một cách tiếp cận khác: với việc sử dụng các hàm Drupal tích hợp. Hãy thử điều đó quá. Cảm ơn!
Sk8erPeter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.