Apakah ada cara untuk mengizinkan karakter khusus dalam nama pengguna seperti "#" dan "~"?
Apakah ada cara untuk mengizinkan karakter khusus dalam nama pengguna seperti "#" dan "~"?
Jawaban:
Anda harus mengganti defualt user_validate_name ($ name) :
Verify the syntax of the given name.
Untuk melakukannya, tentukan kode validasi nama pengguna Anda dalam modul khusus Anda
function MODULENAME_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'user_register') {
$form['#validate'] = array();
$form['#validate'][] = 'registration_username_validate';
}
}
Dan di dalam fungsi registration_username_validate lakukan logika Anda untuk memungkinkan karakter khusus Anda.
Peduli tentang masalah keamanan yang disebabkan oleh mengizinkan karakter khusus di nama pengguna dan tentang masalah tampilan yang tidak membersihkan nama pengguna dapat menyebabkan tema.
user_account_form_validate
fungsi default yang memvalidasi lebih dari sekadar nama pengguna. Mengganti ini bisa membuat nama pengguna duplikat! Saya telah menambahkan jawaban yang mengatasi masalah ini.
Sayangnya, tidak ada jalan lurus ke depan untuk melakukan ini. Secara default user_register_form
dan user_profile_form
telah user_account_form_validate
ditetapkan sebagai validator pertama mereka di $form['#validate']
. user_account_form_validate()
memeriksa dan membersihkan nama, email, dan tanda tangan akun. Sebagai bagian dari memeriksa nama itu membuat panggilan ke user_validate_name()
. Ini adalah fungsi yang ingin kita timpa, bukan user_account_form_validate
.
Orang akan berharap untuk mendapatkan kait yang bermanfaat untuk menimpanya, tetapi sayang sekali. Jika saya tidak peduli tentang validasi email dan tanda tangan serta cek untuk melihat apakah nama adalah duplikat, saya hanya bisa menghapus user_account_form_validate
dari
$form['#validate']
. Tapi itu tidak baik. Sebagai gantinya, saya menambahkan validator tambahan yang membatalkan pekerjaan user_validate_name()
dan mengulang semuanya tanpa pemeriksaan karakter khusus.
<?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);
}
Masih ada pemeriksaan karakter khusus, namun hanya memeriksa karakter penggunaan tidak terlihat atau khusus.
$form['#validate'] = array();
akan mengalahkan setiap penangan yang valid yang ada, termasuk yang berpotensi diatur oleh modul contrib / custom lainnya. Lebih baik selektif membatalkan fungsi validasi ditimpa.