Come posso visualizzare un modulo di modifica password da solo?


9

Ho bisogno di inserire un modulo di reimpostazione della password di un utente in aree esterne al contesto della pagina di modifica dell'utente.

Questo modulo di modifica della password sembrava promettente; tuttavia, è disponibile solo per drupal 6 e solo un'istantanea di sviluppo è disponibile.

Potrei usare hook_form_alter per nascondere i campi nel modulo di modifica utente che non sono correlati alla password dell'utente, ma preferirei non farlo se possibile.

Sto saltando questa funzionalità esiste già da qualche parte.

Grazie in anticipo.

Risposte:


26

Non riuscivo a trovare nulla là fuori e sembrava una cosa utile avere, quindi ecco un piccolo modulo che fornisce un blocco con un modulo di modifica della password:

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

È (leggermente) testato e funziona, ma potresti volerlo provare una volta sola per la tua tranquillità.

Aggiornamento L' ho considerato un progetto sandbox nel caso qualcuno fosse interessato.


Wow. Questo è impressionante.
SMTF,

3
Il modulo Form Block drupal.org/project/formblock contiene già il supporto per il modulo di reimpostazione della password. Vedi drupal.org/node/524774

@nicoz Sembra una buona risposta alla domanda. Penso che potresti inviarlo come tale piuttosto che commentare solo una risposta esistente.
SMTF,

Pensavo che avrei lasciato che Clive prendesse la gloria. Ha fatto tutto il lavoro per creare un modulo per rispondere specificamente al problema. Inoltre, sta per conquistare la vetta della classifica, quindi ogni punto conta;)

@nicoz Ho specificato Clive come la risposta corretta. Non penso che ciò significhi che non posso votare anche il tuo. Saluti.
SMTF,

7

Ecco un altro approccio.

Nel mio esempio, eseguo il rendering del built-in user_profile_form()e deseleziono semplicemente i campi non necessari. È utile perché in questo modo vengono chiamate le funzioni di convalida di Drupal, viene visualizzato anche l'indicatore di corrispondenza della password e l'indicatore di corrispondenza della password basati su JavaScript e le etichette e le descrizioni dei campi sono le stesse del modulo di modifica dell'utente (tranne che qui ho estratto -mail cambiando il testo), ma puoi anche cambiarli, se lo desideri.

Il risultato sarà simile al seguente:

Modulo per la modifica della password ( Schermo intero )

Questo modulo sarà visibile sul example.com/change-passwordpercorso (ovviamente, example.comdovrebbe essere sostituito al tuo dominio) e definirò anche un blocco per esso.

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

Ovviamente, sostituisci YOURMODULENAMEcon il nome del tuo modulo (anche vicino 'page callback'e quando chiami drupal_get_form)! Se necessario, puoi anche annullare la disattivazione di altri campi (ad es. Più campi vengono visualizzati tramite un altro modulo).
Svuota la cache dopo averla inserita nel tuo codice.

Successivamente, puoi semplicemente rendere questo modulo chiamando drupal_get_form('YOURMODULENAME_render_user_pass_change_form');.


Grazie per la risposta. Sto cercando un modulo di modifica della password isolato. In altre parole, una versione isolata del modulo che compili dopo aver richiesto una nuova password.
SMTF,

@SMTF: Oh, mi dispiace, ho completamente frainteso la domanda. Quindi desideri rendere il modulo di modifica della password. Correggerò presto la mia risposta.
Sk8erPeter,

2
@SMTF: come promesso, ho rivisto il mio post originale e ho scritto il codice con un altro approccio: con l'uso delle funzioni Drupal integrate. Per favore, prova anche quello. Grazie!
Sk8erPeter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.