Wie kann ich ein Formular zum Ändern des Passworts selbst anzeigen?

9

Ich muss das Formular zum Zurücksetzen des Kennworts eines Benutzers in Bereichen außerhalb des Kontexts der Benutzerbearbeitungsseite platzieren.

Dieses Modul zum Ändern des Passworts sah vielversprechend aus. Es ist jedoch nur für Drupal 6 verfügbar und es ist nur ein Dev-Snapshot verfügbar.

Ich könnte hook_form_alter verwenden, um die Felder im Bearbeitungsbenutzerformular auszublenden, die nicht mit dem Kennwort des Benutzers zusammenhängen, aber ich würde es vorziehen, dies nicht zu tun, wenn dies überhaupt möglich ist.

Ich hoffe, dass diese Funktionalität bereits irgendwo vorhanden ist.

Danke im Voraus.

SMTF
quelle

Antworten:

26

Ich konnte dort schon nichts herausfinden und es klang nach einer praktischen Sache. Hier ist ein kleines Modul, das einen Block mit einem Formular zum Ändern des Passworts bereitstellt:

Datei: change_password.info

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

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

Es ist (leicht) getestet und funktioniert, aber vielleicht möchten Sie es noch einmal ausprobieren, um sich selbst zu beruhigen.

Update Ich habe es als Sandbox-Projekt eingerichtet, falls sich jemand dafür interessiert.

Clive
quelle
Beeindruckend. Das ist genial.
SMTF
3
Das Formularblockmodul drupal.org/project/formblock enthält bereits Unterstützung für das Formular zum Zurücksetzen des Kennworts. Siehe drupal.org/node/524774
@nicoz Das sieht nach einer guten Antwort auf die Frage aus. Ich denke, Sie könnten es als solches einreichen, anstatt nur eine vorhandene Antwort zu kommentieren.
SMTF
Ich dachte, ich würde Clive den Ruhm nehmen lassen. Er hat die ganze Arbeit gemacht, um ein Modul zu erstellen, um das Problem spezifisch zu beantworten. Außerdem ist er dabei, hier die Spitze der
@nicoz Ich habe Clive's als die richtige Antwort angegeben. Ich denke nicht, dass das bedeutet, dass ich auch deine nicht hochstimmen kann. Prost.
SMTF
7

Hier ist ein anderer Ansatz.

In meinem Beispiel rendere ich die integrierten user_profile_form()Felder und deaktiviere einfach die unnötigen Felder. Es ist gut, weil auf diese Weise Drupals eigene Validierungsfunktionen aufgerufen werden, der JavaScript-basierte Kennwortstärke- UND Kennwortabgleichsindikator ebenfalls gerendert wird und die Feldbezeichnungen und Beschreibungen dieselben sind wie auf dem Benutzerbearbeitungsformular (außer dass ich hier das e herausgenommen habe -mail Text ändern), aber Sie können sie auch ändern, wenn Sie möchten.

Das Ergebnis sieht folgendermaßen aus:

Formular zum Ändern des Passworts ( Vollbild )

Dieses Formular wird im example.com/change-passwordPfad angezeigt (sollte natürlich example.comdurch Ihre Domain ersetzt werden), und ich werde auch einen Block dafür definieren.

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

Ersetzen YOURMODULENAMESie natürlich den Namen Ihres eigenen Moduls (auch in der Nähe 'page callback'und beim Anruf drupal_get_form)! Bei Bedarf können Sie auch andere Felder deaktivieren (z. B. werden mehr Felder über ein anderes Modul gerendert).
Leeren Sie den Cache, nachdem Sie ihn in Ihren Code eingefügt haben.

Danach können Sie dieses Formular einfach durch Aufrufen rendern drupal_get_form('YOURMODULENAME_render_user_pass_change_form');.

Sk8erPeter
quelle
Danke für die Antwort. Ich suche nach einem isolierten Formular zum Ändern des Passworts. Mit anderen Worten, eine isolierte Version des Formulars, das Sie ausfüllen, nachdem Sie ein neues Passwort angefordert haben.
SMTF
@ SMTF: Oh, tut mir leid, ich habe die Frage völlig falsch verstanden. Sie möchten also das Formular zum Ändern des Passworts rendern. Ich werde meine Antwort bald korrigieren.
Sk8erPeter
2
@SMTF: Wie versprochen, habe ich meinen ursprünglichen Beitrag überarbeitet und den Code mit einem anderen Ansatz geschrieben: unter Verwendung der integrierten Drupal-Funktionen. Bitte versuchen Sie das auch. Vielen Dank!
Sk8erPeter