Чи є якийсь спосіб дозволити спеціальний символ у імені користувача, наприклад "#" та "~"?
Чи є якийсь спосіб дозволити спеціальний символ у імені користувача, наприклад "#" та "~"?
Відповіді:
Ви повинні змінити значення defualt user_validate_name ($ name) :
Verify the syntax of the given name.
Для цього визначте код перевірки свого імені користувача у власному модулі
function MODULENAME_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'user_register') {
$form['#validate'] = array();
$form['#validate'][] = 'registration_username_validate';
}
}
А всередині функції реєстрації_користувача_валідайте виконайте свою логіку, щоб дозволити вашим спеціальним символам.
Будьте уважні до проблем безпеки, викликаних дозволом спеціальних символів в імені користувача, а також про проблеми з відображенням, не санітарними іменами користувачів, можуть викликати теми.
user_account_form_validateяка підтверджує більше, ніж просто ім'я користувача. Заміна цього може дозволити повторювані імена користувачів! Я додав відповідь, яка обіймає ці питання.
На жаль, прямого прямого способу це зробити не існує. За замовчуванням user_register_formі user_profile_formвже user_account_form_validateвстановлений в якості першого валідатора в $form['#validate']. user_account_form_validate()перевіряє та очищує ім’я, електронну пошту та підпис облікового запису. У рамках перевірки імені він телефонує user_validate_name(). Це функція, яку ми хочемо перекрити, а не user_account_form_validate.
Можна сподіватися на корисний гачок, який би його перекрив, але на жаль. Якщо я не піклувався про перевірку електронної пошти та підпису, а також перевірку, чи є ім'я дублікатом, я міг би просто зняти user_account_form_validateз
$form['#validate']. Але це не добре. Натомість я додаю додатковий валідатор, який скасовує роботу user_validate_name()та переробляє все без спеціальної перевірки символів.
<?php
function MODULENAME_form_user_register_form_alter(
array &$form, array &$form_state, $form_id)
{
MODULENAME_add_name_validator($form);
}
function MODULENAME_form_user_profile_form_alter(
array &$form, array &$form_state, $form_id)
{
MODULENAME_add_name_validator($form);
}
function MODULENAME_add_name_validator(array &$form)
{
$validate =& $form['#validate'];
# Since `validate_name()` clears out any errors for the "name" field, we
# want to put it right after the validator we want to partially override.
$acct_validate_index = array_search('user_account_form_validate', $validate);
array_splice($validate, ($acct_validate_index + 1), 0,
['MODULENAME_validate_name']
);
}
function MODULENAME_validate_name(array $form, array &$form_state)
{
# There is no blessed way of overriding the call to `user_validate_name()` in
# `user_account_form_validate()`.
$errors =& drupal_static('form_set_error', []);
# Yes, this gets the errors. `form_get_error()` uses this method so... yeah.
if (!isset($errors['name']))
# `user_validate_name()` is a superset of what is checked here. If the name
# passed that validation, no need to rerun things.
return;
# `form_set_error()` also calls `drupal_set_message()` if it finds an
# error.
$msg_index = array_search($errors['name'], $_SESSION['messages']['error']);
if ($msg_index !== false) {
unset($_SESSION['messages']['error'][$msg_index]);
if (empty($_SESSION['messages']['error']))
unset($_SESSION['messages']['error']);
}
unset($errors['name']);
$name = isset($form_state['values']['name'])
? $form_state['values']['name'] : null;
# These checks are taken from `user_validate_name()`, simply excluding the
# for characters we don't mind being in the names.
if (!$name)
$error = t('You must enter a username.');
else if (substr($name, 0, 1) == ' ')
$error = t('The username cannot begin with a space.');
else if (substr($name, -1) == ' ')
$error = t('The username cannot end with a space.');
else if (strpos($name, ' ') !== FALSE)
$error = t('The username cannot contain multiple spaces in a row.');
else if (preg_match('/[\x{80}-\x{A0}' . // Non-printable ISO-8859-1 + NBSP
'\x{AD}' . // Soft-hyphen
'\x{2000}-\x{200F}' . // Various space characters
'\x{2028}-\x{202F}' . // Bidirectional text overrides
'\x{205F}-\x{206F}' . // Various text hinting characters
'\x{FEFF}' . // Byte order mark
'\x{FF01}-\x{FF60}' . // Full-width latin
'\x{FFF9}-\x{FFFD}' . // Replacement characters
'\x{0}-\x{1F}]/u', // NULL byte and control characters
$name))
$error = t('The username contains an illegal character.');
else if (drupal_strlen($name) > USERNAME_MAX_LENGTH)
$error = t('The username %name is too long: it must be %max characters '
.'or less.'
,['%name' => $name, '%max' => USERNAME_MAX_LENGTH]);
if (isset($error))
form_set_error('name', $error);
}
Існує ще спеціальна перевірка символів, проте вона перевіряє лише невидимі або спеціальні символи використання.
$form['#validate'] = array();буде халатувати будь-які існуючі валідаційні обробники, включаючи потенційно ті, що встановлені іншими модулями contrib / custom. Краще вибірково зняти переопределену перевірку функції.