Aquí hay otro enfoque.
En mi ejemplo, renderizo el incorporado user_profile_form()
y simplemente desarmo los campos innecesarios. Es bueno porque de esta manera se invocan las funciones de validación de Drupal, también se representa la fortaleza de la contraseña basada en JavaScript y el indicador de coincidencia de contraseña, y las etiquetas y descripciones de los campos son las mismas que en el formulario de edición del usuario (excepto que aquí saqué el e -mail cambiando el texto), pero también puede cambiarlos, si lo desea.
El resultado se verá así:
( Pantalla completa )
Este formulario será visible en la example.com/change-password
ruta (por supuesto, example.com
debe ser sustituido por su dominio), y también definiré un bloque para él.
/**
* 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;
}
¡Por supuesto, sustituya YOURMODULENAME
con el nombre de su propio módulo (incluso cerca 'page callback'
y cuando llame drupal_get_form
)! También puede desactivar otros campos si es necesario (por ejemplo, se representan más campos a través de otro módulo).
Borre el caché después de ponerlo en su código.
Después de esto, simplemente puede representar este formulario llamando drupal_get_form('YOURMODULENAME_render_user_pass_change_form');
.