Como posso exibir um formulário de alteração de senha sozinho?
9
É necessário colocar o formulário de redefinição de senha de um usuário em áreas fora do contexto da página de edição do usuário.
Esse módulo Change Password parecia promissor; no entanto, ele está disponível apenas para o drupal 6 e apenas um instantâneo do desenvolvedor está disponível.
Eu poderia usar hook_form_alter para ocultar os campos no formulário de edição do usuário que não estão relacionados à senha do usuário, mas eu preferiria não fazer isso, se possível.
Espero que essa funcionalidade já exista em algum lugar.
Eu não conseguia encontrar nada lá fora e parecia uma coisa útil, então aqui está um pequeno módulo que fornece um bloco com um formulário de alteração de senha:
Arquivo: change_password.info
name =ChangePassword
description =Provides a block containing a form for the current user to change their password.
core =7.x
Arquivo: 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 checkif(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.'));}
É (levemente) testado e funciona, mas você pode querer dar uma olhada novamente para sua própria paz de espírito.
Atualização Eu o projetei como um projeto de sandbox para o caso de alguém estar interessado.
@nicoz Parece uma boa resposta para a pergunta. Eu acho que você poderia enviá-lo como tal e não apenas comentar uma resposta existente.
SMTF
Eu pensei que deixaria Clive tomar a glória. Ele fez todo o trabalho para criar um módulo para responder especificamente ao problema. Além disso, ele está prestes a assumir o topo do quadro de líderes aqui, portanto, qualquer contagem de pontos;)
@nicoz Especifiquei Clive como a resposta correta. Acho que isso não significa que não posso votar novamente no seu também. Felicidades.
SMTF
7
Aqui está outra abordagem.
No meu exemplo, renderizo o built-in user_profile_form()e simplesmente desmarco os campos desnecessários. É bom porque, assim, as funções de validação do Drupal são chamadas, o indicador de força da senha E de correspondência de senha baseado em JavaScript também é renderizado, e os rótulos e descrições dos campos são os mesmos do formulário de edição do usuário (exceto que aqui eu retirei o e -mail mudando o texto), mas você também pode alterá-los, se desejar.
Este formulário estará visível no example.com/change-passwordcaminho (é claro, example.comdeve ser substituído pelo seu domínio), e também definirei um bloco para ele.
/**
* 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;}
Obviamente, substitua YOURMODULENAMEpelo nome do seu próprio módulo (mesmo próximo 'page callback'e ao chamar drupal_get_form)! Você também pode cancelar a definição de outros campos, se necessário (por exemplo, mais campos são renderizados por meio de outro módulo).
Limpe o cache depois de colocá-lo no seu código.
Depois disso, você pode simplesmente renderizar este formulário chamando drupal_get_form('YOURMODULENAME_render_user_pass_change_form');.
Obrigado pela resposta. Estou procurando um formulário de alteração de senha isolado. Em outras palavras, uma versão isolada do formulário é preenchida após a solicitação de uma nova senha.
SMTF
@ SMTF: Oh, desculpe, eu entendi totalmente a pergunta. Então você gostaria de renderizar o formulário de alteração de senha. Corrigirei minha resposta em breve.
Sk8erPeter
2
@ SMTF: como prometi, revisei meu post original e escrevi o código com outra abordagem: com o uso das funções internas do Drupal. Por favor, tente isso também. Obrigado!
Aqui está outra abordagem.
No meu exemplo, renderizo o built-in
user_profile_form()
e simplesmente desmarco os campos desnecessários. É bom porque, assim, as funções de validação do Drupal são chamadas, o indicador de força da senha E de correspondência de senha baseado em JavaScript também é renderizado, e os rótulos e descrições dos campos são os mesmos do formulário de edição do usuário (exceto que aqui eu retirei o e -mail mudando o texto), mas você também pode alterá-los, se desejar.O resultado será semelhante a este:
( Tela cheia )
Este formulário estará visível no
example.com/change-password
caminho (é claro,example.com
deve ser substituído pelo seu domínio), e também definirei um bloco para ele.Obviamente, substitua
YOURMODULENAME
pelo nome do seu próprio módulo (mesmo próximo'page callback'
e ao chamardrupal_get_form
)! Você também pode cancelar a definição de outros campos, se necessário (por exemplo, mais campos são renderizados por meio de outro módulo).Limpe o cache depois de colocá-lo no seu código.
Depois disso, você pode simplesmente renderizar este formulário chamando
drupal_get_form('YOURMODULENAME_render_user_pass_change_form');
.fonte