Как я могу отобразить форму смены пароля самостоятельно?
9
Мне нужно разместить форму для сброса пароля пользователя в областях вне контекста страницы редактирования пользователя.
Этот модуль смены пароля выглядел многообещающе; однако, он доступен только для drupal 6 и доступен только снимок разработчика.
Я мог бы использовать hook_form_alter, чтобы скрыть поля в форме редактирования пользователя, которые не связаны с паролем пользователя, но я бы предпочел не делать этого, если это вообще возможно.
Я прыгаю, эта функциональность уже где-то существует.
Я уже ничего не мог найти там, и это звучало как удобная вещь, так что вот небольшой модуль, предоставляющий блок с формой смены пароля:
Файл: change_password.info
name =ChangePassword
description =Provides a block containing a form for the current user to change their password.
core =7.x
Файл: 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.'));}
Это (слегка) проверено и работает, но вы можете сделать это еще раз для вашего собственного спокойствия.
Обновление Я настроил его как проект песочницы на случай, если кому-то будет интересно.
@nicoz Это похоже на хороший ответ на вопрос. Я думаю, что вы могли бы представить его как таковой, а не только комментировать существующий ответ.
SMTF
Я думал, что позволю Клайву забрать славу. Он проделал всю работу по созданию модуля, чтобы конкретно ответить на вопрос. Кроме того, он собирается взять верхушку
@nicoz Я указал Клайва как правильный ответ. Я не думаю, что это означает, что я тоже не могу проголосовать за тебя. Приветствия.
SMTF
7
Вот другой подход.
В моем примере я рендерим встроенные user_profile_form()и просто сбрасываю ненужные поля. Это хорошо, потому что таким образом вызываются собственные функции проверки в Drupal, также отображается индикатор надежности пароля и соответствия пароля на основе JavaScript, а метки и описания полей такие же, как в форме редактирования пользователя (за исключением того, что здесь я вынул e -почта изменения текста), но вы также можете изменить их, если хотите.
Эта форма будет видна по example.com/change-passwordпути (конечно, example.comее следует заменить вашим доменом), и я также определю для нее блок.
/**
* 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;}
Конечно, замените YOURMODULENAMEсвоим именем модуля (даже рядом 'page callback'и при вызове drupal_get_form)! Вы также можете сбросить другие поля, если это необходимо (например, дополнительные поля отображаются с помощью другого модуля).
Очистите кеш после помещения его в ваш код.
После этого Вы можете просто сделать эту форму, позвонив drupal_get_form('YOURMODULENAME_render_user_pass_change_form');.
Спасибо за ответ. Я ищу изолированную форму смены пароля. Другими словами, изолированную версию формы вы заполняете после запроса нового пароля.
SMTF
@ SMTF: О, извини, я совершенно не понял вопрос. Итак, вы хотели бы сделать форму смены пароля. Я исправлю свой ответ в ближайшее время.
Sk8erPeter
2
@SMTF: как я и обещал, я пересмотрел свой оригинальный пост и написал код с другим подходом: с использованием встроенных функций Drupal. Пожалуйста, попробуйте это тоже. Спасибо!
Вот другой подход.
В моем примере я рендерим встроенные
user_profile_form()
и просто сбрасываю ненужные поля. Это хорошо, потому что таким образом вызываются собственные функции проверки в Drupal, также отображается индикатор надежности пароля и соответствия пароля на основе JavaScript, а метки и описания полей такие же, как в форме редактирования пользователя (за исключением того, что здесь я вынул e -почта изменения текста), но вы также можете изменить их, если хотите.Результат будет выглядеть так:
( Полный экран )
Эта форма будет видна по
example.com/change-password
пути (конечно,example.com
ее следует заменить вашим доменом), и я также определю для нее блок.Конечно, замените
YOURMODULENAME
своим именем модуля (даже рядом'page callback'
и при вызовеdrupal_get_form
)! Вы также можете сбросить другие поля, если это необходимо (например, дополнительные поля отображаются с помощью другого модуля).Очистите кеш после помещения его в ваш код.
После этого Вы можете просто сделать эту форму, позвонив
drupal_get_form('YOURMODULENAME_render_user_pass_change_form');
.источник