diff --git a/core/lib/Drupal/Core/Render/Element/PasswordConfirm.php b/core/lib/Drupal/Core/Render/Element/PasswordConfirm.php index 00295d5..82f1468 100644 --- a/core/lib/Drupal/Core/Render/Element/PasswordConfirm.php +++ b/core/lib/Drupal/Core/Render/Element/PasswordConfirm.php @@ -19,7 +19,7 @@ * @code * $form['pass'] = array( * '#type' => 'password_confirm', - * '#title' => t('Password'), + * '#title1' => t('New password'), * '#size' => 25, * ); * @endcode @@ -72,7 +72,7 @@ public static function valueCallback(&$element, $input, FormStateInterface $form public static function processPasswordConfirm(&$element, FormStateInterface $form_state, &$complete_form) { $element['pass1'] = array( '#type' => 'password', - '#title' => t('Password'), + '#title' => !empty($element['#title1']) ? $element['#title1'] : t('Password'), '#value' => empty($element['#value']) ? NULL : $element['#value']['pass1'], '#required' => $element['#required'], '#attributes' => array('class' => array('password-field', 'js-password-field')), @@ -80,11 +80,16 @@ public static function processPasswordConfirm(&$element, FormStateInterface $for ); $element['pass2'] = array( '#type' => 'password', - '#title' => t('Confirm password'), + '#title' => !empty($element['#title2']) ? $element['#title2'] : t('Confirm password'), '#value' => empty($element['#value']) ? NULL : $element['#value']['pass2'], '#required' => $element['#required'], '#attributes' => array('class' => array('password-confirm', 'js-password-confirm')), '#error_no_message' => TRUE, + '#states' => array( + 'visible' => array( + ':input[name="pass[pass1]"]' => ['filled' => TRUE], + ), + ), ); $element['#element_validate'] = array(array(get_called_class(), 'validatePasswordConfirm')); $element['#tree'] = TRUE; diff --git a/core/modules/user/src/AccountForm.php b/core/modules/user/src/AccountForm.php index 8b0149e..ffe5b08 100644 --- a/core/modules/user/src/AccountForm.php +++ b/core/modules/user/src/AccountForm.php @@ -120,8 +120,11 @@ public function form(array $form, FormStateInterface $form_state) { if (!$register) { $form['account']['pass'] = array( '#type' => 'password_confirm', + '#prefix' => '

' . $this->t('Change password') . '

', + '#title1' => $this->t('New password'), + '#title2' => $this->t('Confirm new password'), '#size' => 25, - '#description' => $this->t('To change the current user password, enter the new password in both fields.'), + '#description' => $this->t('To change the current user password, enter the new password.'), ); // To skip the current password field, the user must have logged in via a @@ -150,11 +153,18 @@ public function form(array $form, FormStateInterface $form_state) { // The user may only change their own password without their current // password if they logged in via a one-time login link. if (!$form_state->get('user_pass_reset')) { - $form['account']['current_pass']['#description'] = $this->t('Required if you want to change the %mail or %pass below. Reset your password.', array( + $form['account']['current_pass']['#description'] = $this->t('Confirm your current password to change the %mail or %pass above. Reset your password.', array( '%mail' => $form['account']['mail']['#title'], - '%pass' => $this->t('Password'), + '%pass' => $this->t('New password'), ':request_new_url' => $this->url('user.pass'), )); + $form['account']['current_pass']['#states'] = [ + // Only show this field when mail or new password has changed. + 'visible' => [ + [':input[name="mail"]' => ['!value' => $account->getEmail()]], + [':input[name="pass[pass1]"]' => ['filled' => TRUE]], + ], + ]; } } } diff --git a/core/modules/user/src/Tests/UserEditTest.php b/core/modules/user/src/Tests/UserEditTest.php index 07daeca..18cc860 100644 --- a/core/modules/user/src/Tests/UserEditTest.php +++ b/core/modules/user/src/Tests/UserEditTest.php @@ -47,7 +47,7 @@ function testUserEdit() { $edit = array(); $edit['mail'] = $this->randomMachineName() . '@new.example.com'; $this->drupalPostForm("user/" . $user1->id() . "/edit", $edit, t('Save')); - $this->assertRaw(t("Your current password is missing or incorrect; it's required to change the %name.", array('%name' => t('Email')))); + $this->assertRaw(t("Your current password is missing or incorrect; it's required to change the %name.", array('%name' => 'Email'))); $edit['current_pass'] = $user1->pass_raw; $this->drupalPostForm("user/" . $user1->id() . "/edit", $edit, t('Save')); @@ -58,7 +58,7 @@ function testUserEdit() { $edit['pass[pass1]'] = $new_pass = $this->randomMachineName(); $edit['pass[pass2]'] = $new_pass; $this->drupalPostForm("user/" . $user1->id() . "/edit", $edit, t('Save')); - $this->assertRaw(t("Your current password is missing or incorrect; it's required to change the %name.", array('%name' => t('Password')))); + $this->assertRaw(t("Your current password is missing or incorrect; it's required to change the %name.", array('%name' => 'Password'))); // Try again with the current password. $edit['current_pass'] = $user1->pass_raw; diff --git a/core/modules/user/src/Tests/UserPasswordResetTest.php b/core/modules/user/src/Tests/UserPasswordResetTest.php index 420b97a..d62f35a 100644 --- a/core/modules/user/src/Tests/UserPasswordResetTest.php +++ b/core/modules/user/src/Tests/UserPasswordResetTest.php @@ -125,7 +125,7 @@ function testUserPasswordReset() { // Verify that the password reset session has been destroyed. $this->drupalPostForm(NULL, $edit, t('Save')); - $this->assertText(t('Your current password is missing or incorrect; it\'s required to change the Password.'), 'Password needed to make profile changes.'); + $this->assertRaw(t("Your current password is missing or incorrect; it's required to change the %name.", array('%name' => 'Password')), 'Password needed to make profile changes.'); // Log out, and try to log in again using the same one-time link. $this->drupalLogout();