Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
CRAP | |
100.00% |
8 / 8 |
PasswordConfirm | |
100.00% |
1 / 1 |
|
100.00% |
4 / 4 |
16 | |
100.00% |
8 / 8 |
getInfo | |
100.00% |
1 / 1 |
1 | |
100.00% |
0 / 0 |
|||
valueCallback | |
100.00% |
1 / 1 |
5 | |
100.00% |
8 / 8 |
|||
processPasswordConfirm | |
100.00% |
1 / 1 |
4 | |
100.00% |
0 / 0 |
|||
validatePasswordConfirm | |
100.00% |
1 / 1 |
6 | |
100.00% |
0 / 0 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\Render\Element\PasswordConfirm. | |
*/ | |
namespace Drupal\Core\Render\Element; | |
use Drupal\Core\Form\FormStateInterface; | |
/** | |
* Provides a form element for double-input of passwords. | |
* | |
* Formats as a pair of password fields, which do not validate unless the two | |
* entered passwords match. | |
* | |
* Usage example: | |
* @code | |
* $form['pass'] = array( | |
* '#type' => 'password_confirm', | |
* '#title' => t('Password'), | |
* '#size' => 25, | |
* ); | |
* @endcode | |
* | |
* @see \Drupal\Core\Render\Element\Password | |
* | |
* @FormElement("password_confirm") | |
*/ | |
class PasswordConfirm extends FormElement { | |
/** | |
* {@inheritdoc} | |
*/ | |
public function getInfo() { | |
$class = get_class($this); | |
return array( | |
'#input' => TRUE, | |
'#markup' => '', | |
'#process' => array( | |
array($class, 'processPasswordConfirm'), | |
), | |
'#theme_wrappers' => array('form_element'), | |
); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public static function valueCallback(&$element, $input, FormStateInterface $form_state) { | |
if ($input === FALSE) { | |
$element += ['#default_value' => []]; | |
return $element['#default_value'] + ['pass1' => '', 'pass2' => '']; | |
} | |
$value = ['pass1' => '', 'pass2' => '']; | |
// Throw out all invalid array keys; we only allow pass1 and pass2. | |
foreach ($value as $allowed_key => $default) { | |
// These should be strings, but allow other scalars since they might be | |
// valid input in programmatic form submissions. Any nested array values | |
// are ignored. | |
if (isset($input[$allowed_key]) && is_scalar($input[$allowed_key])) { | |
$value[$allowed_key] = (string) $input[$allowed_key]; | |
} | |
} | |
return $value; | |
} | |
/** | |
* Expand a password_confirm field into two text boxes. | |
*/ | |
public static function processPasswordConfirm(&$element, FormStateInterface $form_state, &$complete_form) { | |
$element['pass1'] = array( | |
'#type' => 'password', | |
'#title' => t('Password'), | |
'#value' => empty($element['#value']) ? NULL : $element['#value']['pass1'], | |
'#required' => $element['#required'], | |
'#attributes' => array('class' => array('password-field', 'js-password-field')), | |
'#error_no_message' => TRUE, | |
); | |
$element['pass2'] = array( | |
'#type' => 'password', | |
'#title' => 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, | |
); | |
$element['#element_validate'] = array(array(get_called_class(), 'validatePasswordConfirm')); | |
$element['#tree'] = TRUE; | |
if (isset($element['#size'])) { | |
$element['pass1']['#size'] = $element['pass2']['#size'] = $element['#size']; | |
} | |
return $element; | |
} | |
/** | |
* Validates a password_confirm element. | |
*/ | |
public static function validatePasswordConfirm(&$element, FormStateInterface $form_state, &$complete_form) { | |
$pass1 = trim($element['pass1']['#value']); | |
$pass2 = trim($element['pass2']['#value']); | |
if (strlen($pass1) > 0 || strlen($pass2) > 0) { | |
if (strcmp($pass1, $pass2)) { | |
$form_state->setError($element, t('The specified passwords do not match.')); | |
} | |
} | |
elseif ($element['#required'] && $form_state->getUserInput()) { | |
$form_state->setError($element, t('Password field is required.')); | |
} | |
// Password field must be converted from a two-element array into a single | |
// string regardless of validation results. | |
$form_state->setValueForElement($element['pass1'], NULL); | |
$form_state->setValueForElement($element['pass2'], NULL); | |
$form_state->setValueForElement($element, $pass1); | |
return $element; | |
} | |
} |