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.
/**
* 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 YOURMODULENAME
pelo 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');
.